python smtplib 发送邮件失败
import smtplib
fromaddress = 'me@example.com'
toaddress = [fromaddress]
message = """
From: %s
To: %s
Subject: test
Hello
Goodbye
""" % ( fromaddress, toaddress)
server = smtplib.SMTP('mydomain.com')
server.set_debuglevel(1)
server.sendmail(fromaddress, toaddress, message)
这段代码可以正常打开一个连接,但在发送邮件时却出现了“连接意外关闭”的错误。根据查看smtplib的源代码,这个错误发生在SMTP服务器返回了一个空的响应。
我在这段代码中漏掉了什么呢?我是在一个便宜的网络主机上运行这个代码,作为一个CGI脚本,他们的服务里已经安装了sendmail和Python服务。在他们的文档中,有一个标准的“用PHP发送邮件”的代码示例,不需要身份验证,所以我想用Python也应该可以这样做。
有没有人能给点建议?这个主机是hostgator,如果有帮助的话。
编辑:
根本的错误是SMTP服务器发出了一个强制重置,也就是TCP的“连接被对方重置”。在什么情况下邮件服务器会这样做呢?
2 个回答
我觉得toaddress应该是一个列表。
fromaddress = 'me@example.com'
toaddress = [fromaddress]
你正在尝试通过SMTP发送邮件,这通常需要一些认证,比如用户名和密码。如果你不进行认证,或者你的IP地址在短时间内认证失败太多次,大多数SMTP服务器会立即断开连接。
通过调用 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
,你是在尝试连接到 mydomain.com
。大多数网络托管服务会有一个集中管理的邮件系统(SMTP / IMAP),这个系统和其他服务是分开的。
我有一段时间没有调试SMTP的东西了(或者在Python下使用SMTP),但你可以通过进入你的网络托管服务,使用 telnet mydomain.com 25
来看看SMTP服务器是否愿意接受你的连接,或者它是否根本不理你。
你也可以尝试在你的网络托管服务上运行 phpinfo(),看看他们是否有任何特别的SMTP认证功能。
除此之外,我建议你尝试将消息通过sendmail(兼容)程序发送,让服务器来处理SMTP。
大概会像这样……
p= os.popen( "/usr/sbin/sendmail -t -i -f" , "w" )
p.write(message)
status = p.close()
if status :
raise RuntimeError("Could not excecute sendmail properly")