发送邮件时出现Ascii编码错误

时间:2016-11-25 18:05:10

标签: python email encoding utf-8 ascii

我是python的新手并尝试使用poplib和smtplib接收和重新发送电子邮件:

    messages = [pop_conn.retr(i)[1] for i in range(1, mail_count + 1)]
    #decode messages
    messages = [[line.decode("utf-8") for line in message] for message in messages]
    # Concat messages
    messages = ["\n".join(msg) for msg in messages]
    #...        
    for message in messages:
        smtp_conn.sendmail(args.address, args.target, message)

在调试器中,所有消息字符串看起来都很好,但在sendmail调用中发生以下错误:

msg = _fix_eols(msg).encode('ascii')
     

UnicodeEncodeError:'ascii'编解码器无法对位置17938中的字符'\ xa0'进行编码:序号不在范围内(128)

我做错了什么?

3 个答案:

答案 0 :(得分:3)

似乎任何字符\xa0表示没有ASCII表示。根据{{​​3}},\xa0是非破坏空间的unicode字符。

由于这只是一个空格,您可以尝试替换所有this link

 messages = ["\n".join(msg.replace(u'\xa0', u' ')) for msg in messages]

公平地说,空格和不间断空格的功能不同,因此根据字符在消息中的显示位置,在用常规空格替换不间断空格后,输出可能会略有不同。

另一种选择是忽略产生任何错误的任何字符。此解决方案并不理想,因为您可能会丢失最终会更改文本格式(或有时意义)的字符。用普通空间替换不间断的空间是明智的,但是对于所有其他讨厌的角色都是如此:

msg.encode("ascii", errors="ignore")

或者,您可以执行msg.encode("ascii", errors="replace"),但这会将这些字符替换为“?”看起来不太好。

答案 1 :(得分:0)

您正在尝试编码不符合ascii标准的utf-8字符,如ascii。 display = ''; // to have it show 是一个不间断的空间。如果这是唯一不是ascii可编码的字符,你可以用普通空格替换它:

A0

否则,请查看https://en.wikipedia.org/wiki/Unicode_and_email#Unicode_support_in_message_bodies

将字符串编码为spaced_message = message.replace("\x0a", " ") (是的,utf-7)通常有效,但在许多系统中它已被正式弃用。 Utf-8需要在顶部进行base64编码,这有点棘手。

答案 2 :(得分:0)

我通过编辑第 859 行的 smtplib 源代码解决了这个错误。

替换第 859 行的 'ascii'

msg = _fix_eols(msg).encode('ascii')

使用'utf-8'

msg = _fix_eols(msg).encode('utf-8')