Python imap 模块不能解析出中文名字的附件


imap 模块输出的attachment 文件名是

=?gb18030?B?0KzX07HKy6IuanBn?=

然后用 email 模块解析的文件名字 得出的结果也是
=?gb18030?B?0KzX07HKy6IuanBn?=

我的上传到邮箱的是中文文件名

很显然 这个字符串是 gb18030编码; 问题是 怎样解析出对应的中文文件名呢?

python mail

秋水 11 years ago

 >>> import email.header
>>> email.header.decode_header('=?gb18030?B?0KzX07HKy6IuanBn?=')
[(b'\xd0\xac\xd7\xd3\xb1\xca\xcb\xa2.jpg', 'gb18030')]
>>> b, e = _[0]
>>> b.decode(e)
'鞋子笔刷.jpg'

# 赠送
import re
from email import header

def decode_multiline_header(s):
  ret = []

  for b, e in header.decode_header(re.sub(r'\n\s+', ' ', s)):
    if e:
      if e.lower() == 'gb2312':
        e = 'gb18030'
      b = b.decode(e)
    elif isinstance(b, bytes):
      b = b.decode('ascii')
    ret.append(b)

  return ''.join(ret)

不建议自己解码邮件头,除非你阅读过相关 RFC。这编码看上去简单,但其实有不少坑,比如上边那个解码多行头信息的,比如这里编码可以不用 base64 而使用 quoted-printable。

黑锅218 answered 11 years ago

Your Answer