wichteln/wichteln.py

110 lines
3.4 KiB
Python
Raw Normal View History

2022-10-26 14:04:04 +02:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
This script creates randoms pairs from a list of participants in a secret santa
2018-09-09 13:01:28 +02:00
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('>'))
2018-09-09 13:01:28 +02:00
msg['Date'] = formatdate(localtime=True)
2018-09-09 13:01:28 +02:00
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 50€ kosten.\n\n'
body += 'Frohe Weihnachten!\n— Dein Christkind 👼'
html = f"""
<html>
<head></head>
<body>
<p>Lieb{r['gender']} {r['name']}!<br><br>
Du bist heuer Wichtel für {r['partner']}.<br>
Das Geschenk sollte nicht mehr als 50 kosten.<br><br>
Frohe Weihnachten!<br>
Dein Christkind 👼
</p>
</body>
</html>
"""
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())