3

我有一个包含 MAILTO=my.email@example.com 的 crontab。我的服务器使用 msmtp 将电子邮件转发到 Amazon Simple Email Service。我的问题是 cron 命令的输出永远不会到达我的邮箱。这是 msmtp 日志所说的:

3 月 6 日 14:26:02 host=email-smtp.us-east-1.amazonaws.com tls=on auth=on user=MY.SES.USER from=my.email@example.com 收件人=my.email@ example.com smtpstatus=554 smtpmsg='554 交易失败:用户名丢失:?Cron Daemon?.' errormsg='服务器不接受邮件' exitcode=EX_UNAVAILABLE

为了让 Amazon SES 接受 cron 电子邮件,我需要做什么?

4

2 回答 2

4

AWS 开发人员论坛建议的解决方案:

事实证明,cron 在源代码中具有硬编码的“发件人”地址(cron 源代码中的 qv“do_command.c”),因此无法影响 cron 传输到 sendmail 的内容(在我们的例子中,符号链接到“/usr/bin/msmtp”)。

然而,由于 Linux 的魔力,我们确实有能力改变进入 sendmail 的文本流。

我解决这个 cron 限制的方法是将“msmtp”二进制文件移动到“msmtp.bin”,然后创建一个 shell 脚本“/usr/bin/msmtp”:

#! /bin/bash
sed -e 's/root .Cron Daemon./user@example.com/' | /usr/bin/msmtp.bin "$@"

这也是,AFAIK,唯一意味着在“全局”设置中使用时必须将“调试”标志设置为 msmtp(例如 cron,或使用您无法控制的参数调用 sendmail 的其他情况)。

虽然上面的脚本相当简单,但您也可以通过检查魔术“-FCronDaemon”的输入参数来有条件地更改文本,该魔术“-FCronDaemon”也硬编码在 cron 二进制文件中。如果任何其他程序使用“-FCronDaemon”调用 sendmail,我会感到震惊。

于 2014-11-13T17:05:37.153 回答
3

有完全相同的问题,但上面的答案对我不起作用,所以这就是我所做的......

由于问题与 cron 无关,并且将 sendmail 符号链接到 msmtp 可以在其他任何地方使用,我不想为所有内容全局更改 msmtp 命令。所以我首先创建了 /usr/bin/msmtp_cron.bin 并使其可执行。

接下来我必须通过编辑 /etc/sysconfig/crond 来告诉 cron 使用它作为它的邮件路径:

CRONDARGS="-m '/usr/bin/msmtp_cron.bin -t'"

然后不要忘记重新启动 crond(仅重新加载是不够的):

$ sudo systemctl restart crond.service

回到 /usr/bin/msmtp_cron.bin,在这个文件中,我首先必须找出 cron 实际上是在流式传输到 sendmail/msmtp 以了解我可以进行哪些替换:

sed '' > /tmp/cron-mail-capture.txt

这产生了这些标题:

From: "(Cron Daemon)" <root>

它与其他答案略有不同,所以我的 sed 脚本最终看起来像这样:

sed -e 's/..Cron Daemon.* <root>/me@mydomain.com/' | /usr/bin/msmtp -t "$@"

现在它通过 AWS SES 成功地将 cron 消息发送到我的电子邮件帐户。

于 2015-09-29T11:13:58.353 回答