通过python发送邮件

时间:2016-01-16 17:51:35

标签: python email smtp

我尝试安装和配置SMTP服务器。在我看来它发生了。当我从linux命令行发送测试邮件时,我会收到邮件,例如:

echo "Test mail from postfix4" | mail -s "Test Postfix4" test@gmail.com

但是当我试图通过python做同样的事情时我得到了错误:

>>> from email.MIMEText import MIMEText
>>> import smtplib
>>> sender = 'test@mail.com'
>>> to = 'test@gmail.com'
>>> subj = "atata"
>>> body = "ololo"
>>> server = 'hostname'
>>> msg = MIMEText(body, 'plain', 'utf-8')
>>> msg['Subject'] = subj
>>> msg['To'] = to
>>> msg['Importance'] = 'high'
>>> s = smtplib.SMTP(server)
>>> s.sendmail(sender, [to], msg.as_string())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/smtplib.py", line 742, in sendmail
    raise SMTPRecipientsRefused(senderrs)
smtplib.SMTPRecipientsRefused: {'test@gmail.com': (454, '4.7.1 <test@gmail.com>: Relay access denied')}
>>> s.quit()
(221, '2.0.0 Bye')

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

我提出了类似的问题here:特别要注意的是,在命令行上调用mail命令与使用SMTP.sendmail()中的smtplib有明显不同:

  • mail命令绕过SMTP,而不是在本地注入邮件。机器通常配置为根据其邮件配置对注入的电子邮件进行明智的处理。在您已经描述的设置中,您可以认为这是邮件服务器的后门(此处为Postfix):它不需要SMTP即可将邮件存储在Postfix中; Postfix从那里接管。

  • 相比之下,
  • SMTP.sendmail()没有后门访问权限,而是您的Python程序正在与本地计算机(localhost上的Postfix建立SMTP连接:Postfix设置需要说服此传入的SMTP连接足够可靠,可以接受它,然后对邮件进行一些有用的操作。这通常是通过让您的Python程序进行身份验证(请参见上面问题的server.login()注释)和/或使用其他端口/服务:“邮件提交”(通常在端口587上)和/或使用松懈的Postfix配置,它接受任何内容-或任何可能源自localhost的内容。

还应注意的是,您看到的错误消息4.7.1 <test@gmail.com>: Relay access denied'将来自您的本地系统,而不是Gmail。

对于这样的问题,了解什么是“邮件中继”确实非常有用,并且要非常了解任何错误消息来自哪台计算机:如果您认为错误消息是很容易的,那么在这里很容易跳到错误的结论来自远程系统。