Skip to content

Instantly share code, notes, and snippets.

@kazimuth
Last active November 8, 2015 03:30
Show Gist options
  • Save kazimuth/928343ab100754d856cb to your computer and use it in GitHub Desktop.
Save kazimuth/928343ab100754d856cb to your computer and use it in GitHub Desktop.
Cruftmas
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import smtplib
import string
import csv
import random
import itertools as it
from datetime import datetime
from getpass import getpass
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
MAIL_SERVER = 'outgoing.mit.edu'
DEFAULT_CSV = 'cruftmas_users.csv'
MESSAGE_TEMPLATE = u'''πŸŽ„πŸŽ„πŸŽ„ YOUR CRUFTMAS ASSIGNMENT πŸŽ„πŸŽ„πŸŽ„
🎁 {} 🎁
- S. Claus πŸŽ…
'''
def login(sender, password):
# http://kb.mit.edu/confluence/display/mitcontrib/Send+Email+from+mit.edu+address+in+gmail
server = smtplib.SMTP_SSL(MAIL_SERVER)
server.login(sender, password)
return server
def address(kerberos):
return kerberos + '@mit.edu'
def message(sender, gifter, assignment):
msg = MIMEMultipart('alternative')
msg['Subject'] = u'πŸ”” Cruftmas Assignment πŸ””'
msg['From'] = u'S. Claus <{}>'.format(address(sender))
msg['To'] = address(gifter)
body = MIMEText(MESSAGE_TEMPLATE.format(assignment), 'plain', 'utf-8')
msg.attach(body)
return msg.as_string()
class c:
R = '\033[31m'
G = '\033[32m'
W = '\033[37m'
END = '\033[0m'
def read_gifters(gifters_file):
'''Read in the list of kerberoses from an input CSV filename, prompting to select the kerberos header'''
with open(gifters_file, 'rb') as f:
table = csv.DictReader(f)
field_id = raw_input(c.W+'Enter # for username heading: '+' '.join(map(str, zip(table.fieldnames, it.count()))) + c.R + ' (1) ')
if field_id == '':
field = table.fieldnames[1]
else:
field = table.fieldnames[int(field_id)]
return sorted(list(set(map(lambda row: row[field]
.lower()
.replace('@mit.edu', '')
.strip(),
table))))
if __name__ == '__main__':
# UI stuff
print c.W+'cruftmas.py'+c.R+' 0.0.1'+c.END
sender = raw_input(c.W+'sender kerberos: '+c.R)
password = getpass(c.W+'sender password: '+c.R)
gifters_file = raw_input(c.W+'CSV file:'+c.R+' ('+DEFAULT_CSV+') ')
if gifters_file == '':
gifters_file = DEFAULT_CSV
gifters = read_gifters(gifters_file)
print gifters
print c.W + 'Creating gift-giving chain...' + c.END
random.shuffle(gifters)
gift_pairs = zip(gifters, gifters[-1:] + gifters[:-1])
gift_pairs.sort()
output_file = './cruftmas-assignments-{}.csv'.format(datetime.now().strftime('%m-%d-%y_%H%M'))
with open(output_file, 'wb') as f:
out = csv.writer(f)
out.writerow(['Gifter', 'Assignment'])
for (gifter, assignment) in gift_pairs:
out.writerow([gifter, assignment])
print c.W + 'Logged assignments to {}. Look at your own risk!'.format(output_file) + c.END
print c.W + 'Logging in to {}...'.format(MAIL_SERVER) + c.R
server = login(sender, password)
go = raw_input(c.W + 'Send assignments? No going back! (y/N) ' + c.R).lower() == 'y'
if go:
for (gifter, assignment) in gift_pairs:
print c.W + 'Sending assignment for ' + gifter + '...' + c.END
# Send mail FROM sender TO gifter, with a message from sender, to gifter, saying they have an assignment
server.sendmail(address(sender), address(gifter), message(sender, gifter, assignment))
else:
print c.W + 'Okay, giving up' + c.END
print c.W + 'Done!' + c.END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment