Cron

Cron 不發送電子郵件,命令行電子郵件有效

  • January 19, 2022

我在執行 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="person1@myredacteddomain.tld,person2@myredacteddomain.tld"

# 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@redactedhostname@myredacteddomain.tld (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 wiki上它指出

/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

你已經寫了,

/usr/bin/ssmtp 二進製文件作為郵件組執行並且可以讀取此文件

但是您已經證明您的二進製文件並非如此:

-rwxr-xr-x 1 根 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 之類的東西

引用自:https://unix.stackexchange.com/questions/686816