No post do blog SMTP vs. IMAP vs. POP3, explicamos que uma sessão SMTP é uma espécie de conversa entre um cliente SMTP e um servidor SMTP. O cliente se comunica usando comandos que consistem em caracteres alfabéticos. O servidor responde com códigos numéricos. Hoje, vamos abordar isso em detalhes. Você conhecerá os comandos SMTP válidos e os obsoletos. Além disso, esclareceremos quais códigos de resposta correspondem a cada comando.
Comandos SMTP essenciais na ordem em que podem ser usados
Cada comando SMTP define uma função particular dentro da sessão SMTP, que consiste em três etapas:
- handshake – estabelecimento de uma conexão TCP
- email transfer – manipulações com o email
- termination – encerramento de uma conexão TCP
Portanto, decidimos listar os comandos SMTP de acordo com esse fluxo.
HELO/EHLO
O comando HELO
inicia a conversa da sessão SMTP. O cliente cumprimenta o servidor e se apresenta. Como regra, HELO
é atribuído a um argumento que especifica o nome do domínio ou endereço IP do cliente SMTP.
Exemplo: HELO client.net
EHLO
é uma alternativa para HELO
para servidores que suportam as extensões do serviço SMTP (ESMTP). Se o servidor não suportar ESMTP, ele responderá com um erro.
Exemplo: EHLO client.net
Em qualquer caso, HELO
ou EHLO
é um comando OBRIGATÓRIO para o cliente SMTP iniciar uma transferência de email (ou email transfer).
MAIL FROM
O comando MAIL FROM
inicia uma transferência de email. Como argumento, MAIL FROM
inclui uma caixa de correio do remetente (reverse-path). Para alguns tipos de mensagens de relatório, como notificações de não entrega, o reverse-path pode estar vazio. Parâmetros opcionais também podem ser especificados.
Exemplo: MAIL FROM "teste@cliente.net"
RCPT TO
O comando RCPT TO
especifica o destinatário. Como argumento, RCPT TO
inclui uma caixa de correio de destino (forward-path). Em caso de vários destinatários, RCPT TO
será usado para especificar cada destinatário separadamente.
Exemplo: RCPT TO "usuario@destinatario.net"
DATA
Com o comando DATA
, o cliente pede permissão ao servidor para transferir os dados do email. O código de resposta 354
concede permissão, e o cliente inicia a entrega do conteúdo do email linha por linha. Isso inclui a data, cabeçalho do remetente, linha de assunto, cabeçalho para, anexos e texto do corpo.
Uma linha final contendo um ponto (“.`”) termina a transferência dos dados do email. O servidor responde à linha final.
Exemplo:DATA
354 (código de resposta do servidor)
Date: Qua, 30 Julho 2019 06:04:34
From: teste@cliente.net
Subject: Como SMTP funciona
To: usuario@destinatario.net
Body: texto
.
NOOP
O comando NOOP
é usado apenas para verificar se o servidor pode responder. Resposta “250 OK”
Exemplo: NOOP
HELP
Com o comando HELP
, o cliente solicita uma lista de comandos que o servidor suporta. HELP
pode ser usado com um argumento (um comando específico). Se o servidor suportar isso, ele fornecerá as informações de acordo com esta solicitação.
Exemplo: HELP
VRFY e EXPN
VRFY
é usado para verificar se uma caixa de correio no argumento existe no host local. A resposta do servidor inclui a caixa de correio do usuário e pode incluir o nome completo do usuário.
Exemplo:VRFY usuario2
250 Samantha Smith usuario2@cliente.net (resposta do servidor)
EXPN
é usado para verificar se uma lista de distribuição no argumento existe no host local. A resposta positiva especificará a associação dos destinatários.
Exemplo:EXPN mail-list
250-usuario1@cliente.net (resposta do servidor)
250-usuario2@cliente.net (resposta do servidor)
250-usuario3@cliente.net (resposta do servidor)
O hífen (-) entre o código numérico e a caixa de correio do usuário indica que a resposta continua na próxima linha.
VRFY
e EXPN
implementam a autenticação SMTP. Além disso, são úteis para realizar uma auditoria interna do servidor. Por outro lado, esses comandos são considerados um risco de segurança. Spammers podem usá-los para coletar endereços de email válidos do servidor. Portanto, os sistemas de mensagens instalam proteções correspondentes ou desativam os comandos.
RSET
O comando RSET
redefine a conexão SMTP para o estado inicial. Ele apaga todos os buffers e tabelas de estado (tanto do remetente quanto do destinatário). RSET
recebe apenas a resposta positiva do servidor – 250
. Ao mesmo tempo, a conexão SMTP permanece aberta e está pronta para uma nova transação de email.
Exemplo: RSET
QUIT
O comando QUIT
envia a solicitação para terminar a sessão SMTP. Uma vez que o servidor responde com 221
, o cliente fecha a conexão SMTP. Este comando especifica que o receptor DEVE enviar uma resposta “221 OK
” e, em seguida, fechar o canal de transmissão.
Exemplo: QUIT
Comandos SMTP alargados que alguns servidores SMTP podem suportar
STARTTLS
O comando STARTTLS
é usado para iniciar um handshake TLS para uma sessão SMTP segura. STARTTLS
redefine o protocolo SMTP para o estado inicial. Uma vez recebida a resposta 220
do servidor, o cliente SMTP deve enviar HELO
ou EHLO
para iniciar a sessão. Em caso de resposta negativa (454
), o cliente deve decidir se continua ou não a sessão SMTP.
Exemplo: STARTTLS
AUTH
O comando AUTH
é usado para autenticar o cliente no servidor. Para isso, ele usa um argumento que especifica diferentes níveis de segurança e métodos de login: PLAIN
, LOGIN
e CRAM-MD5
. A sessão é considerada autenticada uma vez que o servidor forneceu uma resposta positiva. Para mais informações sobre isso, leia o post do blog sobre autenticação SMTP.
Exemplo: AUTH CRAM-MD5
ATRN
O comando ATRN
substituiu o comando obsoleto TURN
. Ele era usado para reverter a conexão entre os servidores SMTP local e externo (remetente e destinatário). TURN
não tinha autenticação e, portanto, foi descontinuado. ATRN
está livre dessa desvantagem. Além disso, está disponível para endereços IP atribuídos dinamicamente.
Exemplo:
ATRN cliente.net,cliente.com
250 OK now reversing the connection
(resposta do servidor)
BDAT
O comando BDAT
é usado para enviar o conteúdo do email. Pode ser uma alternativa ao comando DATA
. BDAT
tem dois argumentos. O primeiro define o comprimento do bloco de dados em octetos. O segundo indica que o bloco de dados está terminando. Não é necessário um ponto para terminar a transferência de email como no comando DATA
. BDAT
é amplamente usado no Microsoft Exchange Server. Ao mesmo tempo, DATA
é um comando obrigatório para todos os servidores.
Exemplo:BDAT 67 LAST
To: usuario@destinatario.net
From: teste@cliente.net
Subject: Como SMTP funciona
250 Message OK, 67 octets received (resposta do servidor)
ETRN
O comando ETRN
é a solicitação para iniciar o processamento da fila SMTP de um host de servidor especificado.
Exemplo:ETRN cliente.com
250 OK, queuing for client.com started (resposta do servidor)
Comandos SMTP de uso privado
O cliente e o servidor podem usar comandos SMTP de uso privado por meio de um acordo bilateral. Estas são extensões de serviço proprietárias e devem começar com “X”. Eles não devem ser registrados ou padronizados. Aqui estão alguns deles:
XADR
– libera o status do canal que um endereço corresponde (como um endereço é roteado internamente)XCIR
– libera o status da instalação de verificação de circuitosXSTA
– libera o status do número de mensagens nas filas do canalXGEN
– libera o status de se uma configuração compilada e um conjunto de caracteres estão em uso
Comandos SMTP obsoletos
Na web, existem muitas fontes desatualizadas onde você pode encontrar comandos SMTP obsoletos. Para não perder tempo com opções inválidas, aqui está uma lista dos comandos que você não pode mais usar:
SEND
SOML
SAML
RELAY
TLS
TURN
Códigos de resposta SMTP
O servidor SMTP responde ao cliente usando um código de três dígitos. Cada dígito tem um significado especial:
- Primeiro (2 a 5) – indica se a solicitação é aceita, incompleta ou recusada
- Segundo (0 a 5) – indica o tipo de erro ocorrido (sintaxe, informação, conexões, sistema de correio ou não especificado (duas opções))
- Terceiro (0 a 5) – fornece uma descrição mais detalhada (junto com uma explicação textual)
O código numérico é seguido por um texto destinado ao usuário humano para entender o ponto. Diferentes servidores podem usar uma descrição textual modificada da resposta, enquanto o código numérico é permanente. Então, aqui está o que seu servidor SMTP pode responder:
Código | O que significa |
101 | Erro de conexão do servidor (nome do servidor ou porta de conexão incorretos) |
211 | Status do sistema (resposta ao HELP ) |
214 | Mensagem de ajuda (resposta ao HELP ) |
220 | O servidor está pronto (resposta à tentativa do cliente de estabelecer uma conexão TCP) |
221 | O servidor fecha o canal de transmissão |
235 | Autenticação bem-sucedida (resposta ao AUTH ) |
250 | O comando solicitado está completo. Como regra, o código é seguido de OK |
251 | O usuário não é local, mas o servidor encaminhará a mensagem para <forward-path> |
252 | O servidor não pode verificar o usuário (resposta ao VRFY). A mensagem será aceita e será feita uma nova tentativa de entrega |
334 | Resposta ao comando AUTH quando o mecanismo de segurança solicitado é aceito |
354 | O servidor confirma a transferência do conteúdo do email (resposta ao DATA ). Depois disso, o cliente começa a enviar o email. Termina com um ponto final (“. “) |
421 | O servidor não está disponível porque fecha o canal de transmissão |
422 | A caixa de correio do destinatário excedeu seu limite de armazenamento |
431 | Sobrecarga de arquivos (muitas mensagens enviadas para um determinado domínio) |
441 | Sem resposta do servidor do destinatário |
442 | Conexão interrompida |
446 | Ocorreu um loop interno |
450 | Caixa de correio indisponível (ocupada ou temporariamente bloqueada). Ação solicitada abortada |
451 | O servidor abortou o comando devido a um erro local |
452 | O servidor abortou o comando devido a armazenamento insuficiente no sistema |
454 | TLS não disponível devido a uma razão temporária (resposta ao STARTTLS ) |
455 | Parâmetros não podem ser acomodados |
471 | Erro do servidor de email devido ao filtro de spam local |
500 | Erro de sintaxe (também pode ser uma linha de comando demasiado longa). O servidor não consegue reconhecer o comando |
501 | Erro de sintaxe nos parâmetros ou argumentos |
502 | O servidor não implementou o comando |
503 | Sequência de comandos inadequada |
504 | O servidor não implementou um parâmetro de comando |
510 | Endereço de email inválido |
512 | Um erro de DNS (verifique novamente o endereço dos seus destinatários) |
523 | O tamanho total do seu email excede os limites do servidor do destinatário |
530 | Problema de autenticação que geralmente requer o comando STARTTLS para ser executado |
535 | Falha na autenticação |
538 | Criptografia necessária para um mecanismo de autenticação solicitado |
541 | Mensagem rejeitada pelo filtro de spam |
550 | Caixa de correio indisponível. O servidor abortou o comando porque a caixa de correio não foi encontrada ou por razões de política. Alternativamente: É necessária autenticação para o relay |
551 | Usuário não é local. O <forward-path> será especificado |
552 | O servidor abortou o comando porque a caixa de correio está cheia |
553 | Endereço de email sintaticamente incorreto |
554 | A transação falhou devido a um erro desconhecido ou ‘Nenhum serviço SMTP aqui’ como resposta às tentativas do cliente de estabelecer uma conexão |
555 | Parâmetros não reconhecidos/não implementados (resposta ao MAIL FROM ou RCPT TO ) |
Para saber mais sobre estes códigos de resposta, não deixe de ver o nosso vídeo dedicado:
Resposta a comandos
Como você pode ter notado acima, alguns códigos são específicos para comandos. Na verdade, apenas três deles, 500
, 501
e 421
, podem ser uma resposta para qualquer comando SMTP. Outros podem ser categorizados como positivos e negativos (o código 354
pode ser considerado uma resposta intermediária). Vamos ver a quais comandos eles podem se referir.
Comando | Resposta Positiva | Resposta Negativa |
Handshake SMTP (estabelecendo uma conexão) | 220 | 554 |
STARTTLS | 220 | 454 |
EHLO ou HELO | 250 | 502 (resposta ao EHLO para servidores antigos) 504 550 |
AUTH | 235 334 | 530 535 538 |
MAIL FROM | 250 | 451 452 455 503 550 552 553 555 |
RCPT TO | 250 251 | 450 451 452 455 503 550 551 552 553 555 |
DATA | 250 354 (resposta intermediária) | 450 451 452 503 550 (rejeição por razões de política) 552 554 |
RSET | 250 | – |
VRFY | 250 251 252 | 502 504 550 551 553 |
EXPN | 250 252 | 502 504 550 |
HELP | 211 214 | 502 504 |
NOOP | 250 | – |
QUIT | 221 | – |
Esta é a lista de códigos de resposta padrão. Deve ser mencionado também que alguns servidores SMTP podem gerar outros códigos de três dígitos. Nesse caso, o cliente SMTP terá que interpretar o primeiro dígito que deve estar na faixa de 2 a 5, inclusive. Ele indica a essência da resposta (bem-sucedida ou não).
Exemplo de uma sessão SMTP
Agora, vamos dar uma olhada em um exemplo de fluxo típico de uma sessão SMTP. Veremos dois cenários: uma transação bem-sucedida e uma abortada.
Transação bem-sucedida com verificação
Servidor: 220 server.net Simple Mail Transfer Service Ready
Cliente: EHLO cliente.org
S: 250-server.net greets clientr.org
S: 250-DSN
S: 250-VRFY
S: 250 HELP
C: VRFY Maverick
S: 250 John Maverick <j.maverick@server.net>
C: MAIL FROM:"usuario1@cliente.org"
S: 250 OK
C: RCPT TO:"j.maverick@server.net"
S: 250 OK
C: RCPT TO:"s.smith@server.net"
S: 550 No such user here
C: DATA
S: 354 Start mail input; end with <CRLF>.<CRLF>
C: Date: Qua, 30 Julho 2019 06:04:34
C: From: usuario1@cliente.org
C: Subject: Email de teste
C: To: j.maverick@server.net, s.smith@server.net
C: Oi John e Samantha
C: .
S: 250 OK
C: QUIT
S: 221 server.net Service closing transmission channel
Neste exemplo, o cliente recebeu o código 550
que indicou que um dos destinatários não está disponível. No entanto, a transação não foi abortada como no exemplo abaixo.
Transação abortada
Servidor: 220 server.net Simple Mail Transfer Service Ready
Cliente: EHLO cliente.org
S: 250-server.net greets cliente.org
S: 250-DSN
S: 250 HELP
C: MAIL FROM:"usuario1@cliente.org"
S: 250 OK
C: RCPT TO:"s.smith@server.net"
S: 550 No such user here
C: RSET
S: 250 OK
C: QUIT
S: 221 server.net Service closing transmission channel
Benefícios de usar um ambiente de teste SMTP seguro
Uma vez que um email tenha chegado ao servidor SMTP do remetente, ele ainda está no início de sua jornada. Antes de chegar à caixa de entrada do destinatário, o email precisa chegar ao servidor SMTP do destinatário, que o encaminha para o servidor IMAP/POP3. E cada servidor implementa a autenticação antes de permitir a entrada do email. Para garantir que seus emails atendam aos requisitos técnicos para um processo de autenticação rápido, é sempre uma boa ideia testá-los e depurá-los em um ambiente, seguro como o Email Sandbox do Mailtrap.
Usando o Email Sandbox, você pode analisar dados brutos, cabeçalhos e outras informações técnicas sobre seus emails. Além disso, ele ajuda a inspecionar e validar HTML/CSS e obter relatórios de spam rápidos que ajudam a entender o que precisa ser melhorado.
Para saber mais sobre o Email Sandbox, confira nosso Guia de Introdução.