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

 小男生2502863203 发布于 2022-11-05 09:19

imap 模块输出的attachment 文件名是

=?gb18030?B?0KzX07HKy6IuanBn?=

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

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

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

1 个回答
  • >>> 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。

    2022-11-12 01:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有