The smtplib.server.sendmail function in python raises UnicodeEncodeError: 'ascii' codec can't encode character
The smtplib.server.sendmail function in python raises UnicodeEncodeError: 'ascii' codec can't encode character
我正在尝试编辑一个文本文件,然后使用 python 脚本将其作为电子邮件正文发送,但我遇到了 unicode 编码错误。经过一些研究,我找到了使用方法 .encode('utf-8') 的解决方案,但这对我不起作用,因为 sendmail() 方法只发送字符串
这是我使用的 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,如果 str
包含任何 non-ASCII 个字符,则会产生 UnicodeEncodeError
。
您可以通过自己对消息进行编码来解决此问题:
>>> 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'
但是,如果您想随邮件发送 non-text 二进制数据,则此解决方法将不起作用。
更好的解决方案是使用电子邮件包中的 EmailMessage class。
>>> from email.message import EmailMessage
>>> em = EmailMessage()
>>> em.set_content(msg)
>>> em['To'] = to_
>>> em['From'] = from_
>>> em['Subject'] = subject
>>> # NB call the server's *send_message* method
>>> server.send_message(em)
{}
这发送了这条消息;注意额外的 headers 告诉收件人使用的编码:
b'Content-Type: text/plain; charset="utf-8"'
b'Content-Transfer-Encoding: 8bit'
b'MIME-Version: 1.0'
b'To: to@example.com'
b'From: from@example.com'
b'Subject: Hello'
b'X-Peer: ::1'
b''
b'Hello W\xc3\xb8rld'
* 运行 命令 python -m smtpd -n -c DebuggingServer localhost:1025
在单独的终端中捕获消息数据。
我正在尝试编辑一个文本文件,然后使用 python 脚本将其作为电子邮件正文发送,但我遇到了 unicode 编码错误。经过一些研究,我找到了使用方法 .encode('utf-8') 的解决方案,但这对我不起作用,因为 sendmail() 方法只发送字符串
这是我使用的 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,如果 str
包含任何 non-ASCII 个字符,则会产生 UnicodeEncodeError
。
您可以通过自己对消息进行编码来解决此问题:
>>> 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'
但是,如果您想随邮件发送 non-text 二进制数据,则此解决方法将不起作用。
更好的解决方案是使用电子邮件包中的 EmailMessage class。
>>> from email.message import EmailMessage
>>> em = EmailMessage()
>>> em.set_content(msg)
>>> em['To'] = to_
>>> em['From'] = from_
>>> em['Subject'] = subject
>>> # NB call the server's *send_message* method
>>> server.send_message(em)
{}
这发送了这条消息;注意额外的 headers 告诉收件人使用的编码:
b'Content-Type: text/plain; charset="utf-8"'
b'Content-Transfer-Encoding: 8bit'
b'MIME-Version: 1.0'
b'To: to@example.com'
b'From: from@example.com'
b'Subject: Hello'
b'X-Peer: ::1'
b''
b'Hello W\xc3\xb8rld'
* 运行 命令 python -m smtpd -n -c DebuggingServer localhost:1025
在单独的终端中捕获消息数据。