Linux cron监控脚本邮件转发配置:通过Gmail SMTP实现稳定投递


阅读 2 次

需求场景

在Linux服务器运维中,我们经常使用cron定时执行监控脚本。这些脚本产生的输出会通过系统邮件服务发送给执行用户(通常是root或自定义用户)。但存在两个痛点:

  1. 企业邮箱服务会拦截直接通过sendmail/postfix发送的邮件
  2. 家庭宽带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记录