linux中cron任务发送邮件通知的核心是通过mailto变量让cron自动将任务输出发至指定邮箱,前提是系统已配置可用mta(如postfix)并验证邮件通道正常;用户级任务在crontab开头设mailto=邮箱,系统级任务需在/etc/crontab中配合用户名字段使用,且须注意环境变量缺失问题。

Linux 中设置 cron 任务发送执行邮件通知,核心在于让 cron 将任务的输出(标准输出和错误)自动发到指定邮箱。这不需要额外写发信脚本,只要系统有可用的邮件服务,并正确配置接收地址即可。
确保系统已安装并运行邮件服务
cron 默认通过本地 mail 命令投递邮件,依赖底层 MTA(邮件传输代理),如 postfix、sendmail 或 ssmtp。常见做法是安装 postfix 并启用:
sudo yum install -y postfix # CentOS/RHEL sudo systemctl enable --now postfix
验证是否就绪:
echo "test" | mail -s "cron test" your@email.com
若收到邮件,说明邮件通道正常。
在 crontab 中指定收件人
用户级任务(crontab -e)中,在文件开头添加 MAILTO 行:
MAILTO=your@email.com 0 2 * * * /backup/script.sh
该行必须出现在所有任务之前,且不能带空格或注释。这样,只要 script.sh 有 stdout 或 stderr 输出(哪怕只是 echo "done"),cron 就会自动把内容作为邮件正文发给该地址。
系统级任务(/etc/crontab)需显式指定用户名
格式为:分 时 日 月 周 用户名 命令,MAILTO 同样有效:
MAILTO=admin@company.com 0 3 * * * root /usr/local/bin/rotate_logs.sh
避免因环境差异导致邮件失效
- cron 不加载用户 shell 环境变量(如 PATH),建议脚本内使用绝对路径,或在 crontab 开头统一设置:
SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin MAILTO=you@example.com
- 若脚本本身不产生输出,邮件不会发出。可强制触发通知,例如:
0 4 * * * /backup/script.sh && echo "Backup completed successfully" || echo "Backup failed"
调试技巧
- 查看 cron 日志确认是否尝试发信:
sudo tail -f /var/log/cron - 检查本地邮件队列:
mailq(postfix)或sendmail -bp - 邮件默认发给 MAILTO 设置的地址;未设置则发给执行该任务的用户名对应本地账户(需该账户有邮箱别名或本地投递配置)
基本上就这些。关键不是“调用发信命令”,而是让 cron 自动接管输出投递——前提是邮件服务跑得稳、地址写得准。











