Automatize Emails com Python: Guia Completo para Iniciantes

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!