我有一个包含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电子邮件,我需要做些什么?
答案 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消息发送到我的电子邮件帐户。