结论:mailx更轻量上手快,适合简单告警;mutt更灵活支持附件和多账户但配置稍重;两者均需禁用本地mta并显式配置外部smtp,否则发件人显示为user@localhost导致被拒收。

直接说结论:用 mailx 更轻量、上手快,适合简单告警;用 mutt 更灵活、支持附件和多账户,但配置稍重。两者都必须绕过系统默认的本地 MTA(如 sendmail/postfix),否则发信会失败或显示为 user@localhost。
mailx 发邮件为什么收件人看到发件人是 user@hostname?
因为默认没配外部 SMTP,mailx 会走本机 sendmail 或 postfix,而这些服务默认不认证、不设发件域名。结果就是:邮件头里 From: 被自动补成 user@$(hostname),很多邮箱(如 QQ、163)直接拒收或进垃圾箱。
- 必须禁用本地 MTA:
systemctl stop postfix sendmail,再systemctl disable postfix sendmail - 必须在
/etc/mail.rc或~/.mailrc中显式指定外部 SMTP:set smtp="smtps://smtp.qq.com:465" - QQ/163/yeah 等邮箱必须用「授权码」而非登录密码,且要开 SMTP 服务(在邮箱网页端设置里)
- 阿里云/腾讯云等厂商默认封 25 端口,
smtps://+ 465 端口是更稳的选择,但需加证书验证配置
mutt 配置中 sendmail 和 smtp_url 到底该用哪个?
取决于你是否装了 msmtp。这是最容易混淆的点:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 如果只配了
~/.muttrc里的set smtp_url=...,mutt会尝试自己连 SMTP —— 但多数发行版编译时没开--enable-smtp,运行时报错SMTP authentication not available - 更可靠的做法是:装
msmtp,写好~/.msmtprc,然后在~/.muttrc里只写set sendmail="/usr/bin/msmtp",让mutt把发信任务交给msmtp处理 -
set from=...和set use_from=yes必须同时存在,否则msmtp不认这个发件地址 -
chmod 600 ~/.msmtprc ~/.muttrc—— 密码明文存配置里,权限不对会导致msmtp拒绝读取
发送带附件的邮件,mailx 和 mutt 的参数差异
看着像,实际行为不同:
-
mailx -A /path/to/file recipient@example.com:-A 是「attach」,但仅支持单个文件,且某些旧版mailx(如 CentOS 7 自带的)根本不识别 -A,得用-a(注意小写) mutt -a /file1 -a /file2 -- recipient@example.com :-a 是「add attachment」,支持多个;<code>--是分隔符,防止收件人地址被误认为附件路径- 两者都不支持中文路径附件名;附件内容如果是二进制(如 zip),建议先
base64编码再发,或改用uuencode(mutt原生支持) - 想把日志文件当正文又带附件?
mutt可以:mutt -s "log" -a /var/log/messages -- admin@x.com ;<code>mailx必须用重定向:mailx -s "log" -A /var/log/messages admin@x.com
真正麻烦的不是怎么写命令,而是每换一家邮箱服务商(QQ/163/Outlook/Gmail),就要重新调一次 TLS 模式、端口、证书路径和认证方式。哪怕只是把 smtp.163.com:25 改成 smtps://smtp.163.com:465,漏掉 s 或冒号,mutt 就静默失败,mailx 可能卡住几秒后报 timeout —— 这些细节不打日志根本看不出问题。










