首页 文章

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

提问于
浏览
1

我是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)

我究竟做错了什么?

2 回答

  • 2

    看起来好像 \xa0 表示的任何字符都没有ASCII表示 . 根据this link\xa0 是非破坏空间的unicode字符 .

    由于这只是一个空间,你可以尝试替换所有\xa0 characters in your string

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

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

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

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

    或者,您可以执行 msg.encode("ascii", errors="replace") ,但这将使用'?'替换这些字符,这看起来并不那么好 .

  • 0

    您正在尝试编码不符合ascii标准的utf-8字符,如ascii . A0 是一个不间断的空间 . 如果's the only character that'不是ascii可编码的,你可以用普通空格替换它:

    spaced_message = message.replace("\x0a", " ")
    

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

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

相关问题