【问题标题】:The smtplib.server.sendmail function in python raises UnicodeEncodeError: 'ascii' codec can't encode characterpython 中的 smtplib.server.sendmail 函数引发 UnicodeEncodeError: 'ascii' codec can't encode character
【发布时间】:2019-07-18 02:08:33
【问题描述】:

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

这是我使用的python代码sn-p:

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)

【问题讨论】:

    标签: python python-3.x email character-encoding smtplib


    【解决方案1】:

    smtplib.serversendmail 方法需要一个bytes 实例;如果它得到一个str,它会尝试将其编码为ASCII,如果str包含任何非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'
    

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

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

    >>> 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)
    {}
    

    这会发送此消息;注意告诉收件人使用的编码的额外标题:

    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 以捕获消息数据。

    【讨论】:

    • To, FromSubject 在后者的内容中似乎是两次。 em.set_content("{}".format(msg)) 会解决这个问题。
    猜你喜欢
    • 2015-12-03
    • 2018-08-14
    • 2014-05-09
    • 1970-01-01
    • 2022-01-27
    • 2022-01-20
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多