需求场景
在Linux服务器运维中,我们经常使用cron定时执行监控脚本。这些脚本产生的输出会通过系统邮件服务发送给执行用户(通常是root或自定义用户)。但存在两个痛点:
- 企业邮箱服务会拦截直接通过sendmail/postfix发送的邮件
- 家庭宽带IP容易被标记为垃圾邮件来源
解决方案核心
使用msmtp
+mailx
组合方案,通过Gmail SMTP中继转发邮件。优势:
- 支持TLS加密和OAuth2认证
- 自动重试机制
- 配置简单无需修改系统MTA
具体实现步骤
1. 安装必要组件
# Ubuntu/Debian
sudo apt install msmtp mailutils
# CentOS/RHEL
sudo yum install msmtp mailx
2. 配置msmtp(以Gmail为例)
创建~/.msmtprc
配置文件:
# Gmail SMTP配置
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
account gmail
host smtp.gmail.com
port 587
from yourname@gmail.com
user yourname@gmail.com
password your_app_password # 建议使用应用专用密码
protocol smtp
account default : gmail
3. 配置mailx关联
修改~/.mailrc
:
set sendmail="/usr/bin/msmtp"
set message-sendmail-extra-arguments="-a gmail"
测试邮件发送
通过命令行测试:
echo "测试内容" | mail -s "测试主题" target@example.com
进阶配置技巧
1. 邮件队列持久化
# 在cron脚本中添加错误处理
#!/bin/bash
{
# 监控脚本逻辑
/path/to/monitor.sh || {
echo "执行失败" | mail -s "[ALERT] 监控异常" admin@example.com
exit 1
}
} 2>&1 | mail -s "[REPORT] 每日监控" admin@example.com
2. 国内邮箱配置示例(QQ企业邮箱)
account qq
host smtp.exmail.qq.com
port 465
ssl on
from name@yourdomain.com
user name@yourdomain.com
password your_password
常见问题排查
- 535认证失败:检查是否开启SMTP服务/使用应用专用密码
- 连接超时:尝试更换端口(587/465)或检查防火墙
- 邮件进垃圾箱:配置SPF/DKIM记录