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):
- Acesse myaccount.google.com
- Segurança → Verificação em duas etapas (ative se não estiver)
- Senhas de app → Gere uma nova
- 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.