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 = 465SMTP_USER = "[email protected]"SMTP_PASSWORD = "<mailbox-password>"SMTP_FROM = "[email protected]"SMTP_FROM_NAME = "Example"
465: implicit TLS587: STARTTLSPython: 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 smtplibimport sslfrom getpass import getpassfrom email.message import EmailMessagefrom 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"] = recipientmessage["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.