我已在运行 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 等替代