如何让 crontab 用输出给我发电子邮件?

Clo*_*kex 60 email cron postfix

如何让 crontab 将其作业的输出通过电子邮件发送给我?我有MAILTO=redacted@yahoo.com.au上面的工作,但它不起作用。

我知道我需要使用 Postfix 或 Sendmail 之类的东西,但在我的一生中,我不知道如何实现这一点。我已经搜索并搜索了有关设置 Postfix 的简单指南,但它们都非常复杂,并希望您设置整个服务器来发送和接收电子邮件并了解所有术语(例如,什么是域名用于外发电子邮件?)。

我想要做的就是让 crontab 给我发电子邮件。为什么这么难??

附加信息:

我的 crontab 文件如下所示:

MAILTO=redacted@yahoo.com.au
1 0 * * * ~/Desktop/toskymesh.sh
59 6 * * * ~/Desktop/tooptus.sh
0 3 * * * snapraid sync
Run Code Online (Sandbox Code Playgroud)

更多附加信息:

的输出 ps -ef | grep '[s]endmail'

root 6840 1370 0 10:26 ? 00:00:00 sendmail: MTA: accepting connections
Run Code Online (Sandbox Code Playgroud)

我确信 cron 正在工作,但echo Test | mail -s Test redacted@yahoo.com.au无论如何我正在测试邮件命令。

Clo*_*kex 46

最后我用了sSMTP. 它远比Postfixor简单得多,sendmail并且可以出色地完成工作。

为了将来参考,以下是如何将 sSMTP 与 Yahoo Mail 一起使用(别担心,它远没有看起来那么复杂):

  • 使用 Synaptic 下载 ssmtp。或者,您可以运行sudo apt-get install ssmtp.

  • /etc/ssmtp/ssmtp.conf.打开配置文件。

  • 使配置看起来像这样:

    root=[yourRealEmail@yahoo.com.au]
    mailhub=smtp.mail.yahoo.com:587
    FromLineOverride=YES
    UseSTARTTLS=YES
    AuthUser=[yourRealEmail@yahoo.com.au]
    AuthPass=[yourRealYahooPassword]
    TLS_CA_File=~/cert.pem
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用 OpenSSL 创建 cert.pem 文件。我使用了命令openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 9999 -nodes(有关如何使用 OpenSSL 创建自签名证书的更多信息)。你可以把文件粘贴到任何地方,但我只是把它放在 ~/. 无论你把它放在哪里,请确保将TLS_CA_File=ssmtp.conf 中的行指向正确的位置。

  • 打开文件/etc/ssmtp/revaliases并添加以下行:

    [yourPCUsername]:[yourRealEmail@yahoo.com.au]:smtp.mail.yahoo.com:587
    
    Run Code Online (Sandbox Code Playgroud)

    如果您以 root 身份运行,我认为您需要添加另一行将您的名字替换为“root”。

  • 就是这样,你可以走了!要进行测试,最简单的方法 (IMO) 是创建一个包含以下内容的文件:

    To: [yourRealEmail@yahoo.com.au]
    From: "whateverYaWant" <[yourRealEmail@yahoo.com.au]>
    Subject: Some Notifying Email
    MIME-Version: 1.0
    Content-Type: text/plain
    
    Body of your email goes here! Hello world!
    
    Run Code Online (Sandbox Code Playgroud)
  • 保存并关闭文件,然后检查您是否安装了真正的sendmail,运行sendmail -V- 它应该显示“sSMTP”。

  • 最后,运行cat fileWithEmailInIt.txt | sendmail -i -t,然后等待几秒钟(10-30)并检查您的电子邮件!

显然,替换[yourRealEmail@yahoo.com.au]为您的电子邮件(不带括号)和[yourRealYahooPassword]您的 Yahoo Mail 密码(同样,不带括号)。

附加说明 1:如果您在使用 Gmail 时遇到问题,请尝试此答案的选项 1 。
(感谢本 Creasy!)

附加说明 2:如果邮件是从命令行发送而不是通过 crontab 发送,请尝试更改FromLineOverrideNOin /etc/ssmtp/ssmtp.conf。您还可以通过添加Debug=YES来获得更详细的日志记录ssmtp.conf- 额外的日志记录转到/var/log/mail.log.
(感谢Jakub Kukul!)

  • 感谢您的 sSMTP 建议。Ubuntu Wiki 有一个 [有用的指南](https://help.ubuntu.com/community/EmailAlerts)(但不要使用当前显示的“主机名”的电子邮件地址)。[这个答案](https://askubuntu.com/a/800361/184420) 建议您可以使用默认服务器证书,但我发现我不需要“TLS_CA_File=”行来通过 GMail 发送。 (2认同)
  • @马特M。没有被弃用,只是没有维护。在非生产环境中使用 sSMTP 应该完全没问题:) (2认同)
  • 我今天遇到了与 @ES 相同的问题 - 通过命令行发送邮件工作正常,但没有通过 crontab 发送邮件。我通过在“/etc/ssmtp/ssmtp.conf”中将“FromLineOverride”更改为“NO”来修复此问题。在调试过程中,将“Debug=YES”添加到“ssmtp.conf”也很有帮助 - 它会导致更详细的信息被记录到“/var/log/mail.log”。 (2认同)

Oli*_*Oli 18

安装后缀。它比大多数其他包更复杂,但它仍然不复杂

sudo apt-get install postfix
Run Code Online (Sandbox Code Playgroud)

选择“Internet 站点”,然后接受所有默认设置。然后我们只需要停止外部连接,把它变成一个“空客户端”。运行:sudoedit /etc/postfix/main.cf并找到inet_interfaces设置(接近尾声)并将其更改为loopback-only,如下所示:

inet_interfaces = loopback-only
Run Code Online (Sandbox Code Playgroud)

最后用sudo /etc/init.d/postfix restart(重新加载不会做)重新启动 Postfix 。

您现在有一个 Postfix 安装,它不会为外部机器中继电子邮件,它只会接受 127.0.0.1(和 ::1 用于 IPv6)上的连接。


另外,您的 cron 行可能无法正常工作,因为您使用的是非相对路径和带有 Bash 替换的路径。sh不理解~并且它可能没有正确的PATH设置。所以将它们替换为(我只是在猜测实际路径):

1 0 * * *   /home/clonkex/Desktop/toskymesh.sh
59 6 * * *  /home/clonkex/Desktop/tooptus.sh
0 3 * * *   /usr/bin/snapraid sync
Run Code Online (Sandbox Code Playgroud)

如果您的脚本需要从特定目录运行,请确保它们cd进入正确的目录。不要假设它cron会在正确的位置,因为它可能不会。

  • 我需要`inet_interfaces = localhost`。仅环回给了我`后缀:致命:配置变量 inet_interfaces:找不到主机:仅环回` (2认同)

小智 5

我在 exim4 上运气很好。

sudo apt-get install alpine exim4 mailutils eximon4 spf-tools-perl swaks
Run Code Online (Sandbox Code Playgroud)

(alpine只是我喜欢使用的邮件客户端)

之后我跑了

sudo dpkg-reconfigure exim4-config
Run Code Online (Sandbox Code Playgroud)

并按照提示进行操作。此页面: https: //help.ubuntu.com/community/Exim4也非常有帮助。我花了大约 10 分钟才让它运行起来。