告别图形界面!Linux 命令行发邮件其实就这么简单

在服务器运维和自动化脚本的世界里,有时候最简单的工具反而最靠谱
一、mailX 到底是什么?
说实话,第一次接触 mailX 的时候我也挺纳闷的:这都 2026 年了,为啥还要用命令行发邮件?
但用久了才发现,这玩意儿在服务器监控、自动化通知这些场景下是真的香。不用打开浏览器,不用登录邮箱,一行命令就能把邮件发出去,特别适合放在 shell 脚本里做自动通知 [[5]]。
简单来说,mailX 就是 Linux/Unix 系统下的一个命令行邮件客户端,基于 Berkeley Mail 开发,算是 mail 命令的增强版 [[7]]。它可以通过 SMTP 协议直接发送邮件,支持附件、抄送这些基本功能,关键是配置一次就能反复使用。
它适合谁用?
- 运维工程师:服务器告警、备份完成通知
- 开发人员:CI/CD 流程中的状态提醒
- 普通用户:就想在终端里快速发个邮件,不想开浏览器
二、从零开始:mailX 安装与配置
2.1 安装 mailX
安装过程其实挺简单的,不同发行版命令不太一样:
CentOS/RHEL 系统:
yum install mailx -y
Debian/Ubuntu 系统:
apt-get install mailx -y

安装完成后,输入 mailx -V 看看版本号,能显示出来就说明装好了。
2.2 配置文件位置
mailX 的配置文件在 /etc/mail.rc,所有 SMTP 设置都在这儿改 [[3]]。用你喜欢的编辑器打开:
vi /etc/mail.rc
2.3 SMTP 配置详解
这里以 QQ 邮箱和 Gmail 为例,其他邮箱大同小异。
QQ 邮箱配置(SSL 加密):
# 在 /etc/mail.rc 文件末尾添加
set from=your_qq@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=your_qq@qq.com
set smtp-auth-password=your_auth_code
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/root/.mozilla-thunderbird/
Gmail 配置:
set from=your_email@gmail.com
set smtp=smtp://smtp.gmail.com:587
set smtp-auth-user=your_email@gmail.com
set smtp-auth-password=your_app_password
set smtp-auth=login
set ssl-verify=ignore

几个关键点:
- 授权码不是密码:QQ 邮箱、163 邮箱这些都需要在邮箱设置里开启 SMTP 服务,然后生成授权码,不能用登录密码 [[7]]
- SSL 端口:465 是 SSL 加密端口,587 是 TLS 加密端口,25 是非加密端口(现在基本不用了)[[4]]
- from 地址:必须和 smtp-auth-user 一致,不然会被拒绝
2.4 配置原理解析

当你执行 mailx 命令时,整个过程是这样的:
- 命令行读取你的邮件内容和收件人
- mailX 读取
/etc/mail.rc中的 SMTP 配置 - 连接到 SMTP 服务器(比如 smtp.qq.com:465)
- 进行 SSL/TLS 握手加密
- 使用用户名和密码认证
- 发送邮件数据
- 服务器接收并投递
三、实战演练:mailX 的各种用法
3.1 最基础的发送邮件
方式一:直接输入内容
mailx -s "测试邮件" recipient@example.com
输入命令后按回车,会进入编辑模式:
Cc: # 这里可以输入抄送地址,不抄送直接回车
然后输入邮件正文,写完按 Ctrl + D 发送。
方式二:从文件读取内容
mailx -s "会议纪要" team@company.com < meeting_notes.txt
这个最常用,特别是脚本里 [[2]]。
方式三:管道传递内容
echo "服务器CPU使用率超过90%" | mailx -s "告警通知" admin@company.com
3.2 发送带附件的邮件
mailx -s "月度报告" -a report.pdf manager@company.com < body.txt
-a 参数后面跟附件路径,支持多个附件:
mailx -s "项目文档" -a doc1.pdf -a doc2.zip client@example.com < email_body.txt

3.3 抄送和密送
# 抄送(CC)
mailx -s "项目进度" -c boss@company.com developer@company.com
# 密送(BCC)
mailx -s "通知" -b hidden@company.com recipient@example.com
# 同时使用 CC 和 BCC
mailx -s "重要通知" -c visible@company.com -b hidden@company.com team@company.com
-c 是抄送,-b 是密送 [[12]]。
3.4 指定发件人
如果你配置了多个邮箱账号,可以临时指定发件人:
mailx -r "backup@company.com" -s "备份完成" admin@company.com < backup.log
3.5 批量发送
# 从文件读取收件人列表
cat recipients.txt | while read email; do
mailx -s "活动邀请" $email < invitation.txt
done
四、真实场景:服务器监控告警
这是我实际在用的一个例子,监控服务器负载,超过阈值就发邮件通知。
监控脚本 monitor.sh:
#!/bin/bash
# 阈值设置
CPU_THRESHOLD=90
MEM_THRESHOLD=85
# 获取当前负载
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
MEM_USAGE=$(free | grep Mem | awk '{printf("%.0f", $3/$2 * 100.0)}')
# 检查 CPU
if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
ALERT_MSG="警告:服务器 $(hostname) CPU使用率 ${CPU_USAGE}% 超过阈值 ${CPU_THRESHOLD}%\n"
ALERT_MSG+="时间:$(date '+%Y-%m-%d %H:%M:%S')\n"
ALERT_MSG+="当前负载:$(uptime)"
echo -e "$ALERT_MSG" | mailx -s "[ALERT] CPU 告警 - $(hostname)" admin@company.com
fi
# 检查内存
if [ $MEM_USAGE -gt $MEM_THRESHOLD ]; then
ALERT_MSG="警告:服务器 $(hostname) 内存使用率 ${MEM_USAGE}% 超过阈值 ${MEM_THRESHOLD}%\n"
ALERT_MSG+="时间:$(date '+%Y-%m-%d %H:%M:%S')\n"
ALERT_MSG+="$(free -h)"
echo -e "$ALERT_MSG" | mailx -s "[ALERT] 内存告警 - $(hostname)" admin@company.com
fi
加入 crontab 定时任务:
# 每5分钟检查一次
*/5 * * * * /path/to/monitor.sh

这样配置后,一旦服务器负载异常,立马就能收到邮件,比啥都管用。
五、常见问题与踩坑记录
问题1:认证失败
错误信息: Authentication failed
解决方法:
- 检查授权码是否正确(不是邮箱登录密码!)
- 确认 SMTP 服务已开启(在邮箱设置里)
- 试试去掉
ssl-verify=ignore这行
问题2:连接超时
错误信息: Connection timed out
解决方法:
- 检查防火墙是否开放相应端口
- 确认 SMTP 服务器地址和端口号正确
- 云服务器可能需要配置安全组规则
问题3:邮件进垃圾箱
解决方法:
- 使用 SPF、DKIM 记录验证域名
- 避免频繁发送相同内容
- 邮件标题不要太夸张
问题4:中文乱码
解决方法:
在 /etc/mail.rc 中添加:
set charset=UTF-8
六、进阶技巧
6.1 使用外部证书
对于生产环境,建议使用 SSL 证书增强安全性 [[15]]:
# 创建证书目录
mkdir -p ~/.mailcerts
cd ~/.mailcerts
# 下载 SMTP 服务器证书
openssl s_client -connect smtp.gmail.com:587 -starttls smtp < /dev/null | \
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > gmail.crt
# 在 mail.rc 中引用证书
set nss-config-dir=/root/.mailcerts/
6.2 脚本中的错误处理
#!/bin/bash
send_email() {
local recipient=$1
local subject=$2
local body=$3
if echo "$body" | mailx -s "$subject" "$recipient" 2>/dev/null; then
echo "邮件发送成功"
return 0
else
echo "邮件发送失败" >&2
return 1
fi
}
# 使用
send_email "user@example.com" "测试" "Hello World" || exit 1
6.3 结合其他工具
配合 logrotate 做日志轮转通知:
/var/log/app.log {
daily
rotate 7
compress
lastaction
echo "日志已轮转 $(date)" | mailx -s "日志轮转通知" admin@company.com
endscript
}
配合 backup 脚本:
tar -czf backup-$(date +%Y%m%d).tar.gz /data && \
echo "备份完成" | mailx -s "备份成功" -a backup-$(date +%Y%m%d).tar.gz admin@company.com
七、总结
mailX 这个工具吧,说不上多炫酷,但在特定场景下是真的好用。
优点:
- ✅ 轻量级,不占资源
- ✅ 适合自动化,脚本友好
- ✅ 配置一次,长期受益
- ✅ 不依赖图形界面,服务器标配
缺点:
- ❌ 学习曲线对新手不太友好
- ❌ 功能相对简单,不支持 HTML 邮件
- ❌ 调试不太方便
适用场景:
- 服务器监控告警
- 定时任务通知
- 自动化脚本的状态反馈
- 批量邮件发送
最后说一句,虽然现在很多云服务商都提供了邮件推送 API,但在 Linux 服务器上做简单的邮件通知,mailX 依然是最快最方便的选择之一 [[18]]。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)