为什么Python通过SMTP包发送空主体?
我在用 smtplib 这个库来用Python发送邮件。
我有以下这段代码:
import smtplib
# Credentials (if needed)
username = 'SECRET'
password = 'SECRET'
# The actual mail send
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo();
server.starttls()
server.login(username,password)
# and in some function...
body = self.getVer()
body += "\n"
print body
server.sendmail(fromAddress, toAddresses, body)
控制台打印了一些内容(所以 body
不是空的..),而且我收到了邮件。但邮件是空的,内容没有发送过去。
这是什么原因,我该怎么解决呢?
相关问题:
1 个回答
4
你应该在你的正文开头加一个换行。
否则,正文的第一行到第一个空行之间的内容会被当作标题来处理。
body = "\r\n"
body += self.getVer()
请注意,根据RFC2821的第4.1.1.4节:
只接受以逗号结尾的行,这种做法是为了适应一些UNIX系统的不规范行为,但这实际上造成了更多的兼容性问题,而不是解决它们。因此,SMTP服务器系统绝对不能这样做,即使是为了提高稳定性。
我理解的反面观点是,客户端必须使用<CR><LF>
来表示行的结束,而不能仅仅使用<LF>
。
此外,正如Simon Callan所建议的,你应该仔细查看一下email模块。
最后,你应该交换ehlo
和starttls
这两行,以避免发送两次EHLO
:
server.starttls()
server.ehlo();