同事把一封项目邮件导出成 .eml 发过来,说要归档进合同附件,让我转成 PDF。我双击一看,系统默认用邮件客户端打开,界面能看,但直接按 Ctrl+P 打印出来正文串了行,图片还全丢了。

eml 本质就是一封纯文本邮件

.eml 是 RFC 822 定义的邮件格式,开头是 From、To、Subject、Date 这些头字段,下面接 MIME 分段的正文和附件。用记事本打开能看到一堆 Content-Type 和 base64 编码块。正因为是文本,转换的难点不在解码,而在找一个能把 HTML 正文正确渲染出图文的工具。

装了 Outlook 打印最省事

有 Outlook 的话直接双击 eml,菜单里点「文件」再到「打印」,打印机选 Microsoft Print to PDF,出来就是 PDF。图片容易丢,多数是正文引用了外部图片链接,断网就变红叉。稳妥点的做法是先把邮件另存为 HTML,再用浏览器打开打印预览,勾上背景图形再导出。

不装客户端就靠命令行

Python 有现成的 eml 转换库,先拆出 HTML 正文再转 PDF:

pip install email-to-pdf
python -m email_to_pdf input.eml -o output.pdf

也可以借 LibreOffice 的无头模式,先把邮件存成 HTML,再批量转:

soffice --headless --convert-to pdf input.html

几个常踩的坑

  • eml 里的附件不会自动拼进 PDF,得先解出来再单独合并
  • 中文乱码多半是头字段用了 GB2312 编码,转的时候要指定 charset
  • 批量转换写个脚本循环处理,别一封封手点

偶尔转一两封,Outlook 打印就够用了;要给整个项目归档上百封,还是写脚本调库划算,省下来的时间远超装环境那点功夫。