我尝试安装和配置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')
有人可以帮我吗?
答案 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。
对于这样的问题,了解什么是“邮件中继”确实非常有用,并且要非常了解任何错误消息来自哪台计算机:如果您认为错误消息是很容易的,那么在这里很容易跳到错误的结论来自远程系统。