Stefan Sterz
b61d1dd8e2
these changes should lower the spam score for systems that use e.g. spamassassin and increase the likelihood of the email being delivered.
109 lines
3.4 KiB
Python
Executable file
109 lines
3.4 KiB
Python
Executable file
#!/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 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())
|