Cron 不发送电子邮件,命令行电子邮件有效

Cron 不发送电子邮件,命令行电子邮件有效

我已在运行 Raspbian 10 Buster 的树莓派上安装了 ssmtp。从命令行发送电子邮件,例如使用,mail效果很好。不过,我还通过将MAILTO变量添加到文件来配置用户的 cron 作业来发送电子邮件。

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).

MAILTO="[email protected],[email protected]"

# we need to set the user path to add the system scripts directory /usr/local/sbin
# I tried with PATH=$PATH:/usr/local/sbin but it used this verbatim in the path
PATH=/usr/sbin:/usr/bin:/bin:/usr/local/sbin:

# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

26 3 * * * cronic python3 ~/redacted_directory_name/redacted_script_name.py
24 22 * * * echo "Testing cron email"

据我从其他在线搜索中了解到(如果我错了请纠正我),cron 默认使用 sendmail 发送电子邮件。

系统上可以使用Sendmail,但它实际上是ssmtp

$ which sendmail
/usr/sbin/sendmail
$ ls -l /usr/sbin/sendmail 
lrwxrwxrwx 1 root root 5 Jul 20  2014 /usr/sbin/sendmail -> ssmtp

在这台机器上,我已将 ssmtp 配置为使用外部 SMTP 服务器发送邮件。

cron 不会向 root 或其他非 sudo 用户发送电子邮件。

在邮件日志中我看到以下内容

$ tail /var/log/mail.log
Jan 17 16:43:02 ed-mh-pi01 sSMTP[25679]: Cannot open mailhub:25
Jan 18 03:22:24 ed-mh-pi01 sSMTP[9846]: Creating SSL connection to host
Jan 18 03:22:25 ed-mh-pi01 sSMTP[9846]: SSL connection using ECDHE_RSA_AES_256_GCM_SHA384
Jan 18 03:22:26 ed-mh-pi01 sSMTP[9846]: Sent mail for root@[email protected] (221 2.0.0 Bye) uid=0 username=root outbytes=638
Jan 18 22:20:02 ed-mh-pi01 sSMTP[6924]: /etc/ssmtp/ssmtp.conf not found
Jan 18 22:20:02 ed-mh-pi01 sSMTP[6924]: Unable to locate mailhub
Jan 18 22:20:02 ed-mh-pi01 sSMTP[6924]: Cannot open mailhub:25
Jan 18 22:24:01 ed-mh-pi01 sSMTP[6988]: /etc/ssmtp/ssmtp.conf not found
Jan 18 22:24:01 ed-mh-pi01 sSMTP[6988]: Unable to locate mailhub
Jan 18 22:24:01 ed-mh-pi01 sSMTP[6988]: Cannot open mailhub:25

Jan 18 22:20:02 和 Jan 18 22:24:02 的条目似乎与 cron 作业电子邮件相关。我当时做了一些测试。

它指出无论发送电子邮件的进程都无权访问/etc/ssmtp/ssmtp.conf.上Arch Linux 维基它指出

/usr/bin/ssmtp 二进制文件作为邮件组运行并可以读取此文件。没有理由将您自己或其他用户添加到邮件组。

我不知道对于 raspbian 来说是否如此,但这让我觉得也许这就是问题所在。我尝试将组所有权/etc/ssmtp/及其内容更改为邮件,如下所示:

$ ls -l /etc/ssmtp/
total 8
-rw-r--r-- 1 root mail 200 Jul 20  2014 revaliases
-rw-r----- 1 root mail 764 Jan 17 12:03 ssmtp.conf

然而问题依然存在

[root] ~ $ tail /var/log/mail.log
<snip>
Jan 18 22:39:01 ed-mh-pi01 sSMTP[7559]: /etc/ssmtp/ssmtp.conf not found
Jan 18 22:39:01 ed-mh-pi01 sSMTP[7559]: Unable to locate mailhub
Jan 18 22:39:01 ed-mh-pi01 sSMTP[7559]: Cannot open mailhub:25

那么,为什么 cron 不发送电子邮件,我该如何修复它?

编辑

如果我(暂时)更改权限以/etc/ssmtp/ssmtp.conf允许任何用户阅读,则会发送电子邮件。这不是一个解决方案,因为该文件包含电子邮件帐户的纯文本密码,并且也没有解释为什么普通用户可以从命令行发送,但 cron 不能。

编辑2

$ ls -l /usr/sbin/ssmtp
-rwxr-xr-x 1 root root 30588 Jul 20  2014 /usr/sbin/ssmtp

答案1

你已经写了,

/usr/bin/ssmtp 二进制文件作为邮件组运行并且可以读取此文件

但您已经证明您的二进制文件并非如此:

-rwxr-xr-x 1 root root 30588 2014 年 7 月 20 日 /usr/sbin/ssmtp

维基百科说的是,

由于您的电子邮件密码以明文形式存储在 /etc/ssmtp/ssmtp.conf 中,因此确保该文件的安全非常重要。默认情况下,整个 /etc/ssmtp 目录只能由 root 和邮件组访问。 /usr/bin/ssmtp 二进制文件作为邮件组运行并可以读取此文件。没有理由将您自己或其他用户添加到邮件组。

因此,您需要更正损坏的权限:

chown -R root:mail /etc/ssmtp /usr/sbin/ssmtp
chmod -R g=u,g-w,o= /etc/ssmtp
chmod a=rx,g+s /usr/sbin/ssmtp

然而我还应该指出,Arch wiki 说的第一件事是,

sSMTP 未维护。考虑使用 msmtp 或 OpenSMTPD 等替代

相关内容