我正在尝试在 python 中使用 smtp 制作一个程序,以便用它发送电子邮件,但它总是向我部署此错误 'ascii' 编解码器无法对位置 10 中的字符 '\xe9' 进行编码:序数不在范围内(128 ),我真的不知道如何解决它。这是我的代码,如果有人知道请解释一下。
from email.message import EmailMessage
import smtplib
remitente = "email_sender"
destinatario = "email_receiver
"
mensaje = "¡Hola, mundo!"
email = EmailMessage()
email["From"] = remitente
email["To"] = destinatario
email["Subject"] = "Correo de prueba"
email.set_content(mensaje)
smtp = smtplib.SMTP("smtp-mail.outlook.com", port=587)
smtp.starttls()
smtp.login(remitente, "password")
smtp.sendmail(remitente, destinatario, email.as_string())
smtp.quit()
我尝试了来自不同网站的不同程序,但每个人都单一一次,这给我带来了这个问题。即使我尝试更改或查找任何可能导致问题的原因,但即使如此,此错误仍然存在。
这是回溯:
Traceback (most recent call last):
File "c:\Users\bilel\Desktop\Correos\correo.py", line 12, in <module>
smtp.starttls()
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2032.0_x64__qbz5n2kfra8p0\Lib\smtplib.py", line 769, in starttls
self.ehlo_or_helo_if_needed()
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2032.0_x64__qbz5n2kfra8p0\Lib\smtplib.py", line 611, in ehlo_or_helo_if_needed
if not (200 <= self.ehlo()[0] <= 299):
^^^^^^^^^^^
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2032.0_x64__qbz5n2kfra8p0\Lib\smtplib.py", line 451, in ehlo
self.putcmd(self.ehlo_msg, name or self.local_hostname)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2032.0_x64__qbz5n2kfra8p0\Lib\smtplib.py", line 378, in putcmd
self.send(f'{s}{CRLF}')
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2032.0_x64__qbz5n2kfra8p0\Lib\smtplib.py", line 357, in send
s = s.encode(self.command_encoding)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 10: ordinal not in range(128)
问题在于,电子邮件互联网协议早在字符集倾向于稳定使用 UTF-8 编码非 ASCII 字符之前就开始并发展了。
实际上,到目前为止,电子邮件基础设施中许多参数的默认设置是仅允许消息中使用 7 位字符。
Python 确实实现了完全有效的电子邮件处理类和实用程序,正如您正在挖掘的那样,因此,在尝试发送任何非 ASCII 字符时必须明确。
在您的示例代码中,有“¡”字符 - 尽管错误消息表明您在其他地方使用“é”(在 latin-1 中编码为“\xe9”,Windows 使用的字符集)。
尽管如此,Python 3.6 合并了一些默认值,这些默认值应该允许任何文本包含在电子邮件正文和标头中,并且应该将它们编码为 utf-8(和其他层),如最新 RFC 中所述 -
尝试在创建 EmailMessage 对象时添加显式策略:
...
from email import policy
...
email = EmailMessage(policy=policy.SMTPUTF8)
...
# remainder code can be kept as is
如果这不起作用,你必须自己检查 Python 电子邮件包的文档,看看那里有什么可以用的: https://docs.python.org/3/library/email.policy.html#module-email.policy
我也遇到了类似的问题并环顾四周。 我最后用的就是这个。 添加此功能
def asciicon(nonascii):
if nonascii.isascii() is False:
# def remove_non_ascii(text):
return ''.join(i for i in nonascii if ord(i) < 128)
else:
return nonascii
#And add the function to this line
email.set_content(asciicon(mensaje))