A automação de e-mails com Python para envio e leitura é feita nativamente utilizando as bibliotecas smtplib (para enviar) e imaplib (para ler), em conjunto com o módulo email.mime para estruturar mensagens com HTML e anexos. No entanto, devido às recentes mudanças globais de segurança, não é mais possível usar sua senha comum de e-mail no código; é obrigatório gerar uma "Senha de Aplicativo" (App Password) associada à Autenticação de Dois Fatores (2FA) na sua conta do Google ou Microsoft, ou implementar o protocolo OAuth2 para aplicações corporativas.
Principais Aprendizados
- Segurança atualizada: O Google e a Microsoft bloquearam o acesso via usuário e senha simples (Autenticação Básica). O uso de Senhas de Aplicativo ou OAuth2 agora é obrigatório.
- Bibliotecas nativas: Você não precisa instalar pacotes externos para operações básicas; o Python já inclui
smtplib,imaplibeemail.mime. - Escalabilidade: Para enviar e-mails em massa ou de forma transacional, abandone o SMTP tradicional e utilize APIs dedicadas (como SendGrid ou Gmail API) para evitar bloqueios de spam.
O fim da autenticação básica (Por que tutoriais antigos falham)
Se você tentou rodar um script de automação de e-mail recentemente e recebeu um erro de autenticação, saiba que o problema não está no seu código, mas nas políticas dos provedores. Como especialista na área, acompanhei de perto essa transição que pegou muitos desenvolvedores de surpresa.
É um fato verificado que o Google encerrou o suporte a "aplicativos menos seguros" (Less Secure Apps) no Google Workspace em 1º de maio de 2025. Da mesma forma, a Microsoft desativará por padrão a Autenticação Básica para SMTP AUTH no Exchange Online até o final de dezembro de 2026. Novos locatários já nascem sem esse suporte. Isso significa que colocar sua senha do dia a dia no script Python resultará em um bloqueio imediato.

Preparando o terreno: Senhas de Aplicativo vs. OAuth2
Para resolver o problema de autenticação, a engenharia de software estabeleceu dois caminhos principais, dependendo do escopo do seu projeto:
- Senhas de Aplicativo (App Passwords): Ideal para scripts pessoais ou internos simples. Você ativa a verificação em duas etapas (2FA) na sua conta e gera uma senha exclusiva de 16 dígitos apenas para o Python usar.
- OAuth2 / APIs REST: O consenso absoluto para aplicações corporativas. Em vez de usar SMTP, você utiliza APIs como a Microsoft Graph API ou a Google Gmail API. Isso garante maior segurança, facilidade no tratamento de bounces (devoluções) e melhor entregabilidade.
Antes de começar a codificar, é altamente recomendável isolar seu projeto. Configurar ambientes virtuais em Python garante que as dependências do seu script não interfiram no sistema operacional.
Como enviar e-mails com Python (Passo a Passo)
Para o envio, utilizaremos as bibliotecas nativas. O fluxo consiste em criar a mensagem, conectar ao servidor e enviá-la.
1. Construindo a mensagem com email.mime
O padrão atual e mais robusto no Python para criar mensagens complexas (com HTML e anexos) é o uso do módulo email.mime. Evite formatar cabeçalhos de e-mail manualmente como strings, pois isso é muito propenso a erros.
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
msg = MIMEMultipart()
msg['From'] = 'seu_email@gmail.com'
msg['To'] = 'destinatario@exemplo.com'
msg['Subject'] = 'Relatório Automatizado'
corpo = "<p>Olá, segue o <strong>relatório</strong> atualizado.</p>"
msg.attach(MIMEText(corpo, 'html'))
2. Conectando e enviando com smtplib
Para a conexão, segundo a documentação oficial do Python, utilizamos a porta 465 para conexões SSL diretas, ou a porta 587 para iniciar a conexão e depois criptografá-la com o comando starttls().
import smtplib
import os
# Consenso de segurança: nunca hardcode sua senha!
senha_app = os.environ.get('EMAIL_APP_PASSWORD')
try:
# Usando a porta 587 (TLS)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls() # Inicia a criptografia
server.login(msg['From'], senha_app)
server.send_message(msg)
print("E-mail enviado com sucesso!")
except Exception as e:
print(f"Erro ao enviar: {e}")
finally:
server.quit()

Como ler e-mails (Inbox Reading) com imaplib
A leitura de e-mails é feita através do protocolo IMAP. A biblioteca imaplib permite conectar à sua caixa de entrada, buscar mensagens específicas e ler seu conteúdo.
import imaplib
import email
try:
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('seu_email@gmail.com', senha_app)
mail.select('inbox')
# Busca e-mails não lidos
status, mensagens = mail.search(None, 'UNSEEN')
ids_mensagens = mensagens[0].split()
for id_msg in ids_mensagens:
status, dados = mail.fetch(id_msg, '(RFC822)')
msg_raw = dados[0][1]
msg_lida = email.message_from_bytes(msg_raw)
print("Assunto:", msg_lida['Subject'])
except Exception as e:
print(f"Erro na leitura: {e}")
Após extrair os dados dos e-mails, você pode estruturá-los para análise. Utilizar bibliotecas como Pandas para análise de dados é uma excelente forma de transformar o texto bruto das mensagens em DataFrames para gerar insights e relatórios.
Boas práticas e erros comuns na automação
Como especialista, vejo muitos projetos falharem ao ir para produção por ignorarem regras básicas. Aqui estão os principais pontos de atenção:
- Segurança de Credenciais: É consenso absoluto que senhas nunca devem ficar no código. Use variáveis de ambiente (
os.environ) ou arquivos.env. - Limites de Envio (Rate Limits): Provedores impõem limites rígidos. Contas gratuitas do Gmail limitam o envio a cerca de 500 e-mails por dia. Tentar enviar newsletters por uma conta pessoal resultará em bloqueio rápido.
- Porta 25 bloqueada: É um erro comum tentar usar a porta 25 em provedores de nuvem (AWS, Google Cloud, DigitalOcean). Ela é bloqueada por padrão para evitar spam. Use sempre as portas 587 ou 465.
- Tratamento de Erros: Operações de rede falham. Envolva sempre suas chamadas de conexão em blocos
try/except.
Para entender mais sobre o cronograma de descontinuação de autenticações antigas no ecossistema corporativo, recomendo a leitura das atualizações da Microsoft sobre o Exchange Online.
Perguntas Frequentes
Por que meu script Python de e-mail parou de funcionar do nada?
Provavelmente devido ao fim do suporte à Autenticação Básica (usuário e senha simples) por provedores como Google e Microsoft. Você precisa gerar uma "Senha de Aplicativo" (App Password) com a verificação em duas etapas ativada ou migrar para OAuth2.
Posso usar o Python para enviar e-mail marketing em massa pelo Gmail?
Não é recomendado. O Gmail gratuito tem um limite de envio de aproximadamente 500 e-mails por dia. Ultrapassar isso ou enviar e-mails em massa sem opt-in claro resultará no bloqueio da sua conta por violação dos termos de serviço. Para isso, use APIs como SendGrid ou AWS SES.
Qual a diferença entre as portas 465 e 587 no smtplib?
A porta 465 é usada para conexões que exigem criptografia SSL desde o momento inicial da conexão (usando SMTP_SSL). Já a porta 587 é o padrão moderno para TLS explícito, onde a conexão inicia sem criptografia e é "promovida" a uma conexão segura através do comando starttls().
0 Comentários