''' This script creates randoms pairs from a list of participants in a secret santa game and sends them an email to notify them who the person is that they should buy presents for. ''' # -*- encoding: utf-8 -*- from argparse import ArgumentParser from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import json import random import smtplib parser = ArgumentParser() parser.add_argument('-p', '--participants', dest='pFileLocation', default='participants.json', help='read list of participants from FILE', metavar='PARTICIPANTFILE') parser.add_argument('-c', '--config', dest='cFileLocation', default='config.json', help='read the configuration from FILE', metavar='CONFIGFILE') args = parser.parse_args() # load and prepare a list containing all participants with open(args.pFileLocation, 'r') as pFile: participants = json.load(pFile) # create a copy of the list to make choosing a partner easier copy = list(enumerate(participants[:])) # choose a partner for each participant for i in range(len(participants)): # if the last participant has only themselves left to choose, make them # switch partners with another random participant if len(copy) == 1 and participants[i] == copy[0][1]: current = participants[i] participants.remove(current) partner = random.choice(participants) current['partner'] = partner['partner'] partner['partner'] = current['name'] + ' (' + current['mail']+')' participants.append(current) break # otherwise choose a random partner for each participant else: partner = random.choice(copy) while partner[0] == i: partner = random.choice(copy) participants[i]['partner'] = partner[1]['name']+' ('+partner[1]['mail']+')' copy.remove(partner) # load mail server configuration and open smtp server connection with open(args.cFileLocation, 'r') as cFile: config = json.load(cFile) server = smtplib.SMTP(config['server'], config['port']) server.ehlo() server.starttls() server.ehlo() server.login(config['user'], config['pass']) # create emails for all participants and send them # change the text for the mail here if you want to for r in participants: msg = MIMEMultipart('alternative') msg['From'] = config['sender'] msg['To'] = r['mail'] msg['Subject'] = 'Wichteln 🎄' body = 'Lieb'+r['gender']+' '+r['name']+'!' body += '\n\nDu bist heuer Wichtel für '+r['partner'] body += '. \n Das Geschenk sollte nicht mehr als 50€ kosten.' body += '\nFrohe Weihnachten!\n\nDein Christkind 👼' msg.attach(MIMEText(body, 'plain', 'utf-8')) server.sendmail(config['sender'], r['mail'], msg.as_string())