Automatizando o Envio de E-mails com Python
A tarefa de enviar um grande volume de e-mails manualmente pode ser extremamente maçante. Existem diversas plataformas que oferecem o envio de e-mails em massa, mas e se você pudesse criar seu próprio sistema personalizado?
A ideia de ter um script sob medida para essa finalidade é bastante atrativa, não acha?
Sem dúvidas! Vamos, então, explorar a criação de um script em Python para enviar e-mails.
Python possui uma biblioteca muito útil chamada smtplib
, que facilita o envio de e-mails. Esta biblioteca utiliza o protocolo SMTP (Simple Mail Transport Protocol), que é o padrão para o envio de e-mails entre servidores.
Configurando o Gmail
Neste exemplo, usaremos o Gmail como nosso provedor de e-mail. Por padrão, o Google restringe o acesso de scripts à conta. Para permitir que nosso script se conecte ao Gmail, precisamos ajustar algumas configurações de segurança.
É importante ressaltar que alterar as configurações de segurança do Gmail pode expor sua conta a riscos. Portanto, a melhor prática seria criar uma conta do Gmail dedicada a esse tipo de envio. Você pode ajustar as configurações de acesso a aplicativos menos seguros aqui. Ative a opção “Permitir aplicativos menos seguros”.
Caso você não se sinta confortável em habilitar essa opção, o Google oferece uma API que permite o acesso seguro à sua conta do Gmail. Para saber mais sobre como utilizar a API do Google para autenticação, você pode consultar este link.
Passos para o Envio de E-mail
Existem algumas etapas que precisam ser seguidas para o envio de e-mails utilizando a biblioteca smtplib
. Vamos analisar cada uma delas antes de começarmos a escrever o script.
1. Conexão com o Servidor SMTP
Cada provedor de e-mail possui um nome de domínio e uma porta de servidor SMTP específicos. Para nosso script, vamos utilizar o nome de domínio e a porta do servidor do provedor de e-mail que escolhêrmos. Para o Gmail, o nome de domínio do servidor SMTP é smtp.gmail.com
e a porta é 465
.
Utilizaremos a criptografia SSL para nossa conexão com o servidor SMTP, pois ela oferece maior segurança em comparação com a criptografia TSL. Caso você deseje utilizar a criptografia TSL, utilize a porta 587
em vez da porta 465
. O nome de domínio do servidor SMTP irá variar dependendo do provedor de e-mail que você utilizar.
O código para se conectar ao servidor SMTP é:
server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)
2. Autenticação
Após estabelecer a conexão com o servidor SMTP, precisamos nos autenticar. Isso é feito utilizando o endereço de e-mail e a senha da conta, usando o método login
do objeto SMTP. O código para isso é:
server.login(sender_email, password)
3. Envio do E-mail
Uma vez que o login foi realizado com sucesso, podemos enviar o e-mail utilizando o método sendmail
. É importante formatar o e-mail da seguinte forma:
Assunto: your_subject_for newline mail_content
Os espaços são opcionais, servem apenas para ilustrar a formatação. Abaixo, segue um exemplo de código:
server.sendmail(sender_mail, email, f"Subject: {subject}n{content}")
4. Desconexão
Por fim, não se esqueça de se desconectar do servidor SMTP.
Agora que entendemos as etapas necessárias para enviar um e-mail usando Python, vamos analisar o código completo.
import smtplib, ssl
class Mail:
def __init__(self):
self.port = 465
self.smtp_server_domain_name = "smtp.gmail.com"
self.sender_mail = "GMAIL_ADDRESS"
self.password = "SECURE_PASSWORD"
def send(self, emails, subject, content):
ssl_context = ssl.create_default_context()
service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context)
service.login(self.sender_mail, self.password)
for email in emails:
result = service.sendmail(self.sender_mail, email, f"Subject: {subject}n{content}")
service.quit()
if __name__ == '__main__':
mails = input("Enter emails: ").split()
subject = input("Enter subject: ")
content = input("Enter content: ")
mail = Mail()
mail.send(mails, subject, content)
Criamos uma classe chamada Mail
com um método chamado send
para enviar os e-mails. Utilizar uma classe é opcional, mas torna o código mais organizado e legível. Implementamos cada uma das etapas mencionadas acima no método send
.
Parabéns! Você enviou um e-mail utilizando um script em Python.
Conteúdo HTML
Mas, e se você quiser enviar o e-mail em HTML? É possível?
Sim, claro que é! Podemos enviar e-mails com conteúdo HTML utilizando a biblioteca email.mime
, que já vem instalada no Python.
O MIME é um padrão utilizado para estender o formato de e-mails, permitindo o envio de programas de aplicativos, vídeos, imagens, etc.
Precisamos de duas classes do módulo email.mime
: MIMEText
e MIMEMultipart
. Vamos entender o que cada uma faz:
1. MIMEText
A classe MIMEText
é utilizada para inserir o conteúdo HTML do e-mail. Criamos uma instância da classe passando o conteúdo HTML e o tipo de conteúdo. Abaixo, um exemplo de código:
html_content = MIMEText(html_template, 'html')
É importante ressaltar que alguns provedores de e-mail não oferecem suporte à renderização de HTML. Sendo assim, é uma boa prática criar duas instâncias da classe MIMEText
, uma para texto simples e outra para HTML.
2. MIMEMultipart
A classe MIMEMultipart
é utilizada para simplificar a formatação do e-mail, como o assunto, o endereço de remetente, o endereço de destinatário, etc. O conteúdo criado com a classe MIMEText
é adicionado ao MIMEMultipart
utilizando o método attach
.
É necessário garantir que a instância de MIMEMultipart
seja criada com o argumento alternative
, para que o e-mail seja renderizado corretamente, tanto em texto simples quanto em HTML. Vamos agora enviar um e-mail com conteúdo HTML.
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
class Mail:
def __init__(self):
...
def send(self, emails):
ssl_context = ssl.create_default_context()
service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context)
service.login(self.sender_mail, self.password)
for email in emails:
mail = MIMEMultipart('alternative')
mail['Subject'] = 'etechpt.com Celebrations'
mail['From'] = self.sender_mail
mail['To'] = email
text_template = """
etechpt.com
Hi {0},
We are delighted announce that our website hits 10 Million views this month.
"""
html_template = """
<h1>etechpt.com</h1>
<p>Hi {0},</p>
<p>We are delighted announce that our website hits <b>10 Million</b> views last month.</p>
"""
html_content = MIMEText(html_template.format(email.split("@")[0]), 'html')
text_content = MIMEText(text_template.format(email.split("@")[0]), 'plain')
mail.attach(text_content)
mail.attach(html_content)
service.sendmail(self.sender_mail, email, mail.as_string())
service.quit()
if __name__ == '__main__':
mails = input("Enter emails: ").split()
mail = Mail()
mail.send(mails)
Você também pode adicionar cópias ocultas utilizando o atributo Bcc
na instância MIMEMultipart
.
Adicionando Anexos
É possível adicionar anexos aos e-mails, como imagens, PDFs, documentos, planilhas, etc. Para isso, utilizamos a classe MIMEBase
, do módulo email.mime
.
Vamos agora adicionar um anexo ao e-mail que criamos anteriormente:
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from pathlib import Path
class Mail:
def __init__(self):
...
def send(self, emails):
## login...
for email in emails:
## MIMEMultipart instance
## text and html templates
## MIMEText instances
## attaching messages to MIMEMultipart
## attaching an attachment
file_path = "etechpt.com-logo.png"
mimeBase = MIMEBase("application", "octet-stream")
with open(file_path, "rb") as file:
mimeBase.set_payload(file.read())
encoders.encode_base64(mimeBase)
mimeBase.add_header("Content-Disposition", f"attachment; filename={Path(file_path).name}")
mail.attach(mimeBase)
## sending mail
service.quit()
if __name__ == '__main__':
mails = input("Enter emails: ").split()
mail = Mail()
mail.send(mails)
Enviando para E-mails em Massa de uma Vez
Utilizamos um loop para enviar o mesmo e-mail para diversos destinatários. Isso é ideal quando você não quer que os destinatários saibam quem mais recebeu o e-mail.
Mas e se você precisar enviar o mesmo e-mail para 1000 pessoas do mesmo grupo? Nesse caso, utilizar um loop não é a melhor opção. O ideal é adicionar todos os e-mails no campo “Para” do e-mail. Como fazer isso no nosso script em Python?
Precisamos combinar a lista de e-mails em uma única string, separada por vírgulas e espaços. Para isso, utilizamos o método join
. O código é:
", ".join(emails)
Basta substituir o campo “Para” do script acima pela string resultante do método join
. E pronto, você enviou o e-mail para diversos destinatários de uma única vez!
Conclusão
Existem outras bibliotecas de terceiros que podem facilitar o envio de e-mails com Python, como Envelopes, Yagmail e Flanker. Essas bibliotecas permitem escrever scripts com poucas linhas de código. Vale a pena explorá-las!
Agora você pode automatizar o envio de e-mails com scripts Python! A estrutura do script vai depender do seu caso de uso. Analisamos diferentes cenários de envio de e-mails. Você pode facilmente personalizar os scripts que vimos neste tutorial para sua necessidade. Este artigo foi baseado em este artigo.
Bons estudos!