首页 > 解决方案 > django用芹菜任务发送电子邮件

问题描述

如果订单的截止日期是今天,我想自动向具有特定订单的 order.id 和“manu_date”的用户发送电子邮件。我已经用 rabbitmq 配置了 celery,它正在工作,我可以发送电子邮件。问题是我不知道任务和视图会包含什么。到目前为止,我已经想出了下面的代码。

@periodic_task(run_every=datetime.timedelta(minutes=1))  
def check_for_orders():      
    orders = Order.objects.all()
    now = datetime.datetime.utcnow().replace(tzinfo=utc,second=00, microsecond=00)
    for order in orders:
        if order.manu_date == now:
            send_mail('Manufacturing Reminder',
                '{{Order.id}} is due {{manu_date}}',
                'dummyguy1680@gmail.com',
                ['gummy@gmail.com.com'])
            return None


class Order(models.Model):
    date = models.ForeignKey('date', null=True, on_delete=models.CASCADE)
    user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=30)
    date_created = models.DateTimeField('date_created', default=timezone.now(), blank=False)
    manu_date = models.DateField('Manufacturing', null=True)
    updated_by = models.ForeignKey(User, null=True, related_name='updated_by_user', on_delete=models.CASCADE)
    date_updated = models.DateField(max_length=100, null=True)

标签: pythondjango

解决方案


您可以通过设置每天运行的crontabCelery Beat并使用. 要进行此设置,一种方法是:

设置.py

from celery.schedules import crontab
CELERY_BROKER_URL = <broker_address> 'for example 'amqp://myuser:mypassword@localhost:5672/myvhost'
CELERY_TIMEZONE = <your_timezone> #for example 'Europe/London'
CELERY_IMPORTS = ['<app_name>.tasks']
CELERY_BEAT_SCHEDULE = {
'celery_test': {

    'task': '<app_name>.tasks.check_for_orders',
    'schedule': crontab(minute=0, hour=0), #every day at midnight
},
}

将所有<>变量替换为您的应用程序所需的变量。

任务.py

from celery import shared_task
@shared_task
def check_for_orders():      
    orders = Order.objects.all()
    now = datetime.datetime.utcnow().replace(tzinfo=utc,second=00, microsecond=00)
    week_old = now - datetime.timedelta(week=1)
    for order in orders:
        if order.manu_date.date() == week_old.date():
            send_mail('Manufacturing Reminder',
                '{} is due {}'.format(order.id, order.manu_date),
                'dummyguy1680@gmail.com',
                ['gummy@gmail.com.com'])
            return None

确保 celery beat 与 worker 和应用程序并行运行。

终端运行 Celery Beat

celery -A EmissionsWorkbench beat -l info

推荐阅读