如何在访问者指定的日期发送电子邮件?

时间:2013-02-03 04:32:07

标签: python django cron redis celery

我正在构建一个django应用程序,用户来到我的网站,输入一串文本,他们的电子邮件,朋友的电子邮件以及他们希望通过电子邮件发送的日期。

如何在date_returned字段中请求的日期将他们输入的文本通过电子邮件发送给他们?任何特定的应用?循环?等

谢谢,

我的Models.py看起来像:

class bet(models.Model):
name = models.CharField(max_length=100)
email_1 = models.EmailField()
email_2 = models.EmailField()
wager = models.CharField(max_length=300)
date_submitted = models.DateField(_("Date"), auto_now_add=True) 
date_returned = models.DateField(null=True)

def __unicode__(self):
    return self.name

class BetForm(ModelForm):
name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Bet Name'}),      max_length=100)
email_1 = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': 'Your Email'}))
email_2 = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': 'Your Friend\'s Email'}))
wager = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'What\'s The Wager?'}), max_length=200)
date_returned = forms.DateField(widget=SelectDateWidget())
class Meta:
    model=bet

3 个答案:

答案 0 :(得分:0)

你可以在django中写一个custom management command。然后,您需要安排运行此命令的每日cron job

您还应添加BooleanField以检查是否已发送电子邮件。

请查看相关问题 - Django - Set Up A Scheduled Job?

答案 1 :(得分:0)

在django和python中发送电子邮件很容易,所以我不会深入研究。您在某个特定事件中发送电子邮件的问题不是Web应用程序的工作。我建议设置一个调用django命令(https://docs.djangoproject.com/en/dev/howto/custom-management-commands/)的cron作业。编写一个简单的命令,使即将发生的事件出列,并发送相应的电子邮件。让cron以足够的间隔运行以模拟实时。

models.py

class Bet(models.Model):
    name = models.CharField(max_length=100)
    email_1 = models.EmailField()
    email_2 = models.EmailField()
    wager = models.CharField(max_length=300)
    date_submitted = models.DateField(_("Date"), auto_now_add=True) 
    date_returned = models.DateField(null=True)
    email_sent = model.BooleanField(default=False)

dequeueemail.py

from django.core.management.base import BaseCommand, CommandError
from app_name.models import bet 

class Command(BaseCommand):
    def handle(self, *args, **options):
        for bet in bet.objects.filter(date_returned__gt=datetime.datetime.now(),email_sent=False):
            #python code to send email
            bet.email_sent=True
            bet.save()

的crontab

* * * * * python manage.py dequeueemail

如果你想在没有实际安装cron的情况下破解它,请检查此应用程序(http://code.google.com/p/django-cron/

答案 2 :(得分:0)

根据问题上的Celery标签判断,您可以使用Celery开放解决方案,因此我将提出一个解决方案。类似于只运行一次的cron作业,Celery可以将任务延迟到指定的日期时间:http://celery.readthedocs.org/en/latest/userguide/calling.html#eta-and-countdown

这是相当直接的。只需向您的eta电话提供datetime关键字arg .apply_async,该任务就会在当时执行。