Python: Como enviar e-mails, módulo smtp e módulo e-mail!

Python 3.11 ganha maior desempenho em troca de 'um pouco mais de memória'
Python 3.11 ganha maior desempenho em troca de ‘um pouco mais de memória’

O módulo smtplib do Python define um cliente SMTP que pode ser usado para enviar email via SMTP ou ESMTP. O smtplib segue os padrões da RFC 821 (SMTP), RFC 1869 (ESMTP), RFC 2554 (Autenticação SMTP) e RFC 2487 (SMTP Seguro via TLS).

Como este módulo já está incluso nas bibliotecas do Python você não precisará instalar nenhuma biblioteca adicional.

Inicialmente vamos importar o módulo:

Terminal
import smtplib

Vamos criar a instância do SMTP de acordo com a forma de autenticação:

Terminal
TLSsmtp = smtplib.SMTP(‘localhost’, 587)smtp.starttls()

SSL

Terminal
smtp = smtplib.SMTP_SSL(‘localhost’, 465)

Sem autenticação

Terminal
smtp = smtplib.SMTP(‘localhost’, 25)

Ao escolher TLS ou SSL devemos fazer a autenticação:

Terminal
smtp.login(‘usuário’, ‘senha’)

Caso seja sem autenticação devemos nos identificar enviando o comando EHLO ou HELO:

# EHLOsmtp.ehlo()
# HELOsmtp.helo()

# De forma genérica. Tenta EHLO primeiro.smtp.ehlo_or_helo_if_needed()

Não há necessidade de chamar os métodos ehlo ou helo quando se utiliza SSL ou TLS, pois o método login faz a chamada desses métodos caso seja necessário.

Enviando um email:msg = “””From: seudominio.com.br
To: outroemail@seudominio.com.br

Subject: SempreUpdateEmail de teste do SempreUpdate.”””

smtp.sendmail(‘seuemail@seudominio.com.br’, [‘outroemail@seudominio.com.br’], msg)

Note que o segundo parâmetro do método sendmail deve ser uma lista. Mesmo que o destinatário seja apenas um. Finalizando a sessão SMTP:

Terminal
smtp.quit()

Agora que já sabemos quais partes usar, vamos colocar tudo em prática em um exemplo. No exemplo vou utilizar o GMail como servidor SMTP, mas você pode utilizar outro de sua preferência. No caso do GMail talvez seja necessário habilitar o uso de aplicativos não seguros.

Abaixo você pode verificar como enviar usando TLS:

Terminal
import smtplibsmtp = smtplib.SMTP(‘smtp.gmail.com’, 587)
smtp.starttls()
smtp.login(‘seuemail@gmail.com’, ‘suasenha’)
de = ‘seuemail@gmail.com’
ad size : 339.078 x 34
container width : 339.078

ad size : 339.078 x 34
container width : 339.078

para = [‘seuemail@gmail.com’]
msg = “””From: %s
To: %s
Subject: SempreUpdate
Email de teste do SempreUpdate.””” %
(de, ‘, ‘.join(para))
smtp.sendmail(de, para, msg)
smtp.quit()

Já neste outro exemplo você pode verificar como enviar via SSL:

Terminal
import smtplibsmtp = smtplib.SMTP_SSL(‘smtp.gmail.com’, 465)
smtp.login(‘seuemail@gmail.com’, ‘suasenha’)
de = ‘seuemail@gmail.com’
para = [‘seuemail@gmail.com’]msg = “””
From: %s
To: %s
Subject: SempreUpdate
Email de teste do SempreUpdate.””” %
(de, ‘, ‘.join(para))
smtp.sendmail(de, para, msg)
smtp.quit()

Você deve ter achado a forma de criar o corpo da mensagem um pouco estranha, certo? Não se preocupe, o módulo e-mail resolve esse problema.

Usando Python para enviar e-mails (módulo email)

O módulo e-mail é uma biblioteca para manipulação de mensagens de e-mail e outros documentos MIME. Como este módulo já está incluso nas bibliotecas do Python, você não precisará instalar nenhuma biblioteca adicional.

Inicialmente, vamos ver os sub-módulos que iremos utilizar do módulo e-mail:

Terminal
from email import encoders

Útil para quando criamos um payload que não seja um já implementado. Neste caso necessitamos codificar a mensagem.

Terminal
from email.mime.base import MIMEBase

Classe base para quando desejamos enviar um arquivo não suportado pelas classes já disponíveis. Um exemplo é o envio de arquivos de vídeos.

Terminal
from email.mime.multipart import MIMEMultipart

Usado para criar uma mensagem MIME multpart.

Terminal
from email.mime.audio import MIMEAudio

Usado para criar objetos MIME para a maior parte de arquivos de áudio.

Terminal
from email.mime.image import MIMEImage

Usado para criar objetos MIME para a maior parte de arquivos de imagem.

Terminal
from email.mime.text import MIMEText

Usado para criar objetos MIME para a maior parte de arquivos de texto.

Agora vamos verificar como criar uma mensagem com cada um desses tipos:

MIMEBase

Terminal
MIMEBasewith open(‘arquivo.zip’, ‘rb’) as f:
mime = MIMEBase(‘application’, ‘zip’)
 mime.set_payload(f.read())
 encoders.encode_base64(mime)
MIMEMultipart
Terminal
msg = MIMEMultipart()
msg.attach(arquivo_mime_1)
msg.attach(arquivo_mime_2)]
arquivo_mime deve ser outro subtipo MIME, por exemplo MIMEAudio.
MIMEAudio
Terminal
with open(‘audio.ogg’, ‘rb’) as f:
 mime = MIMEAudio(f.read(), _subtype=’ogg’)
MIMEImage
Terminal
with open(‘imagem.png’, ‘rb’) as f:
 mime = MIMEImage(f.read(), _subtype=’png’)
MIMEText
Terminal
with open(‘pagina.html’) as f:
 mime = MIMEText(f.read(), _subtype=’html’)

Adicionando os dados de envio e recebimento no cabeçalho da mensagem:

Terminal
msg = MIMEText(‘Exemplo SempreUpdate.’, ‘plain’)
msg[‘From’] = ‘seuemail@seudominio.com’
 msg[‘To’] = ‘, ‘.join([‘outroemail@seudominio.com’])
msg[‘Cc’] = ‘, ‘.join([‘emailemcopia@seudominio.com’])
 msg[‘Bcc’] = ‘, ‘.join([‘emailocultol@seudominio.com’])
msg[‘Reply-To’] = ‘, ‘.join([‘seuemail@seudominio.com’])
msg[‘Subject’] = ‘Assunto’

Descritivo

  • From indica quem está enviando mensagem.
  • To indica quem irá receber.
  • Cc indica quem receberá uma cópia deste email.
  • Bcc também indica quem receberá uma cópia do email, mas as demais pessoas não irão ver o email dele na lista dos enviados.
  • Reply-To indica para quem será respondido o email.
  • Subject é o assunto do email.

Para enviar os objetos MIME via SMTP devemos gerar as mensagens no formato raw, para isto utilizamos o método as_string. Agora que já possuímos uma noção básica do funcionamento do módulo email, vamos criar um exemplo completo utilizando tudo o que foi visto.

O exemplo abaixo exemplifica o envio de um email HTML:

import smtplib
from email.mime.text import MIMEText
de = ‘seumail@gmail.com’
para = [‘outroemail@gmail.com’]
msg = MIMEText(‘Exemplo de email HTML do <b>SempreUpdate<b/>.’, ‘html’, ‘utf-8’)
 msg[‘From’] = de
msg[‘To’] = ‘, ‘.join(para)
msg[‘Subject’] = ‘SempreUpdate’
raw = msg.as_string()
smtp = smtplib.SMTP_SSL(‘smtp.gmail.com’, 465)
smtp.login(‘seumail@gmail.com’, ‘suasenha’)
smtp.sendmail(de, para, raw)
 smtp.quit()]
O exemplo abaixo exemplifica o envio de um email HTML com anexo:
[import mimetypes
import os
import smtplib
from email import encoders
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
def adiciona_anexo(msg, filename):
    if not os.path.isfile(filename):
        return
    ctype, encoding = mimetypes.guess_type(filename)
    if ctype is None or encoding is not None:
        ctype = ‘application/octet-stream’
    maintype, subtype = ctype.split(‘/’, 1)
    if maintype == ‘text’:
        with open(filename) as f:
            mime = MIMEText(f.read(), _subtype=subtype)
    elif maintype == ‘image’:
        with open(filename, ‘rb’) as f:
            mime = MIMEImage(f.read(), _subtype=subtype)
    elif maintype == ‘audio’:
        with open(filename, ‘rb’) as f:
            mime = MIMEAudio(f.read(), _subtype=subtype)
    else:
        with open(filename, ‘rb’) as f:
            mime = MIMEBase(maintype, subtype)
            mime.set_payload(f.read())
        encoders.encode_base64(mime)
    mime.add_header(‘Content-Disposition’, ‘attachment’, filename=filename)
    msg.attach(mime)
de = ‘seumail@gmail.com’
para = [‘outroemail@gmail.com’]
msg = MIMEMultipart()
msg[‘From’] = de
msg[‘To’] = ‘, ‘.join(para)
msg[‘Subject’] = ‘SempreUpdate’
# Corpo da mensagem
msg.attach(MIMEText(‘Exemplo de email HTML com anexo do &lt;b&gt;SempreUpdate&lt;b/&gt;.’, ‘html’, ‘utf-8’))
# Arquivos anexos.
adiciona_anexo(msg, ‘texto.txt’)
adiciona_anexo(msg, ‘imagem.jpg’)
raw = msg.as_string()
smtp = smtplib.SMTP_SSL(‘smtp.gmail.com’, 465)
smtp.login(‘seumail@gmail.com’, ‘suasenha’)
smtp.sendmail(de, para, raw)
smtp.quit()

Com esta biblioteca para manipulação de e-mail, a montagem e o envio de um e-mail ficam bem mais simplificados, não é? Espero que você tenha gostado e até mais. Parte deste código foi obtido na documentação do módulo e-mail.

Acesse a versão completa
Sair da versão mobile