如何用 MAILTO 让 cron 把任务输出(错误)发到邮箱?

crontab 里设 MAILTO=邮箱 即可接收任务输出邮件;只想收 stderr 可重定向 stdout,但这不等于按退出状态检测失败;前提是系统有可用的 MTA。本文给出配置与精细化收信技巧。

最佳实践
如何用 MAILTO 让 cron 把任务输出(错误)发到邮箱?封面

做法:在 crontab 里加一行 MAILTO=ops@example.com——之后该 crontab 中任务的任何输出**(stdout+stderr)都会以邮件发到该地址;设 MAILTO="" 则完全禁发。只发送 stderr 内容的技巧(不等于按退出状态判失败):任务里把 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,但非零退出而无输出不会自动发邮件,成功时的警告也可能发。alert.sh 应明确输出或发送通知,并保留原任务退出码。

收不到邮件的排查

  1. 系统没 MTA:日志里有 No MTA installed, discarding output——装 postfix 或 msmtp 并配好外发
  2. 邮件进垃圾箱:检查垃圾邮件文件夹;给发件域配 SPF 记录提高送达率
  3. 云服务器 25 端口被封:用 msmtp 走 587 端口的第三方 SMTP
  4. 任务根本没执行:grep CRON /var/log/syslog 先确认触发

现代替代:平台化告警

邮件通知的局限:到达慢、易被淹、无法聚合。任务输出采集进观测云后,用监控器做失败告警与缺失告警(该跑没跑),通知渠道支持钉钉/企微/飞书等,比邮件链路可靠得多。

常见问题(FAQ)

Q:多个收件人怎么写?
A:Cronie 等实现支持逗号分隔地址列表,如 MAILTO="a@example.com,b@example.com";按本机 cron 文档验证,或使用邮件别名/群组。

Q:邮件主题能自定义吗?
A:cron 自动生成的主题固定为 Cron <user@host> 命令;要自定义就在任务脚本里自己调用 mail/msmtp 发。

Q:输出太多邮件被截断?
A:邮件本来就扛不了大输出——详细日志写文件,邮件里只留结论(脚本自己控制输出量)。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台