You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

命令行下原样转发多部分MIME邮件的方法及Mutt替代工具咨询

问题

我需要将邮件从一个发件人转发给多个收件人,目前通过提取邮件的text/plain内容并传递给mutt完成投递和归档,简化脚本如下:

for i in "${recipients[@]}"
do
  mutt -s "Original subject" -e "${FCC-Target}" [-a some.pdf] -- "${i}" < mail.txt
done

该方案多数情况可行,但有时需要近乎原样转发邮件正文,例如包含Content-Type: multipart/mixed; boundary="_something_"的邮件,需将_something_内的内容原样传递给收件人,使其看到原发件人预期的邮件格式。尝试使用mutt的-H选项处理头+正文草稿,但未能达到预期:发送的邮件要么仅包含附件some.pdf,要么_something_被封装在另一个MIME容器中导致内容乱码。现咨询:

  1. 是否存在可重新发送相关部分(即_something_内所有内容)的命令行工具?
  2. 应寻找哪些替代mutt的工具?
  3. Mutt 2.2是否支持该功能,是否是我使用方式有误?

解决方案

关于Mutt 2.2的正确用法

你用-H时出问题,核心是操作逻辑错了。Mutt的-H要求输入完整的RFC 5322格式邮件(包含所有头信息、MIME边界和正文内容),而且绝对不能和-a选项混用——-a会自动生成新的multipart容器,把你原邮件的内容套进去,导致二次封装乱码。

正确的原样转发步骤:

  1. 把原邮件的完整内容(包括邮件头、MIME结构、附件等所有信息)保存成一个EML格式文件,比如full_email.eml
  2. 直接执行mutt -H full_email.eml -e "${FCC-Target}" -- "${i}"发送,不要加-a。如果原邮件已经包含some.pdf附件,那full_email.eml里已经有对应的MIME部分,不需要重复添加;如果要额外加附件,得手动修改full_email.eml的MIME结构,把新附件的内容插入到对应位置,而不是用-a触发Mutt自动封装。

Mutt 2.2完全支持原样转发完整MIME邮件,只要不让它自动生成新的MIME容器,直接复用你提供的完整邮件结构就行。

替代命令行工具

如果觉得Mutt的MIME处理太繁琐,这些工具更适合直接发送完整EML邮件:

  • sendmail:最基础的邮件发送工具,直接把完整EML喂给它即可,比如sendmail "${i}" < full_email.eml。归档需要自己把邮件追加到归档文件,或者配置sendmail的本地规则。
  • msmtp:轻量SMTP客户端,支持直接读取EML发送,命令为msmtp --read-envelope-from -t < full_email.eml,归档可以通过重定向输出或配置日志实现。
  • Heirloom mailx:支持指定归档文件夹,发送完整EML时用mailx -A "${FCC-Target}" -s "" -- "${i}" < full_email.eml(-s留空,因为EML里已经包含Subject头)。
  • swaks:专门用于邮件测试和发送的工具,支持直接注入完整MIME内容,比如swaks --to "${i}" --input full_email.eml,归档可通过--output参数保存副本。

提取并重新发送MUTT部分的工具

如果只想提取原邮件multipart/mixed边界内的内容再发送,可以用这些工具拆分MIME结构:

  • ripmime:执行ripmime -i original.eml -d extracted/,会把原邮件的每个MIME部分提取到extracted目录中
  • munpack:执行munpack original.eml,直接提取所有MIME附件和正文到当前目录

提取后可以手动拼接成新的RFC格式邮件,再用上面的发送工具投递。不过这种方法步骤繁琐,不如直接转发完整EML高效。


内容的提问来源于stack exchange,提问作者olh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 13:04:54