我正在设置一台新的 Linux 计算机。我安装了 s-nail(sudo apt install s-nail)以便从命令行(和我的脚本)向 Internet 上的任何电子邮件地址发送电子邮件。在使用我的 gmail SMTP 服务器凭据将必要的行添加到 /etc/s-nail.rc 后,一切现在都正常运行。
这台计算机上没有安装其他软件包(mail、mailx、sendmail、postfix、ssmtp 等均不存在)。
但是现在,当 cron 任务失败时,我无法让 crontab 给我发送电子邮件(发送到我的 gmail 地址)。我不太明白事情究竟是如何运作的,但我猜 s-nail 不需要本地 MTA,而 cron 需要本地 MTA?
有没有办法让 cron 给我发电子邮件,而无需安装任何其他软件包?我可以创建指向 mail、mailx 和 sendmail(全部指向 s-nail)的符号链接来“欺骗” crontab 吗?
谢谢。
答案1
1. 让 crons-nail
成为mail
cron 有一个内部机制,用于将作业输出发送给电子邮件收件人。该机制需要一个具有以下接口的外部程序sendmail
(看)或者在 Ubuntu 上,显然还有一个界面mail
(看sendmail
)。 可能,cron 会选择和中的第一个mail
,就像其他程序一样(看)。
什么是不是工作是符号链接sendmail
到s-nail
。问题是,s-nail
不兼容。cron
会抱怨无法识别的自定义标题选项-S
、缺少邮件正文或类似问题。相反,作者网页说:
它旨在提供 POSIX mailx(1) 命令的功能
但是的界面mailx
与 类似mail
!事实上,解决方法似乎是这样的:
/usr/bin/mail
您可以创建一个从到 的符号链接/usr/bin/s-nail
。[…]确保/usr/sbin/sendmail
未安装,因为它[将]首先尝试使用sendmail
[来源]
这些说明是关于如何让 unattended-upgrades 脚本用于s-nail
发送电子邮件的,但 cron 的行为方式相同,所以请尝试一下。(我自己还没有尝试过。)
2. 或者s-nail
在单独的 cronjob 中使用
如果上述解决方案 1 不起作用,并且您真的想要使用,您可以将输出的邮件发送集成到要执行的s-nail
每个命令中。条目可能如下所示:cron
crontab
# every minute, execute your_command and send sterr by e-mail (but not stdout)
* * * * * { ./your_command > /dev/null ; } 2>&1 | s-nail -s 'A subject' [email protected]
3. 或者使用msmtp
或ssmtp
代替sendmail
如果您还不打算使用s-nail
,那么这个替代方案是一个相当优雅和简单的解决方案。为此,您可以让 cron 依赖界面sendmail
来发送邮件,并安装一个sendmail
集成了大部分便利功能的现代替代方案s-nail
(例如直接通过外部 SMTP 服务器发送,而无需本地邮件服务器)。
ssmtp
和msmtp
都是此类程序。请参阅在 Ask Ubuntu 上有关使用 cron 的详细说明ssmtp
。安装时ssmtp
,它将已安装一个符号链接sendmail
到其二进制文件。
但显然,ssmtp
现在已不再维护,并且msmtp
是其拟议的继任者(迁移指南)。