尝试使用python发送电子邮件时遇到问题

时间:2010-06-09 08:02:28

标签: python smtp

我写了这样的代码

import smtplib
server=smtplib.SMTP('localhost')

然后它引发了一个错误,如

  

错误:[Errno 10061]无法建立连接,因为目标计算机主动拒绝它

我是SMTP新手,你能告诉我究竟是什么问题吗?

3 个答案:

答案 0 :(得分:2)

听起来您没有在尝试此操作的计算机上设置SMTP。尝试使用ISP的邮件服务器(通常是mail.example.com)或确保在本地安装了SMTP服务器。

答案 1 :(得分:2)

您可以在控制台上设置简单的smtp服务器,而不是尝试在本地安装smtp库。

这样做:

python -m smtpd -n -c DebuggingServer localhost:1025

所有邮件都将打印到控制台。

答案 2 :(得分:0)

要使用Python SMTP模块发送电子邮件,您需要以某种方式获取有效邮件交换器(MX)的名称。这可能是您自己的本地中心或智能中继,也可以查询DNS以获取每个目标主机/域名的公共MX记录。

这个要求在文档中被掩盖了。 Python标准库中的一个可怕的遗漏是它们没有提供一种简单的方法来查询DNS记录的DNS。 (还有相当不错的第三方Python DNS库,例如DNSPythonPyDNS,它们支持更多DNS,而不是与电子邮件相关的所有DNS。

通常,您最好使用自己网络(或ISP)的集线器或中继列表。这是因为您直接向已发布的MX主机发送邮件的努力可能会与各种打击垃圾邮件的尝试相冲突。 (例如,在咖啡店,酒店以及普通家用电缆和DSL连接中的无线网络中经常无法实现;大多数地址范围在各种数据库中列为潜在的垃圾邮件类型)。在这种情况下,您可以通过任何您喜欢的方式存储和/或检索本地邮件中心(或智能中继)的名称/地址。它可能是一个.cfg文件(ConfigParser),或者通过LDAP或SQL查询,甚至是(脚本!)硬编码到脚本中。

但是,如果您的代码要在合适的网络上运行(例如在colo或数据中心),那么您必须自己制作MX分辨率。您可以安装上述PyPI包中的一个。如果您需要限制自己使用标准库,那么您可能可以依赖大多数Linux,MacOS X,Solaris,FreeBSD和其他精细操作系统安装中常用的dig实用程序。

在这种情况下,你会调用像dig +short aol.com mx | awk '{print $NF}'subprocess.Popen()这样的命令,这可以通过这个相当丑陋的单行来完成:

mxers = subprocess.Popen("dig +short %s mx | awk '{print $NF}'"
                         % target_domain, stdout=subprocess.PIPE,
                        shell=True).communicate()[0].split()

然后,您可以尝试与每个生成的主机名建立SMTP连接 转。 (只要您的“target_domain”值已经过充分清理,就可以了;不要通过Popen()通过shell=True传递不受信任的数据。

更安全的版本看起来更加毛茸茸:

mxers = subprocess.Popen(["dig", "+short", target_domain, "mx"], 
                         stdout=subprocess.PIPE).communicate()[0].split()[1::2]

...最后的切片/步幅正在取代对awk的调用,从而避免了这种情况 需要shell=True