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

crontab 里设 MAILTO=邮箱 即可接收任务输出邮件;只想收错误就把 stdout 重定向掉只留 stderr;前提是系统有可用的 MTA。本文给出配置与精细化收信技巧。

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

做法:在 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 邮件。

收不到邮件的排查

  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:MAILTO 只接受单个地址;要群发用邮件别名/群组地址,或在任务里自行调用 mail 命令。

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

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

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台