Python: Como fazer um robô que envia e-mails customizado 🤖🐍📧
Prólogo do Artigo:
Olá, caro leitor. Neste texto, tentarei explicar e ensinar como construí meu simplório robozinho capaz de enviar gemails customizados para as pessoas. A ideia surgiu enquanto eu buscava uma recolocação no mercado e me deparei com a necessidade de enviar emails constantemente para os recrutadores.
Como o Robô funciona?
De forma simples, o robô requer um email, um assunto (título do email), um HTML para o corpo do email e, opcionalmente, um arquivo de anexo. Ele opera dessa maneira porque a maioria dos recrutadores solicita uma carta de apresentação e o currículo como anexos. Depois de fornecer todos esses elementos, o robô envia o email para a pessoa desejada. O resultado é um email personalizado, semelhante aos que recebemos de lojas ou newsletters.
Requerimentos para o projeto:
- Computador com a linguagem Python 3.10 instalada (não tem problema se for uma versão mais recente);
- Um programa para escrever e executar o código (IDEs, Bloco de Notas e/ou terminal);
- Instalar os seguintes módulos python: Smtplib, Email, Tkinter, Re e Os.
Observações sobre o itens de Requerimentos:
- Provalvemente você já terá o Visual Studio, Pycharm, ou Jupyter instalados no seu PC, esses softwares são as IDEs.
- Para instalar a Linguagem Python, deve seguir o manual de instrução da Python Foundation.
- Os módulos que citei normalmente são instalados junto com a linguagem, porem é bom checar se foram instalados. Caso não estejam, pesquise no site da Python Foundation como instalar.
1,2,3 … Mãos à obra!
Crie um arquivo com o nome Robot_Sends_Email.py. É crucial que ele tenha a extensão de arquivo “.py”, pois é assim que o computador reconhecerá que precisa ler esse arquivo na linguagem Python.
Agora abra seu arquivo e vamos começar a programar. Importe todas as bibliotecas e seus submódulos conforme mostrado abaixo.
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import tkinter as tk
from tkinter import filedialog
import re
import os
O próximo passo é criar uma janela para colocar o email e o assunto do email. Copie o código abaixo.
root = tk.Tk()
root.title("Enviar E-mail")
root.geometry("400x220")
label_email = tk.Label(root, text="Digite o e-mail do destinatário:")
label_email.pack(pady=5)
entry_email = tk.Entry(root, width=30)
entry_email.pack(pady=5)
label_assunto = tk.Label(root, text="Digite o assunto do e-mail:")
label_assunto.pack(pady=5)
entry_assunto = tk.Entry(root, width=30)
entry_assunto.pack(pady=5)
btn_enviar = tk.Button(root, text="Enviar E-mail", command=validar_email)
btn_enviar.pack(pady=10)
root.mainloop()
Caso você queira executar o código, uma caixa semelhante à imagem seguinte aparecerá. No entanto, tenha cuidado, pois se pressionar os botões, uma mensagem de erro será exibida. Isso ocorre devido à falta de localização das funções que ainda vamos escrever.
Recapitulando
O código deve seguir o modelo abaixo para funcionar corretamente. Muitos problemas podem surgir se for escrito de forma incorreta.
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import tkinter as tk
from tkinter import filedialog
import re
import os
root = tk.Tk()
root.title("Enviar E-mail")
root.geometry("400x220")
label_email = tk.Label(root, text="Digite o e-mail do destinatário:")
label_email.pack(pady=5)
entry_email = tk.Entry(root, width=30)
entry_email.pack(pady=5)
label_assunto = tk.Label(root, text="Digite o assunto do e-mail:")
label_assunto.pack(pady=5)
entry_assunto = tk.Entry(root, width=30)
entry_assunto.pack(pady=5)
btn_enviar = tk.Button(root, text="Enviar E-mail", command=validar_email)
btn_enviar.pack(pady=10)
root.mainloop()
Escrevendo funções
Para o robô funcionar corretamente, achei melhor criar 03 funções: validar_email; selecionar_arquivos e a enviar_email.
# 3ª function
def enviar_email(email_destinatario, assunto, corpo_email, file_path_anexo):
# 2ª function
def selecionar_arquivos():
# 1ª function
def validar_email():
A primeira função a “validar_email()” serve como a entrada da interface, ela é responsavel por chamar a segunda função que seria a selecionar_arquivos().
# 3ª function
def enviar_email(email_destinatario, assunto, corpo_email, file_path_anexo):
# 2ª function
def selecionar_arquivos():
# 1ª function
def validar_email():
selecionar_arquivos()
A segunda função serve para abrir um gestor de arquivos que pedirá um HTML para o corpo do email e o arquivo em anexo, em seguida ela fornece tudo pronto para a terceira função a enviar_email().
# 3ª function
def enviar_email(email_destinatario, assunto, corpo_email, file_path_anexo):
# 2ª function
def selecionar_arquivos():
root = tk.Tk()
root.withdraw()
file_path_html = filedialog.askopenfilename(title="Selecione o arquivo HTML", filetypes=[("HTML files", "*.html")])
if file_path_html:
file_path_anexo = filedialog.askopenfilename(
title="Selecione o arquivo para anexar",
filetypes=[
("All files", "*.*")
]
)
email_destinatario = entry_email.get()
assunto = entry_assunto.get()
if assunto and email_destinatario:
with open(file_path_html, "r") as file:
corpo_email = file.read()
enviar_email(email_destinatario, assunto, corpo_email, file_path_anexo)
root.destroy()
# 1ª function
def validar_email():
selecionar_arquivos()
Para a terceira função, é essencial assistir ao vídeo de referência, pois ele fornece um passo a passo detalhado sobre como conceder acesso ao robô ao Gmail.
Resumidamente, você precisará inserir seu email no campo designado como ‘COLOQUE AQUI O EMAIL DO REMETENTE’ e a senha gerada pelo Google para o robô, indicada em ‘COLOQUE AQUI A SENHA DO ROBÔ’.
A senha é crucial para o funcionamento correto do robô, por isso, recomendo assistir ao primeiro vídeo listado nas referências para obter orientações precisas.
# 3ª function
def enviar_email(email_destinatario, assunto, corpo_email, file_path_anexo):
if not re.match(r"[^@]+@[^@]+\.[^@]+", email_destinatario):
print("Endereço de e-mail inválido!")
return
msg = MIMEMultipart()
msg['Subject'] = assunto
msg['From'] = 'COLOQUE AQUI O EMAIL DO REMETENTE'
msg['To'] = email_destinatario
password = 'COLOQUE AQUI A SENHA DO ROBÔ'
msg.attach(MIMEText(corpo_email, 'html'))
if file_path_anexo:
filename = os.path.basename(file_path_anexo)
with open(file_path_anexo, 'rb') as attachment:
part = MIMEApplication(attachment.read(), Name=filename)
part['Content-Disposition'] = f'attachment; filename="{filename}"'
msg.attach(part)
with smtplib.SMTP('smtp.gmail.com: 587') as s:
s.starttls()
s.login(msg['From'], password)
s.sendmail(msg['From'], [msg['To']], msg.as_string().encode('utf-8'))
print('Email enviado com anexo' if file_path_anexo else 'Email enviado sem anexo')
# 2ª function
def selecionar_arquivos():
root = tk.Tk()
root.withdraw()
file_path_html = filedialog.askopenfilename(title="Selecione o arquivo HTML", filetypes=[("HTML files", "*.html")])
if file_path_html:
file_path_anexo = filedialog.askopenfilename(
title="Selecione o arquivo para anexar",
filetypes=[
("All files", "*.*")
]
)
email_destinatario = entry_email.get()
assunto = entry_assunto.get()
if assunto and email_destinatario:
with open(file_path_html, "r") as file:
corpo_email = file.read()
enviar_email(email_destinatario, assunto, corpo_email, file_path_anexo)
root.destroy()
# 1ª function
def validar_email():
selecionar_arquivos()
Recapitulando
O código final deve ficar assim:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import tkinter as tk
from tkinter import filedialog
import re
import os
# 3ª function
def enviar_email(email_destinatario, assunto, corpo_email, file_path_anexo):
if not re.match(r"[^@]+@[^@]+\.[^@]+", email_destinatario):
print("Endereço de e-mail inválido!")
return
msg = MIMEMultipart()
msg['Subject'] = assunto
msg['From'] = 'COLOQUE AQUI O EMAIL DO REMETENTE'
msg['To'] = email_destinatario
password = 'COLOQUE AQUI A SENHA DO ROBÔ'
msg.attach(MIMEText(corpo_email, 'html'))
if file_path_anexo:
filename = os.path.basename(file_path_anexo)
with open(file_path_anexo, 'rb') as attachment:
part = MIMEApplication(attachment.read(), Name=filename)
part['Content-Disposition'] = f'attachment; filename="{filename}"'
msg.attach(part)
with smtplib.SMTP('smtp.gmail.com: 587') as s:
s.starttls()
s.login(msg['From'], password)
s.sendmail(msg['From'], [msg['To']], msg.as_string().encode('utf-8'))
print('Email enviado com anexo' if file_path_anexo else 'Email enviado sem anexo')
# 2ª function
def selecionar_arquivos():
root = tk.Tk()
root.withdraw()
file_path_html = filedialog.askopenfilename(title="Selecione o arquivo HTML", filetypes=[("HTML files", "*.html")])
if file_path_html:
file_path_anexo = filedialog.askopenfilename(
title="Selecione o arquivo para anexar",
filetypes=[
("All files", "*.*")
]
)
email_destinatario = entry_email.get()
assunto = entry_assunto.get()
if assunto and email_destinatario:
with open(file_path_html, "r") as file:
corpo_email = file.read()
enviar_email(email_destinatario, assunto, corpo_email, file_path_anexo)
root.destroy()
# 1ª function
def validar_email():
selecionar_arquivos()
root = tk.Tk()
root.title("Enviar E-mail")
root.geometry("400x220")
label_email = tk.Label(root, text="Digite o e-mail do destinatário:")
label_email.pack(pady=5)
entry_email = tk.Entry(root, width=30)
entry_email.pack(pady=5)
label_assunto = tk.Label(root, text="Digite o assunto do e-mail:")
label_assunto.pack(pady=5)
entry_assunto = tk.Entry(root, width=30)
entry_assunto.pack(pady=5)
btn_enviar = tk.Button(root, text="Enviar E-mail", command=validar_email)
btn_enviar.pack(pady=10)
root.mainloop()
Referências
https://www.hashtagtreinamentos.com/envio-de-e-mail-pelo-gmail-em-python
Avisos:
Oi gente. Obrigado por ler meu artigo!
Estou republicando por aqui.
Pois alguns usuários não entenderam que esse artigo não é para progamadores, e sim para quem quer iniciar na programação, aí você, um programador mais experiente, pode compartilhar.
Esse é um recorte de um material que produzi no Médium, eu escolhi produzir no Médium pois alguém iniciante, provavelmente, não usará o TabNews e sim outra plataforma generalista.
Outro motivo que me fez escolher o Médium é que o TabNews não carrega imagem diretamente, e para quem está aprendendo é necessário imagens de apoio. Logo essa versão do tabnews está sem as imagens de apoio.
Acesse o material completo (com imagens de apoio) por aqui!