Linux下mail命令发邮件正文显示编码内容 如何正常发送附件
问题根因
AIX 自带的 mail 命令默认兼容传统 UUEncode 内联附件格式,会自动识别编码块渲染为可下载附件。Linux 环境下的 mail 多为 GNU Mailutils 或 Heirloom mailx 实现,默认遵循 MIME 邮件标准,不会自动解析 UUEncode 生成的编码块,会直接把所有编码内容当纯文本正文输出,就会出现正文显示编码内容、无法识别附件的问题。另外你原命令里 xyz_"$TIMESTAM P" 变量名中间多打了空格,会导致对应文件读取失败,需要修正。
解决方案
优先使用标准 MIME 附件格式发送,全平台邮件客户端都能正常识别,不需要依赖过时的 UUEncode 兼容逻辑。
方案1:使用 mailx 原生附件参数(无需额外安装软件)
绝大多数 Linux 发行版预装的 mail 命令是 mailx 的软链接,原生支持 -a 参数添加 MIME 附件,直接替换原命令即可:
cat "Body_${TIMESTAMP}" | mail -s "From-To-List : ${list}" \ -c tommy@xyz.com \ -a "abc_${TIMESTAMP}" \ -a "def_${TIMESTAMP}" \ -a "xyz_${TIMESTAMP}" \ -a "pqr_${TIMESTAMP}" \ -a "mno_${TIMESTAMP}" \ team@xyz.com
该方案默认附件显示本地文件的原名(带时间戳),如果需要和原命令一致,将附件显示为固定名称(如
abc_123.xls这类不带时间戳的名字),可提前给文件做临时软链接重命名,或使用下面的 mutt 方案。
方案2:使用 mutt 发送,支持自定义附件显示名
如果系统预装了 mutt 邮件客户端,可以灵活指定附件展示的文件名,完全匹配原命令的重命名逻辑:
# 为需要重命名的附件创建临时软链接,不改动原文件 ln -s "abc_${TIMESTAMP}" abc_123.xls ln -s "def_${TIMESTAMP}" def_123.xls ln -s "xyz_${TIMESTAMP}" xyz.xls ln -s "pqr_${TIMESTAMP}" pqr_456.xls ln -s "mno_${TIMESTAMP}" mno.xls # 发送邮件 mutt -s "From-To-List : ${list}" \ -c tommy@xyz.com \ -a abc_123.xls def_123.xls xyz.xls pqr_456.xls mno.xls \ -- team@xyz.com < "Body_${TIMESTAMP}" # 发送完成后清理临时软链接 rm -f abc_123.xls def_123.xls xyz.xls pqr_456.xls mno.xls
兼容方案(不推荐):沿用 UUEncode 写法
如果一定要保留原有 UUEncode 拼接的写法,需要手动补充 MIME 邮件头声明编码类型,但是这种方式兼容性差,部分网页端、移动端邮件客户端仍可能无法正确识别附件,日常使用优先选前两种标准方案。
内容的提问来源于stack exchange,提问作者Preeti Maurya
相关产品推荐
相关产品推荐

