Como enviar e-mails pelo Gmail em Python?

Enviar uma grande quantidade de e-mails manualmente é uma tarefa tediosa. Você pode usar serviços de terceiros para enviar e-mails em massa por vez.

Que tal você criar seu próprio script personalizado para enviar e-mails?

Não é maravilhoso?

Sim é. Vamos escrever um script em Python para enviar e-mails.

Python tem uma biblioteca chamada smtplib que é usada para enviar e-mails. A biblioteca smtplib é baseada no SMTP (Simple Mail Transport Protocol). SMTP é usado para enviar e-mails para outras pessoas.

Configurar o Gmail

Aqui, vamos usar o Gmail como um provedor de e-mail. O Google não permite que scripts façam login. E precisamos fazer uma alteração na segurança de nossa conta do Gmail que permite que scripts façam login em nossa conta do Gmail.

Alterar a opção de segurança em nossa conta do Gmail não é bom, pois permite que outras pessoas acessem a conta com muita facilidade. É recomendável criar uma nova conta do Gmail. Vá para as configurações aqui e ative a configuração Permitir aplicativos menos seguros: ATIVADO.

Se você não se sentir confortável em ativar a configuração acima, pode usar a API do Google para fazer login na sua conta do Gmail. Você pode encontrar o script para usar as APIs do Google para autenticação aqui.

Etapas para enviar e-mail

Certas etapas precisam ser executadas para enviar um e-mail usando a biblioteca smtplib. Vamos ver as etapas primeiro e depois escreveremos o script.

#1. Conectando ao servidor SMTP

Cada provedor de serviços terá um nome de domínio e uma porta de servidor SMTP diferentes. Temos que usar o nome de domínio do servidor SMTP e a porta do provedor de e-mail que vamos usar no script. O nome de domínio do servidor SMTP e a porta do Gmail são smtp.gmail.com e 465.

Estaremos usando criptografia SSL para a conexão do servidor SMTP, pois é mais segura do que a criptografia TSL. Se você quiser usar a criptografia TSL, use a porta 587 em vez de 465. O nome de domínio do servidor SMTP será diferente com base no provedor de serviços de e-mail.

  22 Perguntas e respostas frequentes da entrevista Spring Boot

O código para se conectar ao servidor SMTP

server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)

#2. Conecte-se

Uma vez estabelecida a conexão com o servidor SMTP, podemos fazer login usando o endereço de e-mail e a senha com o método do objeto SMTP de login. O código é o seguinte.

server.login(sender_email, password)

#3. Enviar correio

Após o login, não há como esperar para enviar o e-mail. Envie o e-mail usando o método sendmail. Certifique-se de enviar o e-mail no seguinte formato.

Assunto: your_subject_for newline mail_content

Espaços não são necessários. Eles são apenas para esclarecimento no formato acima. Vamos ver o código de exemplo.

server.sendmail(sender_mail, email, f"Subject: {subject}n{content}")

#4. Desistir

Não se esqueça de sair do SMTP c

Vimos as etapas para enviar e-mail usando Python. Mas não discutimos o código completo. Vamos passar rapidamente pelo código.

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. E tem um método chamado send para enviar os e-mails. Escrever aula ou simplesmente não é com você. A classe torna mais legível. Implementamos todas as etapas discutidas acima, uma a uma, no método send.

Viva! você enviou um e-mail usando o script Python.

  Como emparelhar dois alto-falantes Nest do Google Assistant para som estéreo

Conteúdo HTML

E se você quiser enviar o e-mail em HTML? É possível?

Sim, porque não. Podemos enviar o e-mail usando HTML na biblioteca chamada email.mime. É uma biblioteca integrada.

o MIME é um padrão usado para estender o formato de e-mails para suportar programas de aplicativos, vídeo, imagens, etc.,

Existem duas classes que precisamos do módulo email.mime. Eles são MIMEText e MIMEMultipart. Vejamos uma breve explicação sobre eles.

#1. MIMETexto

A classe MIMEText é usada para escrever nosso conteúdo de email em HTML. Criaremos uma instância da classe MIMEText passando o conteúdo HTML e o tipo de conteúdo. Veja o código de exemplo abaixo.

html_content = MIMEText(html_template, 'html')

Alguns serviços de e-mail não oferecem suporte à renderização de HTML. Portanto, é melhor criar duas instâncias da classe MIMEText para texto simples e HTML.

#2. MIMEMúltimaparte

A classe MIMEMultipart é utilizada para simplificar a formatação e escrita do assunto, desde endereço, endereço etc. Passaremos o conteúdo criado com a classe MIMEText para MIMEMultipart utilizando o método attach.

Precisamos garantir que a instância de MIMEMultipart seja criada com o argumento alternativo para renderizar texto simples ou HTML. Vamos 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ópia oculta usando esse atributo Bcc na instância MIMEMultipart.

Adicionando anexos

Os anexos podem ser imagens, pdfs, documentos, planilhas, etc. Chama-se MIMEBase na classe email.mime. É usado para adicionar anexos ao e-mail.

  Como usar seu iPad como um monitor externo de Mac com Sidecar

Vamos adicionar um anexo ao e-mail acima.

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)

Enviar para e-mails em massa de uma só vez

Usamos um loop para enviar o mesmo e-mail para vários membros. Esse é um caso (quando você não quer que os receptores saibam sobre outros receptores).

Suponha que você tenha que enviar o mesmo e-mail para 1.000 membros de uma só vez do mesmo grupo. Nesses casos, usar um loop não será apropriado. Podemos adicionar vários e-mails no campo Para na composição de e-mail geral. Como fazer isso no script Python?

Precisamos combinar a lista de e-mails como uma string separada por vírgula e espaço. Podemos usar a string do método join para combinar todos os e-mails como uma string. Veja o código para combinar e-mails como uma string.

", ".join(emails)

Substitua o campo Para no script acima usando a string acima. É isso, você enviou o e-mail para e-mails em massa de uma só vez.

Conclusão

Existem algumas bibliotecas de terceiros para enviar e-mails em Python. Alguns deles são envelopes, Yagmail, Flanco, etc., Essas bibliotecas nos ajudam a escrever scripts com poucas linhas de código. Você também pode explorá-los.

Agora, você pode automatizar seu e-mail usando scripts Python. A estrutura de envio de e-mails será diferente com base no seu caso de uso. Vimos diferentes cenários de envio de e-mails. Você pode personalizar facilmente os scripts discutidos no tutorial para o seu caso de uso. Eu tirei a referência deste artigo.

Codificação feliz 🙂