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 import sys import datetime 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): self.log_file.write(datetime.datetime.utcnow().isoformat()+' -- '+text+'\n') 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) i=0 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) print datetime.datetime.utcnow().isoformat(), i i = i+len(users) # Emergency interruptor if os.path.exists("/tmp/stopemails.txt"): self.log_file.close() sys.exit(-1) self.log_file.close()