为什么Python通过SMTP包发送空主体?

2 投票
1 回答
912 浏览
提问于 2025-04-18 18:21

我在用 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模块。


最后,你应该交换ehlostarttls这两行,以避免发送两次EHLO

server.starttls()
server.ehlo();

撰写回答