#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' 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 from email.utils import formatdate, make_msgid import json import random import smtplib parser = ArgumentParser() parser.add_argument('-p', '--participants', dest='pFileLocation', default='participants.json', help='read a list of participants from PARTICIPANTFILE', metavar='PARTICIPANTFILE') parser.add_argument('-c', '--config', dest='cFileLocation', default='config.json', help='read the configuration from CONFIGFILE', 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 🎄' msg['Message-ID'] = make_msgid(domain=config['sender'] .split('@')[1] .strip('>')) msg['Date'] = formatdate(localtime=True) body = 'Lieb'+r['gender']+' '+r['name']+'!\n\n' body += 'Du bist heuer Wichtel für '+r['partner']+'.\n' body += 'Das Geschenk sollte nicht mehr als 75€ kosten.\n\n' body += 'Frohe Weihnachten!\n— Dein Christkind 👼' html = f'''

Lieb{r['gender']} {r['name']}!

Du bist heuer Wichtel für {r['partner']}.
Das Geschenk sollte nicht mehr als 75€ kosten.

Frohe Weihnachten!
— Dein Christkind 👼

''' msg.attach(MIMEText(body, 'plain', 'utf-8')) msg.attach(MIMEText(html, 'html', 'utf-8')) print('Sending email to', r['name'], '...') server.sendmail(config['sender'], r['mail'], msg.as_string())