我是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)
我做错了什么?
答案 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')