“ascii”编解码器无法对位置 10 中的字符“\xe9”进行编码:序号不在范围(128)中

问题描述 投票:0回答:2

我正在尝试在 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)
python email unicode smtp smtplib
2个回答
0
投票

问题在于,电子邮件互联网协议早在字符集倾向于稳定使用 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


0
投票

我也遇到了类似的问题并环顾四周。 我最后用的就是这个。 添加此功能

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))
© www.soinside.com 2019 - 2024. All rights reserved.