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 命令,它们工作正常),但电子邮件部分不起作用。
这是我尝试修复的方法:
- 运行 作为根 crontab 的命令(即
$ sudo crontab -e
)
- 运行 crontab 作为用户 crontab(即
$crontab -e)
),但在 crontab 命令中带有 sudo python3 ...
。
- 在 crontab 文件的顶部添加路径目录,以防无法解析这些目录
- 已安装 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)。
- (编辑)我已经通过 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
解释器。我不知道为什么会有所不同。
经过多次故障排除,我终于解决了这个问题。这是有效的方法。
- 我保持原来的设置相同:Sendgrid for SMTP 使用他们的 python 库(没有 Postfix 或 smtplib),使用用户 crontab(使用
$ crontab -e
而不是 $ sudo crontab -e
),以及使用 Python 3.7.
- 显然 python 脚本名称中的单词 'email' 可能会导致解释器问题,因此我重命名了文件以删除单词 'email'。例如,
send_noti.py
而不是 send_email.py
- 我在 python 脚本中对文件的每次调用都使用了绝对路径。我在我的 python 脚本中读取、写入和执行用户目录中的文件以及发送电子邮件。这些 R、W、X 命令在 cron 中开始出错,但由于某种原因从 cron 外部调用时不会出错,即使在重命名文件之后也是如此。对所有文件引用使用绝对路径修复了这个问题。
- 我还在 crontab 文件中使用了 python 文件的绝对路径。例如,
* * * * * python3 /home/ec2-user/apps/send_noti.py
而不是 * * * * * python3 ~/apps/send_noti.py
- 我删除了之前放入的crontab文件中不需要的项目,比如重新定义PATH目录。
我希望这对某人有所帮助,因为我花了大约 3 周的时间进行故障排除和弄清楚。
我有一个 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 命令,它们工作正常),但电子邮件部分不起作用。
这是我尝试修复的方法:
- 运行 作为根 crontab 的命令(即
$ sudo crontab -e
) - 运行 crontab 作为用户 crontab(即
$crontab -e)
),但在 crontab 命令中带有sudo python3 ...
。 - 在 crontab 文件的顶部添加路径目录,以防无法解析这些目录
- 已安装 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)。 - (编辑)我已经通过 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
解释器。我不知道为什么会有所不同。
经过多次故障排除,我终于解决了这个问题。这是有效的方法。
- 我保持原来的设置相同:Sendgrid for SMTP 使用他们的 python 库(没有 Postfix 或 smtplib),使用用户 crontab(使用
$ crontab -e
而不是$ sudo crontab -e
),以及使用 Python 3.7. - 显然 python 脚本名称中的单词 'email' 可能会导致解释器问题,因此我重命名了文件以删除单词 'email'。例如,
send_noti.py
而不是send_email.py
- 我在 python 脚本中对文件的每次调用都使用了绝对路径。我在我的 python 脚本中读取、写入和执行用户目录中的文件以及发送电子邮件。这些 R、W、X 命令在 cron 中开始出错,但由于某种原因从 cron 外部调用时不会出错,即使在重命名文件之后也是如此。对所有文件引用使用绝对路径修复了这个问题。
- 我还在 crontab 文件中使用了 python 文件的绝对路径。例如,
* * * * * python3 /home/ec2-user/apps/send_noti.py
而不是* * * * * python3 ~/apps/send_noti.py
- 我删除了之前放入的crontab文件中不需要的项目,比如重新定义PATH目录。
我希望这对某人有所帮助,因为我花了大约 3 周的时间进行故障排除和弄清楚。