Email

Enviando e-mails com Python

Python pode enviar e-mail sem instalar nada. A biblioteca padrão inclui smtplib para a conexão SMTP e email.message.EmailMessage para montar a mensagem, então um script funcional tem cerca de quinze linhas. Abaixo está esse script com TLS feito corretamente, e depois o argumento para migrar para uma HTTP API quando o tráfego real aparecer.

Como enviar e-mail com a biblioteca padrão?

EmailMessage monta a mensagem e define os cabeçalhos para você. smtplib.SMTP_SSL abre uma conexão criptografada na porta 465:

import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg["From"] = "you@yourdomain.com"
msg["To"] = "recipient@example.org"
msg["Subject"] = "Your receipt"
msg.set_content("Thanks for your order. This is the plain-text version.")
msg.add_alternative("<p>Thanks for your order.</p>", subtype="html")

with smtplib.SMTP_SSL("smtp.example.com", 465) as server:
    server.login("smtp-user", "smtp-password")
    server.send_message(msg)

set_content escreve o corpo em texto simples e add_alternative anexa a versão HTML, para que os clientes escolham o que conseguem renderizar. Enviar ambas as partes é boa prática e ajuda na entregabilidade.

SSL ou STARTTLS?

Existem dois caminhos de criptografia e eles usam portas diferentes. SMTP_SSL na porta 465 negocia TLS desde o primeiro byte. A alternativa é SMTP simples na porta 587 seguido de starttls(), que eleva uma conexão em texto claro:

with smtplib.SMTP("smtp.example.com", 587) as server:
    server.starttls()
    server.login("smtp-user", "smtp-password")
    server.send_message(msg)

Escolha com base no que o seu servidor de e-mail suporta. Não envie credenciais por uma conexão não criptografada. Mantenha o usuário e a senha em variáveis de ambiente, lidas com os.environ, nunca fixas no código.

Como adicionar um anexo?

add_attachment recebe os bytes e um tipo MIME. Leia o arquivo em modo binário:

with open("invoice.pdf", "rb") as f:
    msg.add_attachment(
        f.read(),
        maintype="application",
        subtype="pdf",
        filename="invoice-1042.pdf",
    )

Por que abandonar o SMTP puro em produção?

O script funciona, mas a produção traz problemas que a biblioteca padrão não resolve. Você precisa de um servidor de e-mail com reputação de IP limpa, registros SPF, DKIM e DMARC corretos, lógica de retentativa para falhas transitórias e uma forma de ver bounces e reclamações. Uma HTTP API reúne tudo isso. Você se autentica com uma chave, envia JSON e lê respostas estruturadas em vez de interpretar códigos de status SMTP.

Envie com Bird

O Bird Python SDK envia a mesma mensagem sem a infraestrutura SMTP:

import bird

client = bird.Bird(api_key=os.environ["BIRD_API_KEY"])

data, error = client.emails.send(
    from_="you@yourdomain.com",
    to="delivered@bird.dev",
    subject="Hello from Python",
    html="<p>It works.</p>",
)

O endereço sandbox delivered@bird.dev sempre aceita e-mails, então a primeira execução confirma sua chave e payload antes de você apontar para destinatários reais. O SDK retorna um par (data, error), o que mantém o tratamento de erros explícito em vez de capturar exceções SMTP. Se PHP é mais a sua linguagem, o tutorial do PHPMailer cobre o equivalente nesse ecossistema.

FAQ

Preciso instalar algo para enviar e-mail em Python?

Não. smtplib e email.message estão na biblioteca padrão, então um envio básico via SMTP não precisa de pacotes. Você só adiciona uma dependência quando quer um cliente de nível mais alto ou uma HTTP API.

Qual é a diferença entre a porta 465 e a 587?

A porta 465 espera TLS desde o início, o que smtplib.SMTP_SSL gerencia. A porta 587 começa em texto claro e eleva com starttls(). Ambas terminam criptografadas; apenas negociam isso em momentos diferentes.

Quando devo migrar do smtplib para uma API?

Quando você se preocupa com entregabilidade, retentativas e rastreamento de eventos. A biblioteca padrão envia a mensagem; ela não gerencia reputação nem reporta o que aconteceu após a entrega. Uma API como o Bird email cobre essa camada.

Para o formato completo de solicitação e resposta, o guia de envio de e-mail percorre a API de ponta a ponta.

Construa na mesma rede.

Uma chave de API de teste é sua imediatamente. A produção é desbloqueada quando adicionar um método de pagamento e verificar um remetente.

Sua próxima ideia.
Pronta para conectar.