mailx默认无法发送外网邮件,因其仅为mua,依赖本地mta或配置smtp;云服务器常无sendmail且屏蔽25端口,需安装支持smtp/ssl的版本并正确配置~/.mailrc。

Linux 上用 mailx 发邮件告警,不是装上就能用——它默认不带 SMTP 认证能力,直接 echo "test" | mailx -s "alert" user@example.com 很大概率发不出去,尤其在阿里云、腾讯云等屏蔽 25 端口的环境中。
为什么 mailx 默认发不了外网邮件?
mailx(尤其是 CentOS/RHEL 自带的 heirloom-mailx)本质是个 MUA(邮件用户代理),不是 MTA。它依赖本地 sendmail 或配置好的 SMTP 服务转发;但现代云服务器通常没装 sendmail,也不开放 25 端口。
- 现象:
mailx命令无报错但收不到邮件,或日志里出现Connection refused/Network is unreachable - 根本原因:没配 SMTP 服务器,或配了但没开 TLS/SSL、没填账号密码
- 注意:
mailx -V输出含SSL或SMTP字样才支持远程 SMTP;CentOS 7 默认版本常不含这些特性
安装带 SMTP 支持的 mailx(以 CentOS/AlmaLinux 为例)
系统自带的 mailx 往往阉割了 SMTP 功能,必须换源或编译安装完整版。
- 先卸载旧版:
yum remove mailx - 装 EPEL 源(如未启用):
yum install epel-release - 安装支持 SMTP 的版本:
yum install mailx(EPEL 中的版本通常含smtp和ssl支持) - 验证:
mailx -V应输出类似GNU mailutils 3.14或显示smtp、ssl编译选项
配置 ~/.mailrc 使用 Gmail / QQ 邮箱等 SMTP 服务
mailx 读取 ~/.mailrc(当前用户)或 /etc/mail.rc(全局)来获取 SMTP 设置。必须严格按格式写,少一个引号或换行都可能失效。
- 编辑
~/.mailrc,加入以下内容(以 QQ 邮箱为例):
set smtp="smtps://smtp.qq.com:465" set smtp-auth=login set smtp-auth-user="your@qq.com" set smtp-auth-password="your_app_password" set from="your@qq.com" set ssl-verify=ignore
-
smtp-auth-password必须用「授权码」,不是邮箱登录密码(QQ/Gmail 均需在邮箱设置中开启 SMTP 并生成) - 端口选 465(smtps)或 587(starttls);若用 587,改
smtps://为smtp://,并加set smtp-use-starttls -
ssl-verify=ignore是临时绕过证书校验的妥协方案,生产环境建议配好 CA 证书路径(set ssl-ca-file="/etc/pki/tls/certs/ca-bundle.crt")
测试发送与脚本化告警的典型坑
能手动发成功 ≠ 脚本能用。cron 或监控脚本调用时,环境变量、HOME 路径、权限都可能让 ~/.mailrc 失效。
- 测试命令务必加
-v查看详细过程:echo "test body" | mailx -v -s "test subject" target@domain.com - cron 里执行要指定
HOME:HOME=/root /usr/bin/mailx -s "alert" admin@example.com - 避免管道传中文:部分
mailx版本对 UTF-8 支持弱,标题或正文含中文时加-S charset=utf-8 - 别把密码硬编码进脚本!用
~/.mailrc管理,且确保该文件权限为600(chmod 600 ~/.mailrc)
最易被忽略的是:不同发行版 mailx 行为差异极大——Ubuntu 的 bsd-mailx 不支持 smtp-auth,Debian 默认用 mailutils,而 Alpine Linux 甚至得装 mailx-openrc。配之前先 mailx -V 看清底细,比盲目试错快得多。










