【问题标题】:Gmail Schedule Send Email in DjangoGmail 安排在 Django 中发送电子邮件
【发布时间】:2020-08-23 21:21:41
【问题描述】:

我想模仿 Gmail 的功能,您可以在 Django选择在特定时间发送电子邮件(可能是明天凌晨 3:34)。

我看了django-crontab (https://pypi.org/project/django-crontab/) 之类的东西。

我想出了一个使用django-crontab 来实现此目的的想法:

  1. 制作一个每分钟运行一次的 crontab
  2. 每分钟,检查是否有任何电子邮件需要发送
  3. 发送这些电子邮件

这感觉有点hacky和过度设计。有没有更好的办法?谢谢!

【问题讨论】:

  • celery 怎么样?您可以使用已安排的 celery 任务安排发送电子邮件。如果发送失败,它将允许管理自动重试。
  • @TimofeyKatalnikov 我会调查并回复您!谢谢!!
  • @TimofeyKatalnikov 我正在看这个视频:youtube.com/watch?v=b-6mEAr1m-A,它说我需要一个 celery 服务器。而django-cron 不需要,对吧?
  • 我确信celery 几乎在任何地方都使用django 来管理计划任务。通常它是带有 celery worker 的附加 docker 容器和类似rabbitmq 的东西来管理任务队列。这是一种常见的做法。如果您确定只需要发送电子邮件,那么django-crontab 适合,但我仍然建议使用celery
  • @TimofeyKatalnikov 在这种情况下,我认为最好了解celery 的工作原理。您会碰巧熟悉 AWS EC2 吗?再次感谢您的帮助!

标签: django celery django-cron


【解决方案1】:

您可以查看 celery 以及如何将其与 django 集成。完成后,任务调度就很简单了,首先在settings.py中添加你的gmail配置如下:

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'your_email'
EMAIL_HOST_PASSWORD = 'your password'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
EMAIL_PORT = 465

然后在你的tasks.py中你可以添加如下安排邮件的功能:

from django.template.loader import render_to_string
from django.core.mail import EmailMessage


@periodic_task(
run_every=(crontab(hour=3, minute=34)), #runs exactly at 3:34am every day
name="Dispatch_scheduled_mail",
reject_on_worker_lost=True,
ignore_result=True)
def schedule_mail():
    message = render_to_string('app/schedule_mail.html')
    mail_subject = 'Scheduled Email'
    to_email = getmail
    email = EmailMessage(mail_subject, message, to=[to_email])
    email.send()

最后是您的电子邮件模板“schedule_mail.html”

{% autoescape off %}
Hello ,

This is a test email
if you are seeing this, your email got delivered!

Regards,
Coding Team.
{% endautoescape %}

以及以节拍方式运行 celery 服务的命令:

celery -A yourapp beat --loglevel=info

将“yourapp”替换为您的应用名称。 干杯!!

【讨论】:

  • 非常感谢您的回答!!我需要这样做,以便有人可以在我的前端选择何时发送电子邮件。因此,每当有人在我的前端输入 cron 作业时,都需要以编程方式设置它。那有意义吗?我怎么能这样做?
  • 不客气,别忘了给答案投票。在 Celery Beat 中无法动态传递参数
  • 我认为没有办法在 celery beat 中动态传递时间参数,因为 beat 首先在启动时注册计划任务。如上所示,唯一的方法是以编程方式进行。May b 你可以尝试调用从前端提供时间的任务然后执行计算并将电子邮件功能延迟到计算的时间
  • 这更像是一个逻辑问题而不是编程问题。我认为他们的逻辑是 crontab 每分钟运行一次,然后检查时间是否与预定电子邮件的可用队列一致。如果是,则发送电子邮件并将其从队列中删除,否则通过
  • 好吧,没那么多。我曾经在 aws ec2 实例上部署过一次。我主要使用数字海洋。但我认为如果它的 Iaas 而不是 Paas 基础设施,那么它几乎相似。
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2022-06-17
  • 2021-06-30
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多