2009-07-24 5 views
3

Je crée une application django qui doit pouvoir envoyer des e-mails et les envoyer à un moment donné. Je pensais que je pourrais utiliser django-mailer pour mettre les choses dans et puis l'envoyer. Mais même si leur liste de cas d'exemple, listes que c'est une caractéristique, je ne peux pas sembler savoir comment. Ce dont j'ai besoin, c'est de pouvoir définir un champ 'when_to_send' dans le modèle de message de django-mailer, et quand le job cron déclenche la fonction send_mail, il faut filtrer ceux qui ont une date 'when_to_send' qui est supérieure à l'heure actuelle ...Comment faire un envoi planifié d'e-mails avec django-mailer

def send_all(): 
    """ 
    Send all eligible messages in the queue. 
    """ 

    lock = FileLock("send_mail") 

    logging.debug("acquiring lock...") 
    try: 
     lock.acquire(LOCK_WAIT_TIMEOUT) 
    except AlreadyLocked: 
     logging.debug("lock already in place. quitting.") 
     return 
    except LockTimeout: 
     logging.debug("waiting for the lock timed out. quitting.") 
     return 
    logging.debug("acquired.") 

    start_time = time.time() 

    dont_send = 0 
    deferred = 0 
    sent = 0 

    try: 
     for message in prioritize(): 
      if DontSendEntry.objects.has_address(message.to_address): 
       logging.info("skipping email to %s as on don't send list " % message.to_address) 
       MessageLog.objects.log(message, 2) # @@@ avoid using literal result code 
       message.delete() 
       dont_send += 1 
      else: 
       try: 
        logging.info("sending message '%s' to %s" % (message.subject.encode("utf-8"), message.to_address.encode("utf-8"))) 
        core_send_mail(message.subject, message.message_body, message.from_address, [message.to_address]) 
        MessageLog.objects.log(message, 1) # @@@ avoid using literal result code 
        message.delete() 
        sent += 1 
       except (socket_error, smtplib.SMTPSenderRefused, smtplib.SMTPRecipientsRefused, smtplib.SMTPAuthenticationError), err: 
        message.defer() 
        logging.info("message deferred due to failure: %s" % err) 
        MessageLog.objects.log(message, 3, log_message=str(err)) # @@@ avoid using literal result code 
        deferred += 1 
    finally: 
     logging.debug("releasing lock...") 
     lock.release() 
     logging.debug("released.") 

    logging.info("") 
    logging.info("%s sent; %s deferred; %s don't send" % (sent, deferred, dont_send)) 
    logging.info("done in %.2f seconds" % (time.time() - start_time)) 

Quelqu'un voit comment personnaliser cette fonction pour faire où le champ de message.when_to_send Envoyons pas de courrier électronique est supérieure à l'heure actuelle?

Répondre

0

Vous pouvez simplement ajouter une autre clause aux conditionals sous votre boucle de traitement des messages (vous devrez également importer datetime en haut de votre fichier):

  for message in prioritize(): 
      if DontSendEntry.objects.has_address(message.to_address): 
       logging.info("skipping email to %s as on don't send list " % message.to_address) 
       MessageLog.objects.log(message, 2) # @@@ avoid using literal result code 
       message.delete() 
       dont_send += 1 
      elif message.when_to_send > datetime.datetime.now(): 
       continue 
      else: 
       try: 
        ... the rest of your code ... 
+0

J'ai essayé ceci, mais ensuite le résultat est une boucle sans fin de la fonction priorityize(), et ce n'est bien sûr pas bon. – espenhogbakk

3

Vous devez mettre en œuvre la tâche cron pour django-mailer :

* * * * * (cd $PINAX; /usr/local/bin/python2.5 manage.py send_mail >> $PINAX/cron_mail.log 2>&1) 

Et puis en engine.py ligne 96:

# Get rid of "while True:" 
    while not Message.objects.all(): 
     # Get rid of logging.debug("sleeping for %s seconds before checking queue again" % EMPTY_QUEUE_SLEEP) 
     # Get rid of sleep 
     send_all() 
Questions connexes