mutt最稳,支持多附件和中文路径容错;mailx版本依赖强,centos 7仅支持-a且单附件;两者均须禁用本地mta并配置外部smtp,否则发件人显示user@localhost导致90%邮箱拒收。

直接说结论:用 mutt 最稳,支持多附件、中文路径容错好;mailx 看版本,CentOS 7 自带的不认 -A,得用 -a,且只支持单附件;两者都必须绕过本地 MTA,否则发件人显示为 user@localhost,90% 的邮箱(QQ/163/Outlook)直接拒收。
为什么 mailx -a /file 发不出去或被当垃圾邮件?
常见错误现象:命令没报错但收件人收不到,或进垃圾箱;mailx -a 执行后卡住不动;收件人看到发件人是 root@myserver.local。
-
mailx默认走本机sendmail或postfix,而这些服务不配置 SMTP 认证时,会自动补全From:为$(whoami)@$(hostname) - 阿里云/腾讯云默认封 25 端口,
smtp://smtp.163.com:25会超时;必须用smtps://smtp.163.com:465或smtp://smtp.163.com:587+ STARTTLS - 旧版
mailx(如 CentOS 7 的mailx-12.5)根本不识别-A,只认-a;Debian/Ubuntu 的heirloom-mailx才支持-A - 附件内容为空或正文为空时,
mailx会 hang 住——它要求「正文 + 至少一个附件」同时存在
mutt 发附件的正确写法和关键配置
不是光装了 mutt 就能发,缺 msmtp 或配置错,运行时报 SMTP authentication not available 是最常踩的坑。
- 必须装
msmtp:yum install msmtp(RHEL/CentOS)或apt install msmtp(Debian/Ubuntu) -
~/.msmtprc写完要chmod 600 ~/.msmtprc,否则msmtp拒绝读密码 -
~/.muttrc里只设set sendmail="/usr/bin/msmtp",别碰set smtp_url=——除非你确认 mutt 编译时启用了--enable-smtp - 发多附件:
mutt -s "alert" -a /tmp/log.tar.gz -a /tmp/dump.sql -- admin@example.com ,<code>--是必须的分隔符 - 附件路径含中文?先
mv "/路径/中文.txt" /tmp/zh.txt再发;二进制文件(如.zip)建议用uuencode包一层:uuencode backup.zip backup.zip | mutt -s "zip" -- user@x.com
mailx 发附件的兼容写法(避开版本坑)
别信网上抄来的 mailx -A file recipient,先查你手头的版本:
- 执行
mailx -V,输出含heirloom→ 支持-A;输出是数字(如12.5)→ 只能用-a - 正文不能为空:
echo "see attach" | mailx -s "log" -a /var/log/messages admin@x.com - 想发多个附件?
mailx不行,硬要搞就拼uuencode:uuencode a.log a.log; uuencode b.log b.log | mailx -s "two logs" user@x.com - QQ/163 邮箱必须用「授权码」,不是登录密码;配置里
set smtp-auth-password=xxxxxx的值就是授权码 - 证书验证失败?加这行:
set ssl-verify=ignore(仅测试用),生产环境应配set nss-config-dir=/etc/pki/nssdb
最容易被忽略的点:所有配置文件(/etc/mail.rc、~/.msmtprc、~/.muttrc)里的密码都是明文,权限不对(比如 ~/.msmtprc 是 644)会导致整个链路静默失败——msmtp 连读都不读,更不会报错。











