我一直在尝试使用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代码,它解决了这个问题,但我不明白为什么,而且我不知道如何修改它以便它能正常工作。
当我发现注释掉print语句解决了问题时,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不会让我回答我自己的问题,因为我在这里是新手......
编辑:
好的,我现在把它作为一个真正的答案发布了。
答案 0 :(得分:2)
问题解决了!
事实证明,这一直是浏览器的错误。我之前没有注意到这一点的原因是因为我在很久以前在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模板时。
答案 1 :(得分:1)
如果你发布更多代码会有所帮助,但“page”变量是否包含第二次执行电子邮件服务器的代码,或导致页面刷新会再次触发电子邮件。
答案 2 :(得分:0)
如果您使用空src或“#”作为src进行Javascript调用,则会发生同样的事情:
<script type="text/javascript" src="#"></script>
也许还有一个用于css链接的空href。我没有经历过这种情况,但我期待同样的行为。