Como enviar e-mails pelo Gmail em Python?

Publicados: 2021-06-06

Enviar muitos e-mails manualmente é uma tarefa tediosa. Você pode usar serviços de terceiros para enviar e-mails em massa de uma 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 Gmail

Aqui, vamos usar o Gmail como 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 para permitir 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. Acesse 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 em sua conta do Gmail. Você pode encontrar o script para usar as APIs do Google para autenticação aqui.

Passos para enviar e-mail

Algumas 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 porta de servidor SMTP diferente. Precisamos usar o nome de domínio do servidor SMTP e a porta do provedor de e-mail que usaremos no script. O nome de domínio do servidor SMTP e a porta do Gmail são smtp.gmail.com e <em>465</em> .

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 vez de 465 . O nome de domínio do servidor SMTP será diferente com base no provedor de serviço de e-mail.

O código para se conectar ao servidor SMTP

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

# 2. Conecte-se

Assim que a conexão for estabelecida 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 podemos esperar para enviar o e-mail. Envie o e-mail usando o método sendmail . Certifique-se de enviar o e-mail no formato a seguir.

Assunto: your_subject_for \ newline mail_content

Os 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 examinar rapidamente o 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. Aula de escrita ou simplesmente não é com você. A classe o 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.

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 da biblioteca chamada email.mime . É uma biblioteca embutida.

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

Precisamos de duas classes no módulo email.mime . Eles são MIMEText e MIMEMultipart . Vamos ver uma breve explicação sobre eles.

# 1. MIMEText

A classe MIMEText é usada para escrever nosso conteúdo de e-mail em HTML. Vamos criar 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. MIMEMultipart

A classe MIMEMultipart é usada para simplificar a formatação e escrita do assunto, do endereço, ao endereço, etc. Daremos o conteúdo criado com a classe MIMEText ao MIMEMultipart usando o método attach .

Precisamos ter certeza de que a instância de MIMEMultipart é criada com o argumento alternative 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'] = 'Geekflare Celebrations' mail['From'] = self.sender_mail mail['To'] = email text_template = """ Geekflare Hi {0}, We are delighted announce that our website hits 10 Million views this month. """ html_template = """ <h1>Geekflare</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. Lá é chamado de MIMEBase na classe email.mime . É usado para adicionar anexos ao e-mail.

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 = "Geekflare-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)

Mail to Bulk Mails de uma vez

Usamos um loop para enviar o mesmo e-mail a 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 1000 membros de uma 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 vez.

Conclusão

Existem algumas bibliotecas de terceiros para enviar e-mails em Python. Alguns deles são Envelopes, Yagmail, Flanker, 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 emails 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 seu caso de uso. Tomei a referência deste artigo.

Happy Coding