import smtplib import random from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText ## ## FRONT END FUNCTIONS ## def getEmail (): username = raw_input ( 'Enter gmail ID: ' ) username = username . split ( '@' , 1 )[ 0 ] username = username + '@gmail.com' password = raw_input ( 'Enter password: ' ) return [ username , password ] def getPeople (): listPeople = {} counter = 0 totalPeople = int ( input ( 'How many people? ' )) while counter < totalPeople : newName = raw_input ( 'Enter person \' s name: ' ) while newName in listPeople : newName = raw_input ( 'Name already taken. Enter a new name: ' ) newEmail = raw_input ( 'Enter ' + newName + ' \' s e-mail ID: ' ) listPeople [ newName ] = newEmail counter = counter + 1 return listPeople ## ## BACK END FUNCTIONS ## def assignSanta ( peopleList ): santaDict = {} notAssigned = peopleList . keys () notSanta = peopleList . keys () while len ( notAssigned ) > 0 : if len ( notSanta ) == 1 and len ( notAssigned ) == 1 : santaDict [ notSanta [ 0 ]] = notAssigned [ 0 ] return santaDict else : positionSanta = random . randint ( 0 , ( len ( notSanta ) - 1 )) santaName = notSanta [ positionSanta ] notAssignedTemp = notAssigned [:] if santaName in notAssignedTemp : notAssignedTemp . remove ( santaName ) positionKid = random . randint ( 0 , ( len ( notAssignedTemp ) - 1 )) kidName = notAssignedTemp [ positionKid ] santaDict [ santaName ] = kidName del notSanta [ notSanta . index ( santaName )] del notAssigned [ notAssigned . index ( kidName )] def testTable ( santaTable ): testOutcome = True for element in santaTable : if element == santaTable [ element ]: testOutcome = False break return testOutcome def emailSantaNames ( peopleList , santaTable , username , password ): server = smtplib . SMTP ( 'smtp.gmail.com:587' ) server . starttls () server . login ( username , password ) for element in santaTable : msg = MIMEMultipart () msg [ 'From' ] = username msg [ 'Subject' ] = 'Secret Santa!' msg [ 'To' ] = peopleList [ element ] body = element + ', you have to buy a gift for ' + santaTable [ element ] msg . attach ( MIMEText ( body )) string = msg . as_string () server . sendmail ( username , peopleList [ element ], string ) del msg server . quit () return None ## ## IMPLEMENTATION ## identification = getEmail () peopleList = getPeople () santaTable = assignSanta ( peopleList ) assert testTable ( santaTable ), 'Improper assignment' emailSantaNames ( peopleList , santaTable , identification [ 0 ], identification [ 1 ]) raw_input ( 'Email sent' )