Slide 1

Slide 1 text

Bruna Moreira Mandando emails BEAUTIFUL SOUP E SMTP

Slide 2

Slide 2 text

Quer saber mais? APRESENTAÇÃO speakerdeck.com/brunamoreira/ mandar-emails-com-python CÓDIGO github.com/brunanayara/send-emails

Slide 3

Slide 3 text

Mandar emails O QUE VEREMOS? smtplib 2 factor authentication templates de email email.mime beautiful soup csv

Slide 4

Slide 4 text

NÃO DÁ TEMPO O QUE NÃO VEREMOS? server local google sheets api argparse pegar senha na execução

Slide 5

Slide 5 text

Enviando ENTENDENDO dados conexão login envio sair import smtplib me = "[email protected]" you = "[email protected]" p = "senha" server = smtplib.SMTP_SSL('smtp.gmail.com', 465) server.login(me, p) server.sendmail(me, you "this message is from python") server.quit()

Slide 6

Slide 6 text

HORA DO ERRO Deu um erro e agora? "smtplib.SMTPAuthenticationError" O PROBLEMA É O 2FA

Slide 7

Slide 7 text

1Segurança 2 Senhas de aplicativos

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Mail

Slide 11

Slide 11 text

Mail Other

Slide 12

Slide 12 text

senh anof orma to44

Slide 13

Slide 13 text

ENTENDENDO dados conexão login envio sair Enviando import smtplib me = "[email protected]" you = "[email protected]" p = senha server = smtplib.SMTP_SSL('smtp.gmail.com', 465) server.login(me, p) server.sendmail(me, you "this message is from python") server.quit()

Slide 14

Slide 14 text

Enviou um email SEM ASSUNTO E HTML Vamos resolver isso!

Slide 15

Slide 15 text

Como manda bonitinho? EMAIL HTML

Slide 16

Slide 16 text

Mime text from email.mime.text import MIMEText textfile = "email_template.html" with open(textfile) as fp: msg = MIMEText(fp.read(), 'html') Transformar template em objeto de email

Slide 17

Slide 17 text

msg['Subject'] = 'Assunto do email' msg['From'] = me msg['To'] = you MIMEText Content-Type: text/html; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Assunto do email From: [email protected] To: [email protected] Modificar cabeçalho

Slide 18

Slide 18 text

Enviando server = smtplib.SMTP_SSL('smtp.gmail.com', 465) server.login(from, password) server.send_message(msg) server.quit() Pega as informações do cabeçalho da mensagem send_message(msg)

Slide 19

Slide 19 text

Agora vamos personalizar o template USANDO BEAUTIFUL SOUP

Slide 20

Slide 20 text

CRIAR O TEMPLATE EM HTML DEFINIR CLASSE E ID ACHAR AS CLASSES MUDAR OS VALORES

Slide 21

Slide 21 text

CRIAR O TEMPLATE EM HTML DEFINIR CLASSE E ID ACHAR AS CLASSES MUDAR OS VALORES EXEMPLOS

Slide 22

Slide 22 text

https://github.com/ohsik/Simple-Responsive-HTML-Email-Template htmlemai.io

Slide 23

Slide 23 text

CRIAR O TEMPLATE EM HTML DEFINIR CLASSE E ID ACHAR AS CLASSES MUDAR OS VALORES EXEMPLOS

Slide 24

Slide 24 text

Olá

Exemplo de texto para o início

definir id ou classe para facilitar a busca dos elementos que serão modificados pelo script

Slide 25

Slide 25 text

CRIAR O TEMPLATE EM HTML DEFINIR CLASSE E ID ACHAR AS CLASSES MUDAR OS VALORES EXEMPLOS

Slide 26

Slide 26 text

with open(template_file) as fp: template = BeautifulSoup(fp, 'html.parser') Ler o arquivo Objeto Beautiful Soup

Slide 27

Slide 27 text

greetings = template.select_one("#greetings") greetings.string = "Olá, {}".format(name) Acha o elemento Substitui o conteúdo

Slide 28

Slide 28 text

greetings = template.select_one("#greetings") greetings.string = "Olá, {}".format(name) Acha o elemento Substitui o conteúdo só acha o primeiro

Slide 29

Slide 29 text

O que mais eu consigo identificar? MUITA COISA

Slide 30

Slide 30 text

Título template.title Título do email template.title.name 'title' template.title.string 'Título do email' Acha a tag Seleciona o nome dela Seleciona o valor dela

Slide 31

Slide 31 text

Meu titulo ...

Texto

Outro texto

template.title Meu titulo template.title.parent.name 'head' template.head.meta ... NAVEGAÇÃO

Slide 32

Slide 32 text

template.find_all('p') [

Texto

,

Outro texto

] template.head.contents [Meu titulo, ... ] Meu titulo ...

Texto

Outro texto

template.find("p", class="classe1")

Texto

ACHAR ELEMENTOS

Slide 33

Slide 33 text

Meu titulo ...

Texto

Outro texto

template.title.next_sibling ... template.meta.previous_sibling Meu titulo NAVEGAÇÃO

Slide 34

Slide 34 text

E pra modificar? BORA LÁ

Slide 35

Slide 35 text

Meu titulo ...

Texto

Outro texto

template.p

Texto

template.p.string = "Blá blá"

Blá blá

MODIFICANDO

Slide 36

Slide 36 text

Meu titulo ...

Texto

Outro texto

template.p

Texto

template.p.name = "a" Texto MODIFICANDO

Slide 37

Slide 37 text

Meu titulo ...

Texto

Outro texto

template.p

Texto

template.p.class = "nova-classe" Texto MODIFICANDO

Slide 38

Slide 38 text

Meu titulo ...

Texto

Outro texto

MODIFICANDO template.p

Texto

template.p.id = "eita" Texto del template.p['id'] Texto

Slide 39

Slide 39 text

Meu titulo ...

Texto

Outro texto

MODIFICANDO template.p

Texto

template.p.append("Novo") TextoNovo

Slide 40

Slide 40 text

O que eu já vi? MIX AND MATCH Transformar em email Conexão e envio Modificar template

Slide 41

Slide 41 text

Beautiful Soup Identificar elementos Modificar valores TEMPLATE Ordem das coisas MimeText Transformar Modificar CABEÇALHOS Enviar individual Percorrer lista Enviar para lista ENVIAR

Slide 42

Slide 42 text

É MUITA GENTE Vou ter que enviar um por vez? LER LISTA DE EMAILS NO CSV

Slide 43

Slide 43 text

CSV import csv maillist = [] with open(csv_file, newline='') as csvfile: c = csv.reader(csvfile, delimiter=',', quotechar='|') for row in c: m = dict([('name', row[0]), ('email', row[1]), ('word', row[2])]) maillist.append(m) Biblioteca csv Cada linha um dicionário

Slide 44

Slide 44 text

Beautiful Soup Identificar elementos Modificar valores TEMPLATE Ordem das coisas MimeText Modificar From To Subject CABEÇALHOS Importar emails Percorrer lista LISTA Enviar individual Enviar para lista ENVIAR

Slide 45

Slide 45 text

ALGUMAS FUNÇÕES get_template(template_file) custom_greeting(name, template) change_sender_name(sender, template) change_secret_word(word, template) BEAUTIFUL SOUP

Slide 46

Slide 46 text

ALGUMAS FUNÇÕES create_mail(subject, body, sender) create_custom_mail(subject, body, receiver, sender) change_receiver(receiver, msg) MIMETEXT

Slide 47

Slide 47 text

ALGUMAS FUNÇÕES get_maillist_from_csv(csv_file): CSV

Slide 48

Slide 48 text

ALGUMAS FUNÇÕES send(msg) SMTP Abrir conexão Enviar email Fechar conexão

Slide 49

Slide 49 text

Onde me achar? EMAIL brunanayaramlima @gmail.com TELEGRAM @brunamoreira LINKEDIN brunamoreiral SPEAKERDECK brunamoreira

Slide 50

Slide 50 text

Muito obrigada! MANDANDO EMAILS COM PYTHON BRUNA MOREIRA