Pular para o conteúdo
Português (Brasil)

Envio por SMTP

Antes de conectar

Envie e-mails pelo seu aplicativo via SMTP com o usuário e a senha da caixa de e-mail. Chaves de API e tokens de conta não servem para SMTP.

Crie uma caixa ativa em um domínio conectado e conclua a verificação dos registros DNS. O usuário é o endereço completo, como [email protected]. Use a senha dessa caixa, não a da conta de e-mail. Substitua os endereços dos exemplos pelos seus; a senha é digitada na execução sem ser exibida.

Servidor, portas e criptografia

Use mail.adapt-mail.com para qualquer domínio conectado. Na porta 465, o TLS começa imediatamente; na 587, o STARTTLS é executado antes da autenticação. Escolha uma opção. Mantenha a verificação do certificado ativada.

Nos exemplos, o endereço From e o remetente do envelope SMTP correspondem ao usuário da caixa. O nome de exibição do remetente pode ser alterado. A porta 25 é usada entre servidores de e-mail; use 465 ou 587 no seu aplicativo.

SMTP_HOST = "mail.adapt-mail.com"
SMTP_PORT = 465
SMTP_USER = "[email protected]"
SMTP_PASSWORD = "<mailbox-password>"
SMTP_FROM = "[email protected]"
SMTP_FROM_NAME = "Example"
465: implicit TLS
587: STARTTLS

Python: envio pela porta 465

O exemplo usa apenas a biblioteca padrão do Python 3. Salve-o como send_mail.py e execute python3 send_mail.py. Para envios automáticos, obtenha a senha da configuração segura do aplicativo; não a salve no Git nem nos logs.

import smtplib
import ssl
from getpass import getpass
from email.message import EmailMessage
from email.utils import formataddr, make_msgid, formatdate
username = "[email protected]"
password = getpass("SMTP password: ")
recipient = "[email protected]"
message = EmailMessage()
message["From"] = formataddr(("Example", username))
message["To"] = recipient
message["Subject"] = "SMTP test"
message["Date"] = formatdate(localtime=False, usegmt=True)
message["Message-ID"] = make_msgid(domain=username.split("@")[1])
message.set_content("Hello! This message was sent through Adapt Mail SMTP.")
with smtplib.SMTP_SSL(
"mail.adapt-mail.com", 465, timeout=30,
context=ssl.create_default_context(),
) as smtp:
smtp.login(username, password)
refused = smtp.send_message(
message, from_addr=username, to_addrs=[recipient],
)
print("Rejected recipients:", refused)

Python: conexão pela porta 587

Para STARTTLS, mantenha a preparação da mensagem do exemplo anterior e substitua o bloco with smtplib.SMTP_SSL pelo seguinte. Com smtplib.SMTP, a senha só é enviada após o STARTTLS ser concluído com sucesso.

with smtplib.SMTP("mail.adapt-mail.com", 587, timeout=30) as smtp:
smtp.ehlo()
smtp.starttls(context=ssl.create_default_context())
smtp.ehlo()
smtp.login(username, password)
refused = smtp.send_message(
message, from_addr=username, to_addrs=[recipient],
)
print("Rejected recipients:", refused)

HTML e anexos

Adicione a versão HTML após set_content e o anexo antes do envio. Mantenha a versão em texto para clientes sem suporte a HTML. Use HTML confiável ou escape os dados inseridos.

message.add_alternative(
"<p>Hello! This message was sent through <strong>Adapt Mail</strong>.</p>",
subtype="html",
)
with open("document.pdf", "rb") as attachment:
message.add_attachment(
attachment.read(), maintype="application", subtype="pdf",
filename="document.pdf",
)

Resultado, limites e mensagens enviadas

Um send_message bem-sucedido significa que o servidor SMTP aceitou a mensagem, não que ela chegou à caixa de entrada do destinatário. O dicionário refused contém os destinatários rejeitados; se todos forem rejeitados, o Python lança SMTPRecipientsRefused.

SMTP e API compartilham os limites de cada caixa: até 30 mensagens em uma janela móvel de 60 segundos, 50 destinatários por mensagem e 1000 destinatários em uma janela móvel de 24 horas, ou 5000 com o limite ampliado ativado. Todos os destinatários To, Cc e Bcc são contabilizados.

O envio direto por SMTP não salva automaticamente uma cópia em Enviados. Os clientes de e-mail fazem isso por IMAP; a API do Adapt Mail salva a cópia separadamente.

Erros SMTP

535
Falha na autenticação: confira o endereço completo, a senha e a disponibilidade da caixa.
451
Falha temporária, inclusive ao exceder os limites de envio. Tente novamente mais tarde, após uma espera.
550 / 5xx
Rejeição permanente: confira os endereços, as permissões do remetente e o texto da resposta. Mais de 50 destinatários são rejeitados após DATA. Corrija a causa antes de tentar novamente.
TLS / timeout
Confira mail.adapt-mail.com, a porta, o modo TLS e o acesso de saída do servidor do aplicativo. Use SMTP_SSL em 465 ou SMTP com STARTTLS em 587.

Leia a resposta completa do servidor SMTP. Repita falhas temporárias após uma espera. Se a conexão cair após transmitir a mensagem e o resultado for desconhecido, não reenvie às cegas: SMTP não possui Idempotency-Key, e a repetição pode gerar uma duplicata.