希伯来语邮件乱码转换及邮件Payload嵌套结构技术求助
嘿,我来帮你搞定这两个问题——先解决希伯来语乱码,再给你讲清楚邮件结构为啥这么多层!
一、解决希伯来语乱码问题
你看到的=EE=E1=F7=F9=E9=ED是Quoted-Printable编码,这种编码是邮件系统里用来传输非ASCII字符的常见方式,把特殊字符转成=XX(XX是字符的十六进制值)的形式。不用手动解码,Python的email模块已经帮你做好了工具:
具体步骤&代码示例
- 先定位到你要处理的邮件子部分(就是你之前嵌套获取的那个元素)
- 用
get_payload(decode=True)自动解码Quoted-Printable编码,得到字节流 - 根据邮件的字符集把字节流转成希伯来语文本(希伯来语老邮件常用
windows-1255,新邮件多用UTF-8)
# 先拿到你要处理的那个邮件子部分 target_part = massage.get_payload()[0].get_payload()[0] # 第一步:解码编码的payload(自动处理Quoted-Printable/Base64) decoded_bytes = target_part.get_payload(decode=True) # 第二步:从邮件头获取字符集,没有的话用希伯来语常用的兜底 charset = target_part.get_content_charset() or "windows-1255" # 转成可读的希伯来语文本 hebrew_text = decoded_bytes.decode(charset) print(hebrew_text)
如果解码后还是不对,可以试试把windows-1255换成UTF-8,或者查看该邮件部分的Content-Type头(比如print(target_part.get('Content-Type'))),里面会明确标注charset值。
二、理解邮件的多层Payload结构
你遇到的嵌套可迭代对象,本质是因为邮件采用了MIME多部分格式——这是现代邮件的标准设计,允许一封邮件同时包含纯文本正文、HTML正文、附件,甚至嵌套的子邮件(比如转发的邮件)。
简单说下结构逻辑:
- 如果一个邮件部分的
Content-Type是multipart/...(比如multipart/alternative、multipart/mixed),那它就是一个“容器”,调用get_payload()会返回一个子部分的列表,每个子部分又是一个独立的邮件对象 - 只有当部分的
Content-Type是text/plain、text/html或者application/...(附件)这类非多类型时,get_payload()才会直接返回内容(或编码后的内容)
举个常见的邮件结构例子:
顶级邮件(multipart/mixed) ├─ 正文容器(multipart/alternative) │ ├─ 纯文本正文(text/plain) │ └─ HTML正文(text/html) └─ 附件(application/pdf)
你可以用这段代码遍历打印整个邮件的结构,帮你快速定位到需要的正文部分:
def traverse_mail_structure(part, indent=0): indent_str = " " * indent print(f"{indent_str}类型: {part.get_content_type()}") print(f"{indent_str} disposition: {part.get('Content-Disposition', '无')}") if part.is_multipart(): for idx, subpart in enumerate(part.get_payload()): print(f"{indent_str}--- 子部分 {idx} ---") traverse_mail_structure(subpart, indent + 1) else: print(f"{indent_str}这是一个内容部分,可通过get_payload(decode=True)解码") # 调用函数打印结构 traverse_mail_structure(massage)
内容的提问来源于stack exchange,提问作者Moran Reznik
相关产品推荐
相关产品推荐

