Infra - Redes

Protocolo SMTP (ou "Como enviar e-mails usando o Telnet")

Este artigo tem como objetivo descrever o funcionamento básico do Protocolo SMTP (Simple Mail Transfer Protocol - Protocolo Simples para Transferência de Correio), usado para envio de e-mails.

por Davi Medrade



Este artigo tem como objetivo descrever o funcionamento básico do Protocolo SMTP (Simple Mail Transfer Protocol - Protocolo Simples para Transferência de Correio), usado para envio de e-mails. Mais informações podem ser obtidas através de RFCs tais como a RFC 821 (Simple Mail Transfer Protocol).

Neste artigo, mensagens precedidas de << são mensagens enviadas pelo servidor e >> indica comandos enviados ao servidor.

Um Servidor SMTP é um computador que fica aguardando conexões SMTP de modo a proceder com o envio de e-mails. Por padrão, conexões SMTP são feitas na porta 25 TCP.

O Protocolo SMTP é baseado em comandos (enviados pelo cliente) e respostas (enviadas pelo servidor). Todos os comandos SMTP geram uma resposta, e é considerada uma violação do protocolo SMTP o envio de um comando antes que o servidor dê a resposta do comando anterior. Tanto comandos quanto respostas são terminados pelo caractere Carriage Return (ASCII 13, vbCr ou \n), exceto se o servidor for Windows, sendo que nesse caso a terminação é por New Line/Carriage Return (ASCIIs 13,10, vbCrLf ou \n\r), ou se o servidor for Macintosh, no qual a terminação é apenas New Line (ASCII 10, vbLf ou \r). Normalmente, todos os servidores aceitam comandos terminados apenas por Carriage Return (vbCr, \n), mas a resposta costuma vir terminada pelos marcadores acima, portanto, se você for criar um programa de envio de e-mails, esteja preparado para todos eles.

Todas as respostas do servidor possuem duas partes: o código de retorno e a mensagem "human readable" (legível por humanos) sendo que o código é usado para identificar o tipo de mensagem por programas. Códigos começados com 2 indicam sucesso, 3 indicam sucesso, mas deve-se enviar mais dados para finalizar a operação, e 4 ou 5 são erros. Nos servidores, os códigos de retorno são sempre iguais para situações semelhantes, mas a mensagem "human readable" pode ser diferente, mas normalmente o significado do texto é o mesmo, por exemplo: um mesmo erro poderia gerar as mensagens: "Relay no permitted", "Relaying denied", "IP lookup failed - relay not allowed". As mensagens são diferentes, mas na prática o significado é o mesmo.

Para testar o que é feito abaixo, use o comando "telnet": no Windows, vá em Iniciar, Executar, e digite "telnet servidor.com 25" onde "servidor.com" é o servidor SMTP ao qual você deseja se conectar (tente usar o do seu provedor de internet). No Linux, vá a um console e execute "telnet servidor.com 25", sendo "servidor.com" o servidor de e-mails ao qual você deseja se conectar (normalmente, no Linux, é "localhost" uma vez que quase todas as máquinas Linux têm um servidor SMTP rodando).

No caso dos exemplos, foi usado um computador com o antivirus AVG instalado. Esse antivirus usa um proxy SMTP para certificar-se que não estão sendo enviados ou recebidos e-mails com vírus, portanto as mensagens retornadas pelo servidor nos exemplos na verdade são as retornadas pelo AVG, mas não diferem em nada das que uma conexão direta ao servidor retornaria.

Quando é feita a conexão SMTP, o servidor envia uma identificação:

<< 220 AVG ESMTP Proxy Server 7.0.300/7.0.300 [265.8.8]

Após essa identificação, o cliente deve se identificar enviando um comando HELO:

>> HELO agnetron.com.br
<< 250 localhost Hello agnetron.com.br

Para iniciar uma sessão de e-mail, o cliente envia um comando MAIL informando o remetente:

>> MAIL FROM: usuario@dominio.com.br
<< 250 Sender ok

Em seguida, é identificado o destinatário usando o comando RCPT:

>> RCPT TO: usuario2@dominio.com.br
<< 250 Recipient ok

Logo após, deve-se enviar o conteúdo da mensagem por meio do comando DATA:

>> DATA
<< 354 Ok, send the message
>> Subject: Teste
>>
>> Mensagem Teste
>> .
<< 254 Ok: queued as 13E4A7B

Note que o código de retorno do comando DATA começa com 3, indicando que está tudo OK, mas precisa-se enviar mais dados para completar a operação.

Note também que é usada uma linha contendo somente um ponto para informar o final da mensagem.

Se uma linha contendo somente um ponto fizer parte do corpo da mensagem, deve-se colocar dois pontos, como no exemplo:

>> DATA
<< 354 Ok, send the message
>> Subject: Teste 2
>>
>> Mensagem Teste Parte 1
>> ..
>> Mensagem Teste Parte 2
>> .
<< 250 Ok: queued as 1413196
No exemplo acima, a mensagem ao ser lida num cliente de e-mail apresentaria apenas um ponto entre a parte 1 e a parte 2 da mensagem, ficando dessa forma:
Mensagem Teste Parte 1
.
Mensagem Teste Parte 2

Portanto, ao criar um programa que envie e-mails, lembre-se de sempre verificar linhas contendo somente um ponto, para colocar dois no lugar, do contrário o servidor SMTP interpretará aquele ponto como marcador de fim de mensagem.

Após o envio da mensagem, deve-se recomeçar a sessão (enviando-se um novo comando RCPT) ou finalizá-la (através do comando QUIT, como no exemplo:

>> QUIT
<< 221 Asta la vista
(servidor fecha a conexão)

Para verificar se o servidor retornou um erro ao enviar o e-mail, basta verificar se o primeiro caractere do código de retorno é 4 ou 5.

Um erro muito comum é o servidor não aceitar mandar e-mails para destinatários em outro servidor (por exemplo, o servidor "agnetron.com.br" só envia e-mails para destinatários que terminem com "@agnetron.com.br"). Essa prática é usada para evitar que pessoas mal-intencionadas usem o servidor para mandar Spam. Normalmente, servidores de provedores usam conexões SMTP autenticadas para permitir que usuários cadastrados mandem e-mail para qualquer lugar. Nesse caso, é fornecido um nome de usuário e senha após a conexão ser estabelecida (provavelmente isso será abordado em futuros artigos) para determinar se o usuário tem autorização para mandar e-mails usando aquele servidor. Se isso acontecer com o servidor que você estiver usando, normalmente ele retornará com uma mensagem parecida com "Relay not permitted", sendo que "relay" é justamente a ação de mandar e-mails para outros servidores.

Headers (Cabeçalhos)

Cabeçalhos são as primeiras linhas de uma mensagem, e são usados para passar dados como a data de envio da mensagem, o assunto, o nome do destinatário, destinatários com cópia, etc.

Os cabeçalhos devem ser as primeiras linhas da mensagem, e são separados desta por uma linha em branco.

Vamos ver os cabeçalhos mais usados:

Subject - é usado para determinar o assunto da mensagem, como no exemplo:

>> Subject: Formulário para preenchimento

From - indica o remetente da mensagem:

>> From: "Davi Medrade" <davimedrade@dominio.com.br>

To - indica o destinatário da mensagem (para evitar problemas, o e-mail deve ser o mesmo passado ao comando RCPT):

>> To: "Linha de Código" <colaborador@linhadecodigo.com.br>

Cc - indica outras pessoas para a qual a mensagem deve ser enviada. É uma abreviação de "Carbon Copy" (cópia carbono):

>> Cc: "Davi 1" <davi1@teste.com>
>> Cc: "Davi 2" <davi2@teste.com>

Bcc - indica pessoas que devem receber uma cópia da mensagem sem que os outros destinatários saibam. É uma abreviação de "Blind Carbon Copy" (cópia carbono oculta):

>> Bcc: "Davi 3" <davi3@teste.com>

Content-Type - indica o "MIME type" do conteúdo da mensagem, podendo ser "text/plain" (padrão - texto puro), "text/html" (HTML), entre outros. Aceita como parâmetro o "charset" (conjunto de caracteres) que será usado na leitura da mensagem (o parâmetro não é obrigatório):

>> Content-Type: text/html; charset=iso-8859-1
ou
>> Content-Type: text/html

Isto basta para enviar e-mails simples.

Segue um exemplo de uma sessão completa de envio de e-mail:

<< 220 AVG ESMTP Proxy Server 7.0.300/7.0.300 [265.8.8]
>> HELO davi
<< 250 localhost Hello davi
>> MAIL FROM: davi@teste.com
<< 250 Sender ok
>> RCPT TO: davi@teste.com
<< 250 Recipient ok
>> DATA
<< 354 Ok, send the message
>> Subject: Teste de Mensagem
>> Content-Type: text/html; charset=iso-8859-1
>> From: "Davi Medrade" <davi@lightcomm.com.br>
>> To: "Davi Medrade" <davi@lightcomm.com.br>
>> 
>> Teste de Mensagem <b>em HTML</b>!!!
>> <br><br>
>> <hr>
>> <i>SMTP</i> - Simple Mail Transfer Protocol
>> <br>
>> ..
>> <br>
>> .
>> 250 Ok: queued as 1773F0C

Possivelmente haverá futuros artigos referindo-se a conexões autenticadas e envio de anexos.

Se você precisar obter informações sobre envio de anexos, faça uma busca na Internet pelo MIME Type "multipart/mixed" (pelo menos até que eu escreva o artigo relacionado :) ).

Davi Medrade

Davi Medrade

Davi Medrade - Programador VB, C++ e PHP