我一直在尝试使用 Python CGI 脚本发送电子邮件(托管在商业网络主机 - 123reg),问题是每当我从我的网络浏览器运行脚本时,它都会发送两个相同的电子邮件 -邮件。
发送邮件的代码肯定只执行一次,没有循环可能导致它发生两次,我绝对不会点击按钮两次。没有异常抛出,“成功”页面正常发送到浏览器。
最奇怪的是,当我注释掉打印结果页面的代码时(这很简单,没有副作用,连续3个打印语句)并用一个虚拟打印语句(打印“内容-type: text/plain\n\ntest"), 它工作正常并且只发送一封电子邮件。
我已经尝试用谷歌搜索这个问题,但无济于事。
我无计可施,因为这个问题对我来说没有任何意义。我很确定这一定是我的脚本,因为当您注释掉那些打印语句时,它会莫名其妙地起作用。
如果有任何帮助,我将不胜感激。
编辑:
这是注释掉后解决问题的代码:
print "Content-type: text/html"
print
print page
编辑:
发送邮件的代码:
#send_email function: sends message from from_addr, assumes valid input
def send_email(from_addr, message):
#form the email headers/text:
email = "From: " + from_addr + "\n"
email += "To: " + TO[0] + "\n"
email += "Subject: " + SUBJECT + "\n"
email += "\n"
email += message
#return true for success, false for failure:
try:
server = smtplib.SMTP(SERVER)
server.sendmail(from_addr, TO, email)
server.quit()
return True;
except smtplib.SMTPException:
return False;
#end of send_email function
我会发布代码来格式化页面变量,但它所做的只是从文件中读取、格式化字符串并返回字符串。没有什么不寻常的事情发生。
编辑
好的,我把create_page函数中的文件IO代码注释掉了,问题解决了,但是我不明白为什么,也不知道怎么修改才能正常工作。
当我发现注释掉打印语句解决了问题时,create_page 函数以及文件 IO 仍在执行。
这是我注释掉之前的文件 IO 代码(它在 create_page 函数的最开始,函数的其余部分只是修改页面字符串,然后返回它):
#read the template from the file:
frame_f = open(FRAME)
page = frame_f.read()
frame_f.close()
编辑:
我刚刚通过将文件文本直接复制并粘贴到源文件中的字符串来替换文件 IO,因此不再有任何文件 IO。这仍然没有解决问题。在这一点上,我唯一的理论是计算机讨厌我......
编辑:
我必须在这里发布这个,因为 stackoverflow 不会让我回答我自己的问题,因为我是这里的新手...
编辑:
好的,我现在将其发布为实际答案。
请您参考如下方法:
问题解决了!
事实证明,这一直是浏览器的错。我没有早点注意到这一点的原因是因为我很久以前就在 Firefox 和 Chrome 中测试过它以排除浏览器的可能性,但事实证明 Chrome 和 Firefox 都有同样的错误。
当服务器日志最终更新时,我意识到发生了什么,我意识到 GET 请求通常会立即(1 秒后)跟在另一个 GET 请求之后。我做了一些谷歌搜索,发现了这个:
What causes Firefox to make a GET request after submitting a form via the POST method?
事实证明,如果您有一个带有空 src 属性的 img 标签,例如
<img src=""/>
(我有一些 javascript 修改了那个标签),Firefox 将发送一个重复的 GET 请求来代替对图像的请求。事实证明,Chrome 也有同样的问题。这也解释了为什么问题只在我尝试包含我的 html 模板时发生。
