05 - Protocolo SMTP
video: https://youtu.be/... no frontmatter da nota.O SMTP (Simple Mail Transfer Protocol) é o protocolo padrão da Internet para o envio e transferência de mensagens de correio eletrônico entre sistemas. Padronizado na RFC 5321, ele é um protocolo de texto, orientado à conexão, que opera na camada de aplicação utilizando o TCP.
Diferente de protocolos de leitura (como POP3 ou IMAP), o SMTP é um protocolo de "Empurrar" (Push): ele é usado para mover a mensagem do remetente até o servidor do destinatário.
1. Funcionamento em Alto Nível
Uma transação SMTP típica envolve uma série de comandos e respostas entre um cliente (remetente) e um servidor (receptor).
- Porta 25: Porta padrão para transferência entre servidores (Relay).
- Porta 587: Porta padrão para submissão de mensagens por usuários (Submission).
O modelo é estritamente cliente-servidor sobre TCP. O cliente SMTP (MUA ou MSA) abre a conexão, envia os comandos em sequência, aguarda as respostas do servidor e, ao final, encerra a conexão. Cada mensagem é uma transação independente — não existe conceito de "sessão persistente" entre mensagens.
2. Comandos SMTP Essenciais
A comunicação acontece via comandos textuais terminados em CRLF (\r\n). Os principais comandos são:
| Comando | Função |
|---|---|
HELO dominio |
Saudação antiga (RFC 821) — identifica o cliente |
EHLO dominio |
Saudação estendida (ESMTP) — o servidor retorna capacidades |
MAIL FROM: <remetente> |
Inicia uma transação, define o envelope do remetente |
RCPT TO: <destinatario> |
Define o destinatário (pode haver múltiplos RCPT TO) |
DATA |
Inicia o envio do corpo da mensagem; termina com \r\n.\r\n |
QUIT |
Encerra a sessão SMTP |
RSET |
Aborta a transação atual sem fechar a conexão |
NOOP |
"No operation" — testa se o servidor responde |
VRFY <usuario> |
Verifica se um usuário existe (geralmente desativado por segurança) |
STARTTLS |
Solicita upgrade da conexão para TLS |
AUTH <mechanismo> |
Autentica o cliente (PLAIN, LOGIN, CRAM-MD5, etc.) |
Exemplo Prático com Telnet
$ telnet smtp.exemplo.com 25
220 smtp.exemplo.com ESMTP Postfix
EHLO cliente.local
250-smtp.exemplo.com
250-PIPELINING
250-SIZE 10240000
250-STARTTLS
250-AUTH LOGIN PLAIN
250 HELP
MAIL FROM:<remetente@exemplo.com>
250 Ok
RCPT TO:<destinatario@exemplo.com>
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: Teste SMTP
From: remetente@exemplo.com
To: destinatario@exemplo.com
Corpo da mensagem de teste.
.
250 Ok: queued as ABC123
QUIT
221 Bye
3. Códigos de Resposta
As respostas do servidor SMTP seguem um padrão de três dígitos (NDC) onde o primeiro dígito indica a classe:
| Código | Significado | Exemplos |
|---|---|---|
| 2xx | Resposta positiva definitiva | 220 (pronto), 250 (OK), 221 (fechando) |
| 3xx | Resposta positiva intermediária | 354 (inicie o corpo da mensagem) |
| 4xx | Erro transitório (tente depois) | 421 (servidor indisponível), 450 (caixa cheia) |
| 5xx | Erro permanente (não tente de novo) | 550 (caixa inexistente), 553 (endereço inválido) |
A distinção entre 4xx e 5xx é crítica para o comportamento da fila de e-mail: erros 4xx fazem o MTA tentar novamente em intervalos crescentes (5 min, 30 min, 2h, 8h...). Erros 5xx fazem o MTA devolver imediatamente a mensagem ao remetente como "bounce".
4. Estrutura do Módulo SMTP
Para dominar o funcionamento técnico do e-mail, exploraremos os seguintes tópicos:
- Fundamentos e Terminologia (MTA, MUA, MDA)
- O Fluxo de Envio e Transferência
- Protocolos de Acesso (POP3 e IMAP)
- Comandos SMTP e Códigos de Resposta
5. MIME - Multipurpose Internet Mail Extensions
O SMTP original só suportava texto ASCII de 7 bits. Isso impedia o envio de acentos, imagens, áudio e anexos binários. A solução veio com o MIME (RFC 2045-2049), que permite:
- Codificação de caracteres: UTF-8, ISO-8859-1, etc. através do cabeçalho
Content-Type: text/html; charset=UTF-8. - Multipartes: Mensagens com várias partes (texto + HTML + anexos) separadas por um "boundary".
- Codificação binária: Base64 ou Quoted-Printable transformam bytes binários em caracteres ASCII seguros para o transporte SMTP.
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="frontier"
--frontier
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Mensagem de teste com acentuação.
--frontier
Content-Type: application/pdf; name="doc.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="doc.pdf"
JVBERi0xLjQKMSAwIG9iago...
--frontier--
6. Fila de E-mail (Mail Queue)
Quando um MTA não consegue entregar uma mensagem (ex: servidor de destino fora do ar), ele a coloca em uma fila (queue) e tenta novamente mais tarde. O Postfix mantém a fila em /var/spool/postfix/deferred/.
- Tentativas: Geralmente configuradas para 5 dias (RFC 5321 recomenda 4-5 dias).
- Backoff exponencial: A cada falha, o intervalo entre tentativas cresce (15min, 30min, 1h, 2h, 4h, 8h...).
- Bounce: Após esgotar as tentativas, o MTA gera uma mensagem de erro para o remetente informando a falha.
7. Extensões ESMTP
O comando EHLO (introduzido na RFC 1869) faz o servidor listar suas extensões:
8BITMIME— Suporta 8 bits no corpo (sem codificação MIME).SIZE <n>— Limita o tamanho máximo da mensagem.STARTTLS— Permite upgrade para TLS.AUTH— Mecanismos de autenticação suportados.PIPELINING— Cliente pode enviar vários comandos sem aguardar resposta.DSN— Delivery Status Notifications (confirmação de entrega).
8. Segurança e Autenticação
O SMTP original não tinha autenticação — qualquer um podia enviar e-mail para qualquer servidor, o que facilitou o spam massivo a partir dos anos 1990. As extensões modernas corrigem isso:
- SMTP AUTH (RFC 4954): Cliente deve se autenticar (LOGIN, PLAIN, CRAM-MD5) antes de enviar.
- STARTTLS (RFC 3207): Upgrade da conexão para TLS, cifrando todo o tráfego.
- SPF/DKIM/DMARC: Mecanismos de validação de domínio que reduzem spoofing e phishing.
O SMTP original não possuía mecanismos de criptografia ou autenticação fortes. Hoje, utilizamos o ESMTP (Extended SMTP) com comandos como STARTTLS e AUTH para garantir a segurança das comunicações.
9. Resumo Técnico
| Atributo | Valor |
|---|---|
| RFC atual | 5321 (2008) |
| Transporte | TCP |
| Portas | 25 (relay), 587 (submission), 465 (SMTPS) |
| Tipo | Push, baseado em texto |
| Extensão | ESMTP (EHLO + extensões) |
| Códigos de resposta | 2xx/3xx/4xx/5xx |
| Anexos | MIME (RFC 2045) |
| Segurança | STARTTLS, AUTH, SPF, DKIM, DMARC |
10. Conclusão
O SMTP é um protocolo resiliente que sobrevive há mais de 40 anos. Apesar da simplicidade do seu modelo — comandos textuais sobre TCP — suas extensões ESMTP, MIME e STARTTLS o tornaram capaz de transportar bilhões de mensagens diárias com anexos binários, autenticação e criptografia. Entender os comandos, códigos de resposta e a fila de e-mail é fundamental para qualquer engenheiro que opere servidores de correio.