如何用 MAILTO 让 cron 把任务输出(错误)发到邮箱?
crontab 里设 MAILTO=邮箱 即可接收任务输出邮件;只想收错误就把 stdout 重定向掉只留 stderr;前提是系统有可用的 MTA。本文给出配置与精细化收信技巧。
做法:在 crontab 里加一行 MAILTO=ops@example.com——之后该 crontab 中任务的任何输出**(stdout+stderr)都会以邮件发到该地址;设 MAILTO="" 则完全禁发。只要错误通知的技巧:任务里把 stdout 重定向到日志文件,stderr 留给邮件。前提:系统装了 MTA(postfix/msmtp),否则输出被丢弃。**
基本配置
MAILTO=ops@example.com
*/10 * * * * /app/jobs/backup.sh
0 3 * * * /app/jobs/report.sh
MAILTO 作用于其后的所有任务;crontab 里可以多次设置分段生效。
三种取值
MAILTO=ops@example.com # 发到指定邮箱
MAILTO=root # 发给本机用户(本地邮箱)
MAILTO="" # 不发任何邮件
只要错误不要全部输出(实用技巧)
成功输出刷屏没意义,只要失败通知:
MAILTO=ops@example.com
*/10 * * * * /app/jobs/backup.sh >> /var/log/backup.log 2>&1 || /app/jobs/alert.sh
更精细的:stdout 进日志、stderr 走邮件——
*/10 * * * * /app/jobs/backup.sh >> /var/log/backup.log
stdout 被重定向进文件后,剩下的 stderr 输出仍会走 MAILTO 邮件。
收不到邮件的排查
- 系统没 MTA:日志里有
No MTA installed, discarding output——装 postfix 或 msmtp 并配好外发 - 邮件进垃圾箱:检查垃圾邮件文件夹;给发件域配 SPF 记录提高送达率
- 云服务器 25 端口被封:用 msmtp 走 587 端口的第三方 SMTP
- 任务根本没执行:
grep CRON /var/log/syslog先确认触发
现代替代:平台化告警
邮件通知的局限:到达慢、易被淹、无法聚合。任务输出采集进观测云后,用监控器做失败告警与缺失告警(该跑没跑),通知渠道支持钉钉/企微/飞书等,比邮件链路可靠得多。
常见问题(FAQ)
Q:多个收件人怎么写?
A:MAILTO 只接受单个地址;要群发用邮件别名/群组地址,或在任务里自行调用 mail 命令。
Q:邮件主题能自定义吗?
A:cron 自动生成的主题固定为 Cron <user@host> 命令;要自定义就在任务脚本里自己调用 mail/msmtp 发。
Q:输出太多邮件被截断?
A:邮件本来就扛不了大输出——详细日志写文件,邮件里只留结论(脚本自己控制输出量)。