【问题标题】:Django - how to send mail 5 days before event?Django - 如何在活动前 5 天发送邮件?
【发布时间】:2018-12-25 01:10:00
【问题描述】:

我是初级 Django 开发人员。得到了我的第一个项目。做得很好,但教我的高级开发人员去度假了....

我的公司有一个任务,要创建一个功能,该功能将在活动前 5 天通过发送邮件提醒特定组中的所有人。

有一个TournamentModel 包含一个tournament_start_date,例如'10.08.2018'

玩家可以加入锦标赛,当他加入 django 组“Registered”时。

我必须创建一个function(工作?)来检查tournament_start_date,如果比赛在 5 天后开始,此功能将自动向“已注册”组中的所有人发送电子邮件...。

我该怎么做?我应该使用什么?如何运行它,它会自动检查?我正在学习 python/django 几个月...但我第一次遇到工作;/

我将不胜感激。

【问题讨论】:

  • 起初你可能想了解一下management commands
  • 那太宽泛了,抱歉。尽管如此,还是有一些提示:1/您可以在 5 天内开始锦标赛,在 start_date 上使用普通的 ORM 查找,2/ 将您的代码编写为管理命令,3/ 使用您的系统调度程序(类 unix 系统上的 cron)来运行它一天一次。
  • 将邮件添加到一个计划每天检查它的 cronjob 中,当一个事件在触​​发您的电子邮件的条件下(因此事件开始后 5 天)有效时,查找计划任务在 Windows 上或 Linux 中的 Cron 作业

标签: python django task jobs


【解决方案1】:

如果你把它分成两部分,它会更容易。零件是

  1. 发送提醒邮件
  2. 每天运行脚本

对于第一部分,我将首先安装出色的 django-extensions 软件包,以便轻松运行脚本。 (检查您的 INSTALLED_APPS,您可能已经拥有它。)拥有 python-dateutil 包也会有所帮助。

然后我会写我的脚本。假设您的应用名为“myapp”。在“myapp”下创建一个名为“scripts”的目录,并在其中创建一个空的 __init__.py。

现在在“myapp/scripts/remind_players.py”中创建您的脚本文件。它看起来像这样:

from datetime import date
from datutil.relativedelta import relativedelta
from django.mail import send_mail  # I think this is right.
from myapp.models import Tournament

def run():
    # find our tournaments that start five days from now.
    for tournament in Tournament.objects.filter(tournament_start_date=date.today() + relativedelta(days=5)):

        # find the players that are registered for the tournament
        for player in tournament.registered_player_set():
            send_mail(...)

要手动运行脚本,您需要运行

python manage.py runscript remind_players

(提示:确保您的测试数据库只包含您自己的电子邮件地址。让您的测试系统向所有人发送电子邮件会很尴尬。)

(提示:您还可以配置 Django 将电子邮件消息放入日志中,而不是实际发送它们。)

对于第二部分,您必须找到一种方法来安排每天运行的作业。通常,您的操作系统会提供一种方法来做到这一点。如果您在 Unix/Linux 上,您将使用“cron”。如果您使用的是 Windows,您将使用“计划任务”。 (还有其他调度选项,但这些是最常见的。)

【讨论】:

  • 哇!非常感谢您的宝贵时间。你可能救了我的命! ;)
【解决方案2】:

您可以将此邮件发送功能设置为cron作业。如果您的团队使用过,您可以通过crontab或Celery进行调度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2015-05-20
    • 2016-11-22
    • 2012-01-01
    • 1970-01-01
    相关资源
    最近更新 更多