Linux下mail/mailx发邮件本质调用外部SMTP服务,需正确配置端口(如465)、认证方式(login)和SSL证书路径(nss-config-dir),三者缺一不可;云服务器常封25端口,须改用465或587并配ssl-verify=ignore才能成功。

Linux 下用 mail 或 mailx 发邮件,本质是调用外部 SMTP 服务,不是自建邮件服务器。直接配 /etc/mail.rc 就能发,但端口、认证方式、证书这三处最容易卡住——尤其是云服务器默认封 25 端口,不换 465 或 587 基本发不出去。
为什么 mail 命令发不出去?先查这三件事
绝大多数失败不是配置写错了,而是底层连不上 SMTP 服务器:
-
nc -zv smtp.qq.com 465返回succeeded才算通;如果超时,说明防火墙或云厂商封了端口 -
echo "test" | mail -s "test" your@domain.com失败时,看/var/log/maillog里有没有SSL handshake failed或Authentication failed - 授权码填错、
smtp-auth-user和from不一致、密码用了登录密码而非授权码——这三个是高频错误点
mail.rc 配置必须写的五项(以 QQ 邮箱为例)
只写关键项,删掉注释和空行,避免解析出错:
set from="yourname@qq.com" set smtp="smtps://smtp.qq.com:465" set smtp-auth-user="yourname@qq.com" set smtp-auth-password="your_16bit_app_password" set smtp-auth=login
注意:smtp 值必须带 smtps:// 前缀 + 端口号,不能只写 smtp.qq.com;from 和 smtp-auth-user 必须完全一致(包括大小写和域名),否则腾讯系邮箱会直接拒绝认证。
465 端口必须加 SSL 配置,否则连接被重置
即使写了 smtps://smtp.qq.com:465,mailx 默认仍可能尝试 STARTTLS 而非 SSL 握手。必须补上这两行:
set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb
原因:mailx 底层用 NSS 库做 SSL,不指定信任目录或忽略验证,它会在证书链校验阶段失败。如果系统没装 nss-tools,先运行 yum install nss-tools(CentOS)或 apt install libnss3-tools(Ubuntu)。
测试命令要带 -v 参数才看得清哪步断了
别只用 echo "ok" | mail -s "test" a@b.com,加 -v 才输出真实交互日志:
echo "body" | mail -v -s "subject" a@b.com
典型成功日志末尾是 Sending message... + 250 Ok;若卡在 EHLO 后无响应,基本是端口不通;若报 535 Error: authentication failed,回头核对 smtp-auth-user 和授权码。
云服务器上发邮件,真正麻烦的从来不是怎么写配置,而是确认你用的端口、协议、证书路径三者是否匹配——少一个,mail 就静默失败。


















