Ubuntu 定时器设置邮件通知
一、方案总览
- 使用 cron 定时执行脚本,脚本内通过邮件客户端发送邮件;或在系统的 crontab 中直接利用 MAILTO 将任务输出作为邮件发送。
- 常见邮件客户端:s-nail / heirloom-mailx(轻量、易配置 SMTP)、mutt + msmtp(灵活、可写日志、便于排错)。
- 基本流程:安装客户端 → 配置 SMTP(发件邮箱、SMTP 地址、端口、授权码)→ 命令行测试 → 写成脚本 → 用 crontab 定时执行(或在 /etc/crontab 设置 MAILTO)。
二、方案一 s-nail 或 heirloom-mailx 快速配置
- 安装
- 安装 s-nail:sudo apt install s-nail
- 或安装 heirloom-mailx:sudo apt install heirloom-mailx
- 配置 SMTP(以 163 邮箱为例,编辑 /etc/s-nail.rc 或 ~/.mailrc)
- set from=“your@163.com”
- set smtp=“smtp.163.com”
- set smtp-auth-user=“your@163.com”
- set smtp-auth-password=“你的SMTP授权码”
- set smtp-auth=login
- 说明:多数邮箱需开启 SMTP 并使用“授权码”而非登录密码;如使用 SSL/TLS,常见端口为 465/587,可在 smtp= 中写成 smtps://smtp.xxx.com:465。
- 命令行测试
- echo “邮件内容” | s-nail -s “标题” to@xxx.com
- 或 echo “邮件内容” | heirloom-mailx -vs “标题” to@xxx.com
- 脚本示例(/home/user/ipnow.sh)
- #!/bin/bash
IP=$(ip a | awk ‘/inet / && !/127.|::/{print $2; exit}’)
ts=$(date “+%F %T”)
echo “主机:$(hostname) 时间:$ts IP:$IP” | s-nail -s “[定时] $ts IP信息” to@xxx.com
- 赋权:chmod +x /home/user/ipnow.sh
- 定时执行(crontab -e)
- 每 10 分钟:*/10 * * * * /home/user/ipnow.sh
- 每天 08:30:30 8 * * * /home/user/ipnow.sh
- 说明:cron 默认用 /bin/sh,脚本中建议使用绝对路径;如需捕获输出,可在命令后重定向到日志文件以便排查。
三、方案二 mutt + msmtp 更可控(推荐用于生产)
- 安装
- sudo apt install mutt msmtp
- 配置 msmtp(~/.msmtprc,权限必须为 600)
- account default
host smtp.163.com
from your@163.com
auth on
user your@163.com
password 你的授权码
port 465
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile ~/.msmtp.log
- chmod 600 ~/.msmtprc
- 配置 mutt(/etc/muttrc 或 ~/.muttrc)
- set sendmail=“/usr/bin/msmtp”
- set use_from=yes
- set realname=“发件人昵称”
- set from=“your@163.com”
- set envelope_from=yes
- 命令行测试
- echo “邮件内容” | mutt -s “标题” to@xxx.com
- 带附件:echo “内容” | mutt -s “标题” to@xxx.com -a /path/file.txt
- 脚本示例(/home/user/report.sh)
- #!/bin/bash
ts=$(date “+%F %T”)
body=“主机:$(hostname) 时间:$ts 状态:OK”
echo “$body” | mutt -s “[定时] $ts 报告” to@xxx.com -a /var/log/syslog
- 赋权:chmod +x /home/user/report.sh
- 定时执行(crontab -e)
- 每 30 分钟:*/30 * * * * /home/user/report.sh >> /var/log/mailjob.log 2>&1
- 说明:建议将 stdout/stderr 重定向到日志,便于 msmtp 与 cron 的排错(msmtp 的 logfile 记录发送细节)。
四、cron 输出邮件与系统级 MAILTO
- 直接在 /etc/crontab 或 root 的 crontab 中使用 MAILTO:
- MAILTO=“admin@xxx.com”
- 0 2 * * * root /usr/local/bin/daily_report.sh
- 说明:当任务有标准输出或错误输出时,cron 会尝试把输出作为邮件发送给 MAILTO 指定的地址;若 MAILTO=“” 则不发送邮件。此方式依赖系统邮件传输代理(MTA),若未配置 MTA,建议使用前述“脚本内调用 s-nail/msmtp”的方案更稳妥。
五、常见问题与排查
- 认证失败:确认已开启邮箱 SMTP 并使用“授权码”,而非登录密码;检查用户名、密码、端口与加密方式是否匹配。
- 命令未找到:在脚本中使用命令的绝对路径(如 /usr/bin/s-nail、/usr/bin/msmtp),或在 crontab 顶部设置 PATH。
- 发送为空被拒:部分邮箱要求邮件必须有主题与正文,测试时确保 -s 与内容均不为空。
- 附件参数差异:有的系统上附件参数是 -a,也有的是 -A,按所用客户端与系统调整。
- 日志与排错:msmtp 使用 logfile 记录发送过程;cron 建议将任务输出重定向到日志文件,便于定位问题。