在上一篇文章使用 mailx/mail 命令通过外部 SMTP 服务器发送邮件中,介绍了 mailx 安装和配置。接下来想要达到的效果是:不用在每个定时任务中分别写入邮件发送命令,而是将任务中的标准输出由 Cron 统一经由 mailx 发送出去。

默认情况下,Cron 执行任务列表中的定时任务时,如果任务有标准输出(stdout),则会通过本地的 MTA (如 Sendmail、Postfix) 将输出信息发送到用户的本地邮箱(/var/spool/mail/user 或者 /var/mail/user),例如 /etc/crontab 文件中默认定义了 MAILTO=root

一、配置

1.1 添加 Crond 的启动参数

$ sudo vi /etc/sysconfig/crond

CRONDARGS= 后面写入 -m "mailx -t":

# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS=-m "mailx -t"

这里添加的内容会追加到 Crond 的启动命令中去。-m 选项定义了如果不用默认的本地 MTA(例如 Sendmail)发送邮件,用什么命令代替,这里当时是用 mailx 代替。而之所以会在 mailx 命令后面出现 -t 选项,是因为 Crond 输出的是一个完整格式化的带有标头的邮件信息,mailx 命令的 -t 选项正是用来接收此类信息的。

修改后重启 Crond 服务

$ sudo systemctl restart crond.service
$ # 在查看服务状态的输出中就能看到 Crond 的启动命令已经发生了变化
$ sudo systemctl status crond.service -l

1.2 修改 Cron 的环境变量

打开任务列表文件:

$ sudo vi /etc/crontab

修改 MAILTO 并添加 MAILFROM 环境参数:

MAILTO=目标邮箱
MAILFROM=163邮箱
# 如果出现乱码问题可以添加下面这一行
# CONTENT_TYPE=text/plain; charset=utf-8

MAILTO 定义的是信息发往哪个邮箱。MAILFROM 定义的是 mailx 配置的邮箱账户。

二、测试

配置完毕后添加一个定时任务进行测试:

* * * * * root echo "你好"

保存退出,正常情况每分钟都会收到一封邮件。如果没有收到,可以通过下面的命令查看 Cron 运行的信息:

$ sudo systemctl status crond.service -l

或者查看 Cron 日志文件:

$ sudo vi /var/log/cron
(完)