Crontab 不从 AWS Linux 2 上的 Python 脚本发送 Sendgrid 电子邮件

Crontab not sending Sendgrid emails from Python script on AWS Linux 2

我有一个 AWS 亚马逊 Linux 2 盒子。我正在使用 python 脚本 (Python 3.7) 发送电子邮件,使用 Sendgrid 作为 SMTP 服务。我可以使用 $ python3 send_email.py 发送电子邮件,但是,当我使用 crontab($ crontab -e 然后 * * * * * python3 ~/apps/send_email.py)时,日志文件 /var/log/cron 中的错误是 (CRON) EXEC FAILED (/usr/sbin/sendmail): No such file or directory。 crontab 按预期工作(我测试了其他 cron 命令,它们工作正常),但电子邮件部分不起作用。

这是我尝试修复的方法:

  1. 运行 作为根 crontab 的命令(即 $ sudo crontab -e
  2. 运行 crontab 作为用户 crontab(即 $crontab -e)),但在 crontab 命令中带有 sudo python3 ...
  3. 在 crontab 文件的顶部添加路径目录,以防无法解析这些目录
  4. 已安装 Postfix 以在 /usr/bin/sendmail 目录中安装一些东西,但是,由于我不需要它 运行 使用 $ python3 send_email.py 的 Sendgrid 支持的电子邮件,我不确定为什么我会通过 cron 需要它。不过,我可能完全错了。安装 Postfix 后,它解决了 cron 日志中的 (CRON) EXEC FAILED (/usr/sbin/sendmail): No such file or directory 错误 - 这种情况下的日志条目是 (ec2-user) CMD (python3 ~/apps/send_email.py) - 但我没有收到电子邮件。可能是因为没有为我使用的 SMTP 配置 Postfix (Sendgrid)。
  5. (编辑)我已经通过 the Sendgrid docs 配置 Sendgrid 与 Postfix 一起工作,但它仍然不会向我发送电子邮件,尽管看起来 Postfix 日志中没有任何错误...
Jun  1 20:27:02 ip-[my-ip] postfix/pickup[25506]: 101769641F3: uid=1000 from=<ec2-user>
Jun  1 20:27:02 ip-[my-ip] postfix/cleanup[25508]: 101769641F3: message-id=<20210601202702.101769641F3@ip-[my-ip].us-east-2.compute.internal>
Jun  1 20:27:02 ip-[my-ip] postfix/qmgr[25507]: 101769641F3: from=<ec2-user@ip-[my-ip].us-east-2.compute.internal>, size=1165, nrcpt=1 (queue active)
Jun  1 20:27:02 ip-[my-ip] postfix/local[25510]: 101769641F3: to=<ec2-user@ip-[my-ip].us-east-2.compute.internal>, orig_to=<ec2-user>, relay=local, delay=0.01, delays=0/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Jun  1 20:27:02 ip-[my-ip] postfix/qmgr[25507]: 101769641F3: removed

我的想法是,在 Sendgrid python 库(与 sudo pip install sendgrid 一起安装)的 cron 调用中有一些失败,但在 python 调用时不会发生它直接使用 CLI 中的 python3 解释器。我不知道为什么会有所不同。

经过多次故障排除,我终于解决了这个问题。这是有效的方法。

  1. 我保持原来的设置相同:Sendgrid for SMTP 使用他们的 python 库(没有 Postfix 或 smtplib),使用用户 crontab(使用 $ crontab -e 而不是 $ sudo crontab -e),以及使用 Python 3.7.
  2. 显然 python 脚本名称中的单词 'email' 可能会导致解释器问题,因此我重命名了文件以删除单词 'email'。例如,send_noti.py 而不是 send_email.py
  3. 我在 python 脚本中对文件的每次调用都使用了绝对路径。我在我的 python 脚本中读取、写入和执行用户目录中的文件以及发送电子邮件。这些 R、W、X 命令在 cron 中开始出错,但由于某种原因从 cron 外部调用时不会出错,即使在重命名文件之后也是如此。对所有文件引用使用绝对路径修复了这个问题。
  4. 我还在 crontab 文件中使用了 python 文件的绝对路径。例如,* * * * * python3 /home/ec2-user/apps/send_noti.py 而不是 * * * * * python3 ~/apps/send_noti.py
  5. 我删除了之前放入的crontab文件中不需要的项目,比如重新定义PATH目录。

我希望这对某人有所帮助,因为我花了大约 3 周的时间进行故障排除和弄清楚。