如何查看邮件源码
- 从邮件客户端获取原始邮件(见下表)并粘贴,或者把
.eml或.mht文件拖到页面上。 - 摘要会显示解码后的发件人、收件人、抄送、主题、日期和 Message-ID。全部邮件头 列出每个邮件头的解码值和原始值。
- 以纯文本或 HTML 形式阅读 邮件正文。HTML 在沙箱中显示。
- 附件 列出每个文件的名称、类型、大小和内容 ID,提供 下载 按钮,图片还有预览。
- MIME 结构 显示各部分的嵌套关系,附件似乎丢失时可以借此排查。
| 邮件客户端 | 在哪里找到源码 |
|---|---|
| Gmail | 邮件菜单(⋮)→ 显示原始邮件,然后点击“下载原始邮件” |
| Outlook 网页版 | 邮件菜单(…)→ 查看 → 查看邮件源(View message source) |
| Thunderbird | 查看 → 消息源代码(View → Message Source,Ctrl+U),或通过 文件 → 另存为 保存为 .eml |
| Apple Mail | 显示 → 邮件 → 原始来源(View → Message → Raw Source) |
解码器能处理什么
- 编码的邮件头:Base64(
B)和 quoted-printable(Q)形式的 RFC 2047 编码字,相邻的编码字会合并,支持浏览器认识的任何字符集,也支持原始 UTF-8 邮件头。 - RFC 2231 形式的附件名,例如
filename*=UTF-8''Rechnung%20M%C3%A4rz.pdf,以及拆分的filename*0*=续行。 base64和quoted-printable编码的正文,按声明的字符集解码。f=C3=BCr会变成für。- 嵌套邮件:作为
message/rfc822附加的转发邮件,会像外层邮件一样逐层解析。 - 内嵌图片:HTML 中的
cid:引用会被解析为对应的附件图片。 - 不完整的输入:单独的 Base64 MIME 部分、整体经过 Base64 编码的邮件,或从
--boundary开始、没有邮件头的 multipart 正文。
整体经过 Base64 编码的邮件通常以 UmV0dXJuLVBhdGg6(Return-Path:)或 UmVjZWl2ZWQ6(Received:)开头。原样粘贴即可,解码器会先把它解开。
检查可疑邮件
对于钓鱼邮件,邮件头透露的信息比正文更多。在 全部邮件头 中需要比较的内容:
- From 与 Return-Path 和 Reply-To。回复地址在另一个域名上,是典型的可疑迹象。
- Authentication-Results,由接收服务器添加:
spf=、dkim=和dmarc=,结果为 pass 或 fail。 - Received 行,从下往上读,显示了邮件从发送服务器到你的服务器的路径。
- 附件类型:来自陌生发件人的
.html、.iso或.zip附件值得怀疑,invoice.pdf.html这种双扩展名也一样。
由于远程内容被拦截,在这里查看 HTML 正文不会加载跟踪像素,也不会确认你的地址已读。页面的 CSS 同样会被丢弃,所以新闻邮件看起来会比在邮件客户端中朴素。
用 Python 提取附件
from email import policy
from email.parser import BytesParser
with open("message.eml", "rb") as f:
msg = BytesParser(policy=policy.default).parse(f)
print(msg["Subject"])
for part in msg.iter_attachments():
name = part.get_filename()
with open(name, "wb") as out:
out.write(part.get_payload(decode=True))
print("saved", name)
policy.default 会解码编码字形式的邮件头,所以 msg["Subject"] 已经是可读的。实际使用时,写入之前要先清理 name,因为它来自发件人。关于附件如何编码,详见 电子邮件中的 Base64;MIME Base64 编码器 可以生成 76 列的格式。
已知限制
- 不支持 Outlook
.msg文件。winmail.dat(TNEF)部分会作为附件列出,但不会被解开。 - HTML 正文中的链接点击后没有任何反应,这是有意为之。
- MIME 部分数量极多的邮件会被截断,并给出提示。
常见问题
没有 Outlook 怎么打开 .eml 文件?
把它拖到这个页面上。邮件头、文本和 HTML 正文以及每个附件都会显示出来,附件可以逐个下载。不超过 64 MB 的文件会直接在浏览器中读取。
邮件主题中的 =?UTF-8?B?…?= 是什么意思?
这是 RFC 2047 编码字:B 表示中间的文本是 Base64,Q 表示一种 quoted-printable 变体。=?UTF-8?B?UmVjaG51bmcgTcOkcno=?= 解码后是 Rechnung März。解码器会把解码后的值和原始值并排显示。
在这里查看可疑邮件安全吗?
HTML 正文在沙箱框架中渲染,没有脚本、表单,链接也不可点击;远程图片和跟踪像素都会被拦截,所以打开它不会向发件人透露任何信息。附件只会列出并提供下载,绝不会被打开。
能打开 Outlook 的 .msg 文件吗?
不能。.msg 是 Outlook 的二进制格式,不是 MIME。请在 Outlook 网页版中打开同一封邮件,选择“查看邮件源”,然后把那段文本粘贴到这里。