我正在尝试使用 python 的
email
模块及其由 Parser()
子模块提供的 email.utils
来解析电子邮件。
但是,有一些特殊字符我无法正确解析/转换。
这是我到目前为止得到的脚本:
import sys
import email
from email.parser import Parser
full_msg = Parser().parse(sys.stdin)
msg = full_msg # this ugly line is part of former debugging
sender = msg['from']
to = msg['to']
subject = msg['subject']
body = msg.get_payload()
date = msg['Date']
fname = '{}.txt'.format(date)
with open(fname, 'w') as f:
f.write('{:10}{}\n'.format('Von:', sender))
f.write('{:10}{}\n'.format('An:', to))
f.write('{:10}{}\n'.format('Betreff:', subject))
f.write('{}\n'.format(body))
由于我要解析国际邮件和德国邮件,因此我必须处理所谓的“Umlaute”(
ä
、ü
、ö
)和一些其他字符,例如ß
和省略号(...
)
)。
例如像这样的身体
Würde Dürfte Könnte
得到的
W=C3=BCrde D=C3=BCrfte K=C3=B6nnte=
以及
的主题Das dürfte jetzt klappen
成为
=?utf-8?Q?Das_d=C3=BCrfte_jetzt_klappen?=
有没有办法解决这些编码/解码问题?我错过了什么?
更新1:
系统的语言分别。编码设置为
en_US.UTF-8
。我通过重新配置可用的区域设置将其更改为 de_DE.UTF-8
。然而,这根本没有改变输出。 locale
给出:
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
更新2:
我发现这种类型的字符串格式被称为Quoted-printable。有一个名为 quopri 的 Python 模块可以处理这种格式,但我无法获得满意的结果。然而,我使用 MailParser 切换到 JavaScript,这就像一个魅力。
我想我参加聚会有点晚了...
我今天遇到了与您完全相同的问题,这让我想到了您的问题。您关于 quopri 库的第二次更新非常有帮助,基于此我找到了解决方案:
quopri.decodestring(s).decode("utf-8")
其中
s
是包含带引号的可打印内容的字符串。
>>> import quopri
>>> print(quopri.decodestring('W=C3=BCrde D=C3=BCrfte K=C3=B6nnte=').decode('utf-8'))
Würde Dürfte Könnte
不幸的是,这并不能解决第二个示例中的
=?utf-8?Q?
前缀:
>>> print(quopri.decodestring('=?utf-8?Q?Das_d=C3=BCrfte_jetzt_klappen?=').decode('utf-8'))
=?utf-8?Q?Das_dürfte_jetzt_klappen?