Article image
Saulo Maciel
Saulo Maciel15/04/2024 12:28
Share

Python: Como fazer um robô que envia e-mails customizado 🤖🐍📧

  • #Python

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 os Requerimentos:

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.

image

Exemplo de como a tela ficará

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_emailselecionar_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

Share
Comments (0)