massemailtxt.py 1.91 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
import os.path
import time

from lxml import etree

from django.core.management.base import BaseCommand
from django.conf import settings
from django.contrib.auth.models import User

import mitxmako.middleware as middleware

from django.core.mail import send_mass_mail
13
import sys
14

15 16
import datetime

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
middleware.MakoMiddleware()

def chunks(l, n):
    """ Yield successive n-sized chunks from l.
    """
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

class Command(BaseCommand):
    help = \
'''Sends an e-mail to all users in a text file. 
E.g. 
manage.py userlist.txt message logfile.txt rate
userlist.txt -- list of all users
message -- prefix for template with message
logfile.txt -- where to log progress
rate -- messages per second
 '''
    log_file = None

    def hard_log(self, text):
38
        self.log_file.write(datetime.datetime.utcnow().isoformat()+' -- '+text+'\n')
39 40 41 42 43 44 45 46 47 48 49 50 51

    def handle(self, *args, **options):
        global log_file
        (user_file, message_base, logfilename, ratestr) = args
        
        users = [u.strip() for u in open(user_file).readlines()]

        message = middleware.lookup['main'].get_template('emails/'+message_base+"_body.txt").render()
        subject = middleware.lookup['main'].get_template('emails/'+message_base+"_subject.txt").render().strip()
        rate = int(ratestr)
        
        self.log_file = open(logfilename, "a+", buffering = 0)

52
        i=0
53 54 55 56 57
        for users in chunks(users, rate):
            emails = [ (subject, message, settings.DEFAULT_FROM_EMAIL, [u]) for u in users ]
            self.hard_log(" ".join(users))
            send_mass_mail( emails, fail_silently = False )
            time.sleep(1)
58
            print datetime.datetime.utcnow().isoformat(), i
59
            i = i+len(users)
60 61 62 63 64
            # Emergency interruptor
            if os.path.exists("/tmp/stopemails.txt"):
                self.log_file.close()
                sys.exit(-1)
        self.log_file.close()