2013-02-19 110 views
0
import smtplib 

fromaddress = '[email protected]' 
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) 

此代码打开一个套接字确定,但然后在发送失败与'连接意外关闭'错误的sendmail。从查看smtplib source这发生在从smtp服务器返回空响应时。蟒蛇smtplib sendmail失败

我从上面的代码中错过了什么?我正在廉价的webhost上运行这个脚本作为cgi脚本,作为他们服务的一部分,他们安装了sendmail和python服务。在他们的文档中,他们有标准的“在php中发送电子邮件”的代码示例,不需要认证,所以我假设python应该也是一样。

任何人有任何见解?主机是hostgator,如果有帮助的话。

编辑:

底层误差是SMTP服务器发出一个硬“由对等连接复位”复位即TCP。在什么情况下电子邮件服务器会这样做?

+0

如果认为是垃圾邮件它可能关闭连接。例如,如果发件人地址确实是“[email protected]”。或者你可能连接到错误的SMTP服务器。检查HELO交换并确认你有合适的服务器。 “mydomain.com”是否解析为指向hostgator的smtp服务器的A记录?最后,尝试使用telnet并手动运行SMTP协议。也许你会注意到一个有意义的错误信息。 – 2013-02-19 22:32:31

+0

没有telnet访问:( – user1561108 2013-02-19 22:50:45

+0

你不需要Telnet访问你的服务器,你只需要任何类型的shell访问。一旦你登录你的服务器,*然后*你运行“telnet mydomain.com 25”。 – 2013-02-19 22:51:44

回答

2

我认为toaddress应该是一个列表。

fromaddress = '[email protected]' 
toaddress = [fromaddress] 
+1

,我相信标题和正文之间应该有一个空行(即在“Subject:..”行后)。 – isedev 2013-02-19 21:51:59

+0

感谢球员,做出了这两个改变,但仍然是同样的问题 – user1561108 2013-02-19 22:03:51

2

您试图通过SMTP发送邮件,这通常是通过某种身份验证(用户名+密码)实现的。如果您没有进行身份验证(或您的IP地址在给定时间间隔内失败了多次验证失败),大多数SMTP服务器将立即终止连接。

通过调用smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]),您试图打开与mydomain.com的连接。大多数虚拟主机将具有与shell系统分离的集中式邮件系统(SMTP/IMAP)。

我还没有在一段时间(或在Python下使用SMTP)调试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")