当前位置: 首页 > 面试题库 >

python中的smtplib.server.sendmail函数引发UnicodeEncodeError:'ascii'编解码器无法编码字符

江航
2023-03-14
问题内容

我正在尝试编辑文本文件,然后使用python脚本将其作为电子邮件正文发送,但是我收到了unicode编码错误。经过一番研究后,我发现使用.encode(’utf-8’)方法的解决方案,但这对我没有用,因为sendmail()方法仅发送字符串

这是Im使用的python代码片段:

irtem = open('irtemplate.txt')
data = irtem.read().replace('(name)', eng_name).replace('(customer)', 
cu_name).replace('(sr)', SR_num).replace('(problem)', 
prob_description).replace('(email)', eng_email).replace('(details)', 
details_req).replace('(tele)', eng_tele)


message_text = data
message = "From: %s\r\n" % fromaddr + "To: %s\r\n" % toaddr + "CC: 
%s\r\n" % ",".join(cc) + "Subject: %s\r\n" % message_subject + "\r\n" + 
message_text
toaddrs = [toaddr] + cc + bcc
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, message)
server.quit()

追溯:

Traceback (most recent call last):
File "autoIR.py", line 39, in <module>
server.sendmail(fromaddr, toaddrs, message)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py", line 855, in sendmail
msg = _fix_eols(msg).encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in 
position 168: ordinal not in range(128)

问题答案:

smtplib.server的sendmail方法需要一个bytes实例;如果获取到,str则尝试将其编码为ASCII,UnicodeEncodeError如果str包含任何非ASCII字符,则生成。

您可以通过自己编码消息来解决此问题:

>>> msg = 'Hello Wørld'
>>> from_ = 'a@example.com'
>>> to_ = 'b@example.com'
>>> subject = 'Hello'

>>> fmt = 'From: {}\r\nTo: {}\r\nSubject: {}\r\n{}'

>>> server.sendmail(to_, from_, fmt.format(to_, from_, subject, msg).encode('utf-8'))
{}

这将发送此消息*:

b'From: b@example.com'
b'To: a@example.com'
b'Subject: Hello'
b'Hello W\xc3\xb8rld'

但是,如果您想随消息发送非文本二进制数据,则此解决方法将不起作用。

更好的解决方案是使用电子邮件包中的EmailMessage类。

>>> from email.message import EmailMessage
>>> em = EmailMessage()
>>> em.set_content(fmt.format(to_, from_, subject, msg))
>>> em['To'] = to_
>>> em['From'] = from_
>>> em['Subject'] = subject

>>> # NB call the server's *send_message* method
>>> server.send_message(em)
{}

这发送此消息;请注意额外的标头,告诉接收者所使用的编码:

b'Content-Type: text/plain; charset="utf-8"'
b'Content-Transfer-Encoding: 8bit'
b'MIME-Version: 1.0'
b'To: b@example.com'
b'From: a@example.com'
b'Subject: Hello'
b'X-Peer: ::1'
b''
b'From: b@example.com'
b'To: a@example.com'
b'Subject: Hello'
b'Hello W\xc3\xb8rld'

*python -m smtpd -n -c DebuggingServer localhost:1025在单独的终端中运行命令以捕获消息数据。



 类似资料:
  • 问题内容: 当上传具有非ASCII字符的文件时,出现UnicodeEncodeError: 我使用MySQL,nginx和FastCGI运行Django 1.2。 根据Django Trac数据库,这是已解决的问题,但是我仍然有问题。欢迎提供有关如何修复的任何建议。 编辑:这是我的图像字段: 问题答案: 在对此进行更多调查之后,我发现我尚未在我的主要Nginx配置文件中设置字符集: 通过添加以上内

  • 问题内容: 我正在尝试抓取一个网站,但这给我一个错误。 我正在使用以下代码: 我收到以下错误: 我该怎么做才能解决此问题? 问题答案: 我通过添加将其修复。 那意味着变成。

  • 问题内容: 当我尝试在数据库中插入外来字符时,可能是什么导致此错误? 而我该如何解决呢? 谢谢! 问题答案: 字符U + 201C左双引号在Latin-1(ISO-8859-1)编码中不存在。 这 是 目前在代码页1252(西欧)。这是Windows特定的编码,基于ISO-8859-1,但会将多余的字符放入0x80-0x9F范围内。代码页1252通常与ISO-8859-1混淆,这是一种令人烦恼但现

  • 问题内容: 我正在编写一个Python(Python 3.3)程序,以使用POST方法将一些数据发送到网页。通常在调试过程中,我会获取页面结果并使用print()功能将其显示在屏幕上。 代码是这样的: 该方法返回一个bytes编码页面的元素(格式正确的UTF-8文档),直到我停止使用Windows的IDLE GUI并改为使用Windows控制台时,这似乎还可以。返回的页面具有字符(破折号),打印功

  • 问题内容: 我的python(2.7版)脚本运行良好,可以从本地html文件中获取一些公司名称,但是当涉及到某些特定的国家/地区名称时,则会出现此错误“UnicodeEncodeError:’ascii’编解码器无法编码字符” 此公司名称到来时特别出错 公司名称: KühlfixKälteanlagenIng。Gerhard Doczekal&Co. KG 链接无法处理 错误显示在这行代码中: 问

  • 我正试图抓取一个网站,但它给了我一个错误。 我正在使用以下代码: 我得到了以下错误: 我能做些什么来解决这个问题?