Python SMTP 库需要 SMTPUTF8 用于地址显示名称中的非 ASCII 字符

Python SMTP lib required SMTPUTF8 for non-ASCI characters in from adress display name

我正在使用 python 的 smtplip 发送电子邮件。除了我在来自地址的消息中使用非 ASCI 字符时,所有 id 都工作正常。

我正在使用 python 3.5.

即使使用非 ASCI 收件人和主题也能正常工作:

import smtplib

from email.message import EmailMessage
from email.headerregistry import Addressmsg = EmailMessage()

msg['Subject'] = "Subject with non-asci chars like á"
msg['From'] = Address("Foo Bar", "foo.bar", "example.cz")
msg['To'] = (Address("Fóó Bár", "foo.bar", "example.cz"),

当我尝试像这样使用非 ASCI 时萌芽:

msg['Subject'] = "Subject with non-asci chars like á"
msg['From'] = Address("Fóó Bár", "foo.bar", "example.cz")
msg['To'] = (Address("Fóó Bár", "foo.bar", "example.cz"),

以上均发送:

with smtplib.SMTP('localhost') as s:
        s.send_message(msg)

我遇到了这个异常:

smtplib.SMTPNotSupportedError: One or more source or delivery addresses require internationalized email support, but the server does not advertise the required SMTPUTF8 capability`

我知道这是由我们的 smtp 服务器不支持 SMTPUTF8 引起的,但仅从非 ASCI 显示名称来看,这应该不是必需的。

我假设您尝试使用 smtplib.send_message。看起来它太聪明了,想要控制服务器是否会正确处理 utf8,即使在您的用例中没有必要。

你只需要恢复到原来的状态 smtplib.sendmail:

serv = smtplib.SMTP(mailhost)
serv.sendmail(msg['From'], msg['To'], msg.as_string())

如果您想使用 send_message,您仍然可以通过将发件人地址传递给 send_message 函数来绕过那些讨厌的 utf8 检查。

with smtplib.SMTP('localhost') as s:
    s.send_message(msg,'foo.bar@example.cz')

我通过先发送 'ehlo()' 来欺骗 send_message 库,然后手动修改功能:

s = smtplib.SMTP(server)
s.ehlo()
s.esmtp_features["smtputf8"] = ""
s.send_message(msg)

我还更改了消息政策,因为我遇到了其他问题:

msg = MIMEMultipart(policy=SMTPUTF8)

希望对您有所帮助! (这仅在您的服务器与 UTF8 兼容但不使用 ehlo 应答时才有效)