请注意:我做了研究和实验,但我无法解决这个问题;有许多部分解决方案并没有解决我的所有问题。不要轻易忽略这个问题。
场景:Ubuntu Linux 20.04,服务器版本。
- 我希望所有 cron 作业失败时都能收到电子邮件通知到外部地址;
- 我无法控制所有 cron 作业文件。有时,某个软件包会将内容放入 /etc/cron.$something$/ 中,我不想编辑/更新/修改此类文件。但如果发生意外,我仍然希望收到电子邮件。因此,我无法在作业中设置“MAILTO”。
- 我想使用外部 SMTP 服务器(在这个特定实例中我目前使用 AWS SES)来中继电子邮件消息,因为我的服务器的主机 IP 地址很少(如果有的话)被接受为发送电子邮件的“好”IP。
- 服务器相当小;理想情况下,我想使用无守护进程的方法来发送邮件;配置一个大型、成熟的 SMTP 服务器(例如 OpenSMTPD?)来仅中继内部电子邮件似乎有点超出我的范围;如果我发现确认可以做我想做的事情,我可以这样做。
我尝试过不同组合的 MTA 配置,比如 ssmtp/msmtp,但发现没有人能同时解决所有问题;事实上:
- Ubuntu 的
cron
实现似乎是将/usr/lib/sendmail
所需的参数硬编码到源代码中,所以我只能使用 sendmail 模拟。 - 带有 sendmail 仿真的 ssmtp 可以正确处理反向别名(本地用户作为发件人发送给任意用户 -> 例如从 root 发送 = 来自: [电子邮件保护])。这至关重要,因为 AWS SES 需要注册、验证的发件人才能发送电子邮件。但通过 sendmail 模拟的 ssmtp 不支持“直接”别名(重写‘收件人:’,因此如果 cron 尝试向“root”发送电子邮件,则不会发生重写并且发送将失败。如果使用“邮件”CLI,它会起作用(因为它会处理别名),但无法在 cron 中设置这样的可执行文件。
- 使用 msmtp 时,“直接”别名有效,但不支持反向别名;因此从“root”重写为“[电子邮件保护]“这并没有发生,SMTP 服务器拒绝了该电子邮件。
- 似乎没有办法为 cron 作业设置全局“MAILTO”;每个作业都需要有自己的变量(并且,正如我所说,我不想编辑系统提供的作业)。
回顾:我想要一种方法来将系统中任何用户的 cron 作业中的所有错误的电子邮件发送到目标[email protected]
邮箱,即使是我没有编写并且我不想修改的 cronjobs,我需要使用对“发件人”字段执行验证的外部 SMTP 服务器。
我愿意接受任何解决方案,只要我不需要重新编译必要的系统软件包即可cron
。而且它必须完全无人看管 - 无需照看。