我如何通过python django发送电子邮件频繁与cronjob?



我尝试在django中每5分钟运行一个函数。为此,我使用django-crontab包。函数应该运行,检查数据库中的一些条件,如果满足,发送电子邮件给应用程序的用户。

我有django 4在我的linux ubuntu 20.04服务器上运行。我通过python3 manage.py crontab add(在激活的虚拟环境中)添加了cronjob。但我想知道为什么cronjob没有运行。我试着手工执行这个任务,结果成功了。

我认为问题归结为:当我在激活的虚拟环境中运行"python3 manage.py crontab run "它的工作原理。但是当我在虚拟环境之外运行它时,我得到以下错误:

Failed to complete cronjob at ('*/5 * * * *', 'evaluation_tool.scripts.cron.send_mail_if_classeval_ended')
Traceback (most recent call last):
File "/var/www/amadeus/lib/python3.10/site-packages/django_crontab/crontab.py", line 145, in run_job
func(*job_args, **job_kwargs)
File "/var/www/amadeus/evaluation_tool/scripts/cron.py", line 12, in send_mail_if_classeval_ended
send_mail_time_over_class_evaluation(class_evaluation=class_evaluation.pk,
File "/var/www/amadeus/evaluation_tool/scripts/email_handler.py", line 122, in send_mail_time_over_class_evaluation
send_falko_mail("AMADEUS Evaluation abgeschlossen", message, to_email_address)
File "/var/www/amadeus/evaluation_tool/scripts/email_handler.py", line 34, in send_falko_mail
msg.send(fail_silently=False)
File "/var/www/amadeus/lib/python3.10/site-packages/django/core/mail/message.py", line 298, in send
return self.get_connection(fail_silently).send_messages([self])
File "/var/www/amadeus/lib/python3.10/site-packages/django/core/mail/backends/smtp.py", line 124, in send_messages
new_conn_created = self.open()
File "/var/www/amadeus/lib/python3.10/site-packages/django/core/mail/backends/smtp.py", line 87, in open
self.connection.starttls(
File "/usr/lib/python3.10/smtplib.py", line 769, in starttls
self.ehlo_or_helo_if_needed()
File "/usr/lib/python3.10/smtplib.py", line 611, in ehlo_or_helo_if_needed
if not (200 <= self.ehlo()[0] <= 299):
File "/usr/lib/python3.10/smtplib.py", line 451, in ehlo
self.putcmd(self.ehlo_msg, name or self.local_hostname)
File "/usr/lib/python3.10/smtplib.py", line 378, in putcmd
self.send(f'{s}{CRLF}')
File "/usr/lib/python3.10/smtplib.py", line 365, in send
raise SMTPServerDisconnected('please run connect() first')
smtplib.SMTPServerDisconnected: please run connect() first

为什么到SMTP服务器的连接在激活的虚拟环境中工作,而不是在外部工作,这是使用cronjob的理想方式?

我找到问题了。

我为SMTP主机、用户和密码设置了一些环境变量。但是crontab不能访问它们。所以有两种可能:

  1. 通过crontab -e
  2. 将它们直接添加到cron文件的头部
EMAIL_HOST=XXX
EMAIL_HOST_USER=XXX
EMAIL_PASS=XXX
  1. 通过settings.py中的django-crontab参数添加它们:
CRONTAB_COMMAND_PREFIX = 'EMAIL_HOST=XXXnEMAIL_HOST_USER=XXXnEMAIL_PASS=XXX'

最新更新