我是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 回答
看起来好像
\xa0
表示的任何字符都没有ASCII表示 . 根据this link,\xa0
是非破坏空间的unicode字符 .由于这只是一个空间,你可以尝试替换所有\xa0 characters in your string:
公平地说,空格和不间断空格的功能不同,因此根据字符在消息中的显示位置,使用常规空格替换非间断空格后,输出可能会略有不同 .
另一种选择是忽略产生任何错误的任何字符 . 此解决方案并不理想,因为您可能会丢失最终会更改文本格式(或有时意义)的字符 . 用普通空间替换不间断的空间是明智的,但是对于所有其他讨厌的字符:
或者,您可以执行
msg.encode("ascii", errors="replace")
,但这将使用'?'替换这些字符,这看起来并不那么好 .您正在尝试编码不符合ascii标准的utf-8字符,如ascii .
A0
是一个不间断的空间 . 如果's the only character that'不是ascii可编码的,你可以用普通空格替换它:否则,请查看https://en.wikipedia.org/wiki/Unicode_and_email#Unicode_support_in_message_bodies
将字符串编码为
utf-7
(是的,7
)通常有效,但在许多系统中它已被正式弃用 . Utf-8需要在顶部进行base64编码,这有点棘手 .