如何处理get_body()中的=2E转义字符?
EML文件中=2E这类转义序列的识别与自动转换方案
问题确认
=2E确实是点号(.),这是quoted-printable编码的转义格式:=后面的两位十六进制数对应字符的ASCII码,2E恰好是点号的ASCII十进制值(46)。
你的EML文件里,纯文本部分明确标注了Content-Transfer-Encoding: quoted-printable,这类转义是正常的编码结果,只是直接调用get_payload()时没有触发自动解码。
解决方案
只需修改代码,让get_payload()自动解码编码内容,再转换为对应字符集的字符串即可:
修改后的代码
import email import email.policy import sys msg = email.message_from_string(sys.stdin.read(), policy=email.policy.default) plain_body = msg.get_body('plain') # 先解码quoted-printable编码,再按指定字符集转成字符串 decoded_content = plain_body.get_payload(decode=True).decode(plain_body.get_content_charset()) print(decoded_content)
代码说明
get_payload(decode=True):会根据邮件头中的Content-Transfer-Encoding自动解码(这里就是处理quoted-printable编码),返回字节流。.decode(plain_body.get_content_charset()):用邮件中指定的字符集(这里是UTF-8)将字节流转为字符串,避免乱码。
运行结果
执行修改后的代码后,输出会变成:
email app. this is a test .
原始问题相关信息
原始代码
import email import email.policy import sys msg = email.message_from_string(sys.stdin.read(), policy=email.policy.default) print(msg.get_body('plain').get_payload())
输入的input.eml内容
MIME-Version: 1.0 From: my from To: email@to.com Subject: my subject Content-Type: multipart/mixed; boundary="----=_Part_2296279_969698842.1679155313994" Date: Sat, 18 Mar 2023 16:01:53 +0000 (UTC) ------=_Part_2296279_969698842.1679155313994 Content-Type: multipart/alternative; boundary="----=_Part_2296278_601255348.1679155313994" ------=_Part_2296278_601255348.1679155313994 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable email app=2E this is a test =2E ------=_Part_2296278_601255348.1679155313994 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 7bit <!DOCTYPE html> <html> <body> this is html </body> </html> ------=_Part_2296278_601255348.1679155313994-- ------=_Part_2296279_969698842.1679155313994--
原始运行结果
$ ./main.py < input.eml email app=2E this is a test =2E
内容的提问来源于stack exchange,提问作者user1424739
相关产品推荐
相关产品推荐

