Programador Leigo
Automação 9 min leitura 13 MAR 2026

Envio de emails automáticos com Python

Envie emails com anexos usando smtplib e email. Automatize notificações e relatórios.


Por que enviar emails com Python?

Notificações de sistemas, relatórios automáticos, alertas de monitoramento — tudo isso pode ser resolvido com Python e a biblioteca padrão, sem instalar nada extra.


O básico: enviando um email simples

import smtplib
from email.mime.text import MIMEText

msg = MIMEText("Ola! Este email foi enviado por um script Python.")
msg["Subject"] = "Teste de email automatico"
msg["From"] = "seu@email.com"
msg["To"] = "destino@email.com"

with smtplib.SMTP("smtp.gmail.com", 587) as server:
    server.starttls()
    server.login("seu@email.com", "sua_senha_de_app")
    server.send_message(msg)

print("Email enviado!")

Configurando o Gmail

Para usar o Gmail, você precisa criar uma senha de app (não use sua senha normal):

  1. Acesse myaccount.google.com
  2. Segurança → Verificação em duas etapas (ative se não estiver)
  3. Senhas de app → Gere uma nova
  4. Use essa senha de 16 caracteres no script

Nunca coloque senhas direto no código. Use variáveis de ambiente:

import os

EMAIL = os.environ["EMAIL_USER"]
SENHA = os.environ["EMAIL_PASS"]

Email com HTML

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib

msg = MIMEMultipart("alternative")
msg["Subject"] = "Relatorio diario"
msg["From"] = "seu@email.com"
msg["To"] = "destino@email.com"

texto = "Relatorio disponivel no link abaixo."
html = """
<html>
<body>
    <h2 style="color: #333;">Relatorio Diario</h2>
    <p>Vendas de hoje: <strong>R$ 15.420,00</strong></p>
    <table border="1" cellpadding="8" style="border-collapse: collapse;">
        <tr style="background: #f0f0f0;">
            <th>Produto</th><th>Vendas</th>
        </tr>
        <tr><td>Camiseta</td><td>42</td></tr>
        <tr><td>Caneca</td><td>87</td></tr>
    </table>
</body>
</html>
"""

msg.attach(MIMEText(texto, "plain"))
msg.attach(MIMEText(html, "html"))

with smtplib.SMTP("smtp.gmail.com", 587) as server:
    server.starttls()
    server.login("seu@email.com", "senha_de_app")
    server.send_message(msg)

O cliente de email vai mostrar a versão HTML se suportada, senão mostra o texto puro.


Email com anexo

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import smtplib

msg = MIMEMultipart()
msg["Subject"] = "Relatorio mensal em anexo"
msg["From"] = "seu@email.com"
msg["To"] = "destino@email.com"

msg.attach(MIMEText("Segue o relatorio em anexo.", "plain"))

# Anexar arquivo
with open("relatorio.xlsx", "rb") as f:
    anexo = MIMEBase("application", "octet-stream")
    anexo.set_payload(f.read())
    encoders.encode_base64(anexo)
    anexo.add_header(
        "Content-Disposition",
        "attachment",
        filename="relatorio.xlsx"
    )
    msg.attach(anexo)

with smtplib.SMTP("smtp.gmail.com", 587) as server:
    server.starttls()
    server.login("seu@email.com", "senha_de_app")
    server.send_message(msg)

print("Email com anexo enviado!")

Enviando para múltiplos destinatários

import smtplib
from email.mime.text import MIMEText

destinatarios = [
    "ana@empresa.com",
    "pedro@empresa.com",
    "maria@empresa.com",
]

msg = MIMEText("Reuniao amanha as 10h.")
msg["Subject"] = "Lembrete de reuniao"
msg["From"] = "seu@email.com"
msg["To"] = ", ".join(destinatarios)

with smtplib.SMTP("smtp.gmail.com", 587) as server:
    server.starttls()
    server.login("seu@email.com", "senha_de_app")
    server.send_message(msg)

Criando uma função reutilizável

import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from pathlib import Path


def enviar_email(para, assunto, corpo, html=None, anexos=None):
    remetente = os.environ["EMAIL_USER"]
    senha = os.environ["EMAIL_PASS"]

    msg = MIMEMultipart()
    msg["From"] = remetente
    msg["To"] = para if isinstance(para, str) else ", ".join(para)
    msg["Subject"] = assunto

    msg.attach(MIMEText(corpo, "plain"))

    if html:
        msg.attach(MIMEText(html, "html"))

    for caminho in (anexos or []):
        arquivo = Path(caminho)
        with open(arquivo, "rb") as f:
            parte = MIMEBase("application", "octet-stream")
            parte.set_payload(f.read())
            encoders.encode_base64(parte)
            parte.add_header(
                "Content-Disposition",
                "attachment",
                filename=arquivo.name,
            )
            msg.attach(parte)

    with smtplib.SMTP("smtp.gmail.com", 587) as server:
        server.starttls()
        server.login(remetente, senha)
        server.send_message(msg)

    print(f"Email enviado para {msg['To']}")


# Uso
enviar_email(
    para="destino@email.com",
    assunto="Relatorio semanal",
    corpo="Segue relatorio em anexo.",
    anexos=["relatorio.xlsx", "graficos.pdf"],
)

Outros provedores SMTP

Provedor Servidor Porta
Gmail smtp.gmail.com 587
Outlook smtp-mail.outlook.com 587
Yahoo smtp.mail.yahoo.com 587
Mailtrap (testes) smtp.mailtrap.io 587

Para testes, o Mailtrap é ótimo — ele captura os emails sem enviar de verdade.


Resumo

Módulo Para que serve
smtplib Conexão com servidor SMTP
email.mime.text Corpo do email (texto/HTML)
email.mime.multipart Email com múltiplas partes
email.mime.base Anexos
email.encoders Codificação base64 para anexos

Com esses módulos da biblioteca padrão, você automatiza qualquer fluxo de envio de emails sem depender de serviços pagos.

Continue lendo

Compartilhar