Skip to content

Instantly share code, notes, and snippets.

@gabicavalcante
Last active August 29, 2015 14:10
Show Gist options
  • Save gabicavalcante/a0d33938346e9c39f7f1 to your computer and use it in GitHub Desktop.
Save gabicavalcante/a0d33938346e9c39f7f1 to your computer and use it in GitHub Desktop.
Código para sorteio e envio de email avisando quem-tirou-quem.
# coding=utf-8
# Modulo sorteio.py
# Data de criação 18/12/2014
# Gabriela Cavalcante da Silva
'''
- Coloque nomes sem acentos.
- O arquivo com nome e email deve estrar na seguinte estrutura:
nome1 email1
nome2 email2
...
- O arquivo com os dados devem estar no mesmo diretório que o código .py
'''
import smtplib
import random
import sys
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.Utils import COMMASPACE, formatdate
pessoas_sorteadas = {} # pessoas que ainda vão ser retiradas para sorteio [poderia ser só um vetor]
participantes = {} # todos os participantes do sorteio { nome_participante : email }
resultado_sorteio = {} # resultado do sorteio { nome_participante: pessoa_sorteada }
# Função de envio do email
def enviar(addressee, to, fulano) :
# settings
_host = 'smtp.gmail.com'
_port = 587
# data
_addressee = addressee # origem
_to = to # destino
_subject = "Confra das pessoas queridas, lindas e populares do labsid"
# objeto da mensagem
mensagem = MIMEMultipart()
# cabeçalho
mensagem['Subject'] = _subject
mensagem['From'] = _addressee
mensagem['To'] = _to
mensagem['Date'] = formatdate(localtime=True)
# corpo da mensagem
text = "Você tirou %s" %fulano
mensagem.attach(MIMEText(text, 'plain'))
# login
user = 'email@email.com'
password = 'senha'
# Enviar mensagem via SMTP server.
server = smtplib.SMTP(host=_host, port=_port)
server.starttls()
server.login(user, password)
# Enviar email
server.sendmail(_addressee, _to, mensagem.as_string())
print "\nEmail enviado"
server.quit()
# Função que ler o arquivo de texto
def readFile(path):
try:
with open(path, 'r') as arquivo:
while True:
line = arquivo.readline()
if not line: break # linha em branco
participantes.update(
{ line.split(" ").__getitem__(0): line.split(" ")
.__getitem__(1)} ) # separa a linha em nome e email
# Tratamento de erro
except IOError:
print('\nArquivo não encontrado!')
# Função que realiza o sorteio
def sorteio():
pessoas_sorteadas = dict(participantes) # copio o dicionário participantes para pessoas_sorteadas
cont_people = (len(participantes)) - 1 # quantidade de participante
while(cont_people >= 0):
people = random.choice(pessoas_sorteadas.keys()) # pessoa sorteada dentro das que restaram em pessoas_sorteadas
pessoas_sorteadas.pop(people) # removo da lista das que serão sorteadas a que acabou de ser
resultado_sorteio.update(
{ participantes.keys()[cont_people] : people } # { nome do participante: pessoa tirada por ele }
)
cont_people -= 1
'''
verifica se existiu alguém que tirou a si mesmo,
caso não tenha, envia um email para cada registro do dicionário '''
if(verificar_invalidos()): rotina_de_envio()
else: print("Reexecute o programa, houve falha do sorteio") # Caso alguém tenha tirado a si mesmo, há um aviso de falha
def rotina_de_envio():
for data in resultado_sorteio:
print(participantes.get(data), participantes.get(data) , resultado_sorteio.get(data))
enviar(data, participantes.get(data) , resultado_sorteio.get(data)) # enviar email
def verificar_invalidos():
for data in resultado_sorteio:
if (data == resultado_sorteio.get(data)):
return False
return True
if __name__ == '__main__':
# arquivo de texto com a estrutura:
# Nome_do_Participante Email_do_Participante
readFile('sorteio.txt')
sorteio()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment