Crontab通过msmtp发送电子邮件 - >亚马逊SES

时间:2013-03-06 14:39:45

标签: amazon-web-services cron smtp crontab amazon-ses

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

  

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

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

2 个答案:

答案 0 :(得分:4)

AWS Developer Forums建议的解决方案:

  

事实证明,cron在源代码中有硬编码的“from”地址(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,在“全局”设置(例如cron)或其他使用不能控制的参数调用sendmail的情况下,必须将“debug”标志设置为msmtp的唯一方法)。

     

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

答案 1 :(得分:1)

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

由于问题被隔离到cron,并且symlinking sendmail到msmtp可以在其他地方使用,我不想全局更改msmtp命令。所以我首先创建了/usr/bin/msmtp_cron.bin并使其可执行。

接下来我不得不告诉cron使用它作为邮件路径,通过编辑/ etc / sysconfig / crond来读取:

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消息发送到我的电子邮件帐户。