06 - Outros Comandos
video: https://youtu.be/... no frontmatter da nota.Outros Comandos SMTP
1. Definição
Além do conjunto mínimo de comandos (HELO, MAIL, RCPT, DATA, QUIT), o SMTP define uma série de comandos adicionais padronizados nas RFCs 5321 (base) e 4954 (autenticação). Estes comandos expandem o protocolo para suportar extensões (EHLO), autenticação (AUTH), criptografia (STARTTLS), verificação de destinatários (VRFY, EXPN) e operações de controle de sessão (NOOP, RSET, HELP). O conjunto completo é frequentemente chamado de ESMTP (Extended SMTP).
Comandos ESMTP Principais
| Comando | Função | RFC |
|---|---|---|
EHLO |
Saudação estendida (anuncia extensões) | 5321 |
AUTH |
Autenticação do cliente | 4954 |
STARTTLS |
Upgrade para TLS | 3207 |
VRFY |
Verifica existência de mailbox | 5321 |
EXPN |
Expande lista de distribuição | 5321 |
NOOP |
Testa conexão (no-op) | 5321 |
RSET |
Cancela transação atual | 5321 |
HELP |
Lista comandos suportados | 5321 |
BDAT |
Dados binários por chunk | 3030 |
2. EHLO — Saudação Estendida
O comando EHLO (Extended HELO) foi introduzido na RFC 1869 (1995) para permitir que o servidor anuncie as extensões suportadas. Em resposta, o servidor retorna múltiplas linhas 250- (continuação) e uma linha final 250 (fim). Se o servidor não suportar ESMTP, responde 500 Syntax error, e o cliente deve recuar para HELO.
C: EHLO mail.exemplo.com
S: 250-mail.exemplo.com Hello you
S: 250-SIZE 52428800
S: 250-PIPELINING
S: 250-STARTTLS
S: 250-AUTH PLAIN LOGIN CRAM-MD5
S: 250-ENHANCEDSTATUSCODES
S: 250-8BITMIME
S: 250 CHUNKING
As extensões anunciadas determinam quais comandos adicionais o cliente pode usar e quais parâmetros extras são aceitos em MAIL FROM (ex.: SIZE, BODY=8BITMIME, AUTH=).
3. AUTH — Autenticação
O comando AUTH (RFC 4954) autentica o cliente no servidor, normalmente exigido em MSA (Mail Submission Agent) na porta 587 para evitar relay aberto. Os mecanismos mais comuns são:
| Mecanismo | Descrição | Segurança |
|---|---|---|
PLAIN |
Base64 de \0user\0pass |
Requer TLS |
LOGIN |
Challenge-response em Base64 | Requer TLS |
CRAM-MD5 |
HMAC-MD5 com challenge do servidor | Protege senha |
GSSAPI |
Kerberos 5 | Alta (SSO) |
OAUTHBEARER |
OAuth 2.0 token bearer | Alta |
SCRAM-SHA-256 |
Salted Challenge Response | Alta |
Exemplo Prático com PLAIN
# Gerar token Base64: \0usuario\0senha
printf '\0usuario\0senha' | base64
# saida: AHVzdWFyaW8Ac2VuaGE=
openssl s_client -starttls smtp -crlf -connect smtp.exemplo.com:587
Sessão resultante:
C: AUTH PLAIN
S: 334
C: AHVzdWFyaW8Ac2VuaGE=
S: 235 2.7.0 Authentication successful
4. STARTTLS — Upgrade para TLS
Definido na RFC 3207, STARTTLS permite que uma conexão TCP em texto puro (porta 25 ou 587) seja elevada a TLS sem precisar de porta dedicada (como a 465 para SMTPS implícito). Após EHLO, o cliente envia STARTTLS, faz o handshake TLS e reenvia EHLO sobre o canal cifrado — necessário porque o servidor pode anunciar AUTH apenas após TLS.
C: EHLO cliente
S: 250-STARTTLS
C: STARTTLS
S: 220 2.0.0 Ready to start TLS
[handshake TLS]
C: EHLO cliente
S: 250-AUTH PLAIN LOGIN
A verificação de certificado deve ser feita pelo cliente. Configuração no Postfix:
smtp_tls_security_level = may
smtp_tls_verify_cert_match = hostname
smtpd_tls_auth_only = yes
5. VRFY e EXPN — Verificação de Usuários
O comando VRFY valida se uma mailbox existe. EXPN expande listas de distribuição (mailing lists). Ambos são desabilitados por padrão em servidores modernos porque facilitam enumeração de contas por spammers.
C: VRFY postmaster
S: 250 2.1.5 <postmaster@exemplo.com>
C: EXPN vendas
S: 250-2.1.5 <joao@exemplo.com>
S: 250 2.1.5 <maria@exemplo.com>
Configuração típica no Postfix para desativar:
disable_vrfy_command = yes
smtpd_noop_commands =
Muitos servidores respondem 252 Cannot VRFY user (resposta ambígua proposital) para não confirmar nem negar a existência.
6. NOOP, RSET e HELP — Controle de Sessão
NOOP
NOOP (No Operation) apenas verifica se a conexão está ativa. O servidor responde 250 OK sem alterar estado da transação, útil para manter keepalive em conexões persistentes.
C: NOOP
S: 250 2.0.0 OK
RSET
RSET aborta a transação atual, descartando MAIL FROM e RCPT TO previamente definidos, mas mantém a sessão autenticada e a conexão:
C: MAIL FROM:<rem@exemplo.com>
C: RCPT TO:<dest@exemplo.com>
C: RSET
S: 250 2.0.0 OK
C: MAIL FROM:<outro@exemplo.com> # nova transação
HELP
HELP lista os comandos suportados pelo servidor ou detalha um comando específico. Resposta opcional e meramente informativa:
C: HELP
S: 214-2.0.0 This is Postfix
S: 214-2.0.0 Commands supported:
S: 214-2.0.0 HELO EHLO MAIL RCPT DATA
S: 214-2.0.0 NOOP QUIT RSET VRFY
S: 214 2.0.0 End of HELP
7. Resumo dos Códigos de Resposta
| Código | Significado | Classe |
|---|---|---|
| 220 | Serviço pronto | Sucesso |
| 235 | Autenticação bem-sucedida | Sucesso |
| 250 | Comando OK | Sucesso |
| 252 | Não é possível VRFY, mas aceita | Sucesso |
| 334 | Challenge de servidor (AUTH) | Intermediário |
| 354 | Inicie envio de dados (DATA) | Intermediário |
| 421 | Serviço indisponível, fechando | Temporário |
| 450/451 | Mailbox/erro local temporário | Temporário |
| 500 | Erro de sintaxe | Permanente |
| 530 | Autenticação requerida | Permanente |
| 535 | Autenticação falhou | Permanente |
| 550/553 | Mailbox indisponível/nome não permitido | Permanente |
Códigos 4xx são falhas temporárias (cliente deve retransmitir); 5xx são permanentes (rejeição definitiva). Há ainda BDAT/CHUNKING (RFC 3030), que substitui DATA enviando chunks com tamanho explícito (BDAT 1000 LAST), evitando o terminador <CRLF>.<CRLF> problemático para mensagens com linhas contendo apenas um ponto.
8. Diagnóstico Prático
# Sem criptografia (porta 25)
telnet smtp.exemplo.com 25
# Com STARTTLS (porta 587) ou SMTPS implicito (465)
openssl s_client -starttls smtp -crlf -connect smtp.exemplo.com:587
openssl s_client -crlf -connect smtp.exemplo.com:465
# Verificar extensões anunciadas e mecanismos AUTH
echo -e "EHLO test\nQUIT" | nc smtp.exemplo.com 25
swaks --auth --server smtp.exemplo.com:587 --tls --to dest@ex.com
9. Boas Práticas de Configuração
| Prática | Recomendação |
|---|---|
| Porta 25 | Apenas MTA-to-MTA, sem AUTH, sem STARTTLS obrigatório |
| Porta 587 | MSA, AUTH obrigatório, STARTTLS recomendado |
| Porta 465 | SMTPS implícito (TLS direto), legado |
VRFY/EXPN |
Desativar (disable_vrfy_command = yes) |
| AUTH sem TLS | Proibir (smtpd_tls_auth_only = yes) |
| Relay aberto | Negar por padrão, liberar apenas após AUTH |
| Cifras TLS | Mínimo TLS 1.2, desativar RC4/3DES |
| Log | Habilitar smtpd_tls_loglevel = 1 |
10. Conclusão
Os comandos ESMTP adicionais transformaram o SMTP simples de 1982 em um protocolo robusto capaz de autenticação, criptografia e operações de gerenciamento. EHLO é a porta de entrada para todas as extensões; AUTH e STARTTLS são essenciais para segurança moderna. VRFY e EXPN, embora padronizados, são desativados na prática. Para diagnóstico de problemas de e-mail, dominar o fluxo EHLO → STARTTLS → AUTH → MAIL → RCPT → DATA → QUIT via openssl s_client é uma habilidade indispensável para administradores de sistemas.