O correio eletrónico já existia, de uma forma ou de outra, desde a década de 1960. As pessoas deixavam mensagens umas às outras utilizando uma série de métodos diferentes em computadores mainframe, mas só em agosto de 1982, quando o Information Sciences Institute publicou o Simple Mail Transfer Protocol (SMTP; RFC 821), é que foi proposto um método normalizado para enviar e receber correio eletrónico.
O SMTP rapidamente ganhou popularidade na ARPANET, substituindo métodos mais antigos e complexos utilizados para transferir correio eletrónico de um mainframe para outro, e foi suportado pela primeira vez no final de 1982 pelo Sendmail, um dos primeiros Agentes de Transferência de Correio, no BSD 4.1c.
Desde então, o protocolo tem sido revisto e alargado com bastante regularidade, mas o método fundamental para o envio de correio eletrónico permaneceu, em grande parte, inalterado.
O protocolo é um protocolo baseado em texto, que inicialmente não suportava a transmissão de dados binários. No entanto, o facto de ser baseado em texto tornou o protocolo fácil de implementar e manter. O MIME (Multipurpose Internet Mail Extensions) tornou-se popular no final dos anos 80 para codificar e enviar dados binários através do SMTP. Atualmente, o SMTP é o protocolo dominante para o envio e receção de e-mail na Internet, sendo o conhecimento aprofundado deste protocolo essencial para qualquer administrador de rede.
Como o SMTP é baseado em texto, aprender o protocolo é significativamente mais fácil do que muitos outros, e basta um programa capaz de enviar dados ASCII através da porta 25 do TCP/IP, como o Telnet, para comunicar diretamente com um servidor SMTP.
O correio eletrónico é enviado via SMTP numa transação; ou seja, se o envio da mensagem não for concluído na íntegra e sem gerar um erro, a mensagem é descartada. A RFC 821 descreve uma transação como tendo três fases: especificar um remetente, indicar um ou mais destinatários e, por fim, enviar a própria mensagem. No entanto, é mais fácil conceber uma transação SMTP como tendo 5 fases:
- Aperto de mão
- Enviar endereço de resposta
- Enviar aos destinatários
- Enviar dados da mensagem
- Concluir transação
Aperto de mão
Ao estabelecer ligação a um servidor SMTP na porta 25, o remetente de uma mensagem deve aguardar que o destinatário aceite a ligação e se identifique no seguinte formato:
220 [domínio] [Informações sobre o serviço]
Exemplo: 220 example.com Serviço disponível
O remetente deve, em seguida, identificar-se junto do destinatário utilizando o comando HELO.
HELO [domínio]
Exemplo: HELO example.com
Os servidores de correio eletrónico esperam que cada um se identifique utilizando um nome de domínio que possa ser utilizado para verificar a identidade do servidor através de uma pesquisa do registo MX; no entanto, o servidor recetor não deve rejeitar a ligação nesta fase, mesmo que a identidade do remetente não possa ser verificada, devendo, por isso, responder com:
250 [Mensagem]
Exemplo: 250 example.com Olá, bob@example.com
O código de resposta 250 é a resposta genérica ‘OK’ enviada por um servidor SMTP para indicar que a última ação foi concluída com sucesso.
Endereço para resposta:
Assim que os dois servidores tiverem concluído o processo de estabelecimento de ligação, a transação SMTP terá início e poderemos começar a enviar comandos ao servidor. Se pretender ver os comandos suportados pelo servidor, envie o comando HELP e o servidor SMTP deverá responder com uma mensagem a indicar quais os comandos suportados.
No entanto, para enviarmos uma mensagem a um utilizador neste servidor, temos primeiro de definir um endereço de resposta. O endereço de resposta deve ser indicado primeiro para que, caso ocorram erros durante a transação SMTP, estes possam ser comunicados a esse endereço. Para tal, utilizamos o comando ‘MAIL FROM:’:
E-MAIL DE:
Exemplo: MAIL FROM:
Repare nos caracteres «Menor que» e «Maior que». A norma RFC 821 exige que estes caracteres façam parte do próprio endereço de e-mail. Se o endereço for aceite, o SMTP devolverá uma resposta 250 OK.
Enviar aos destinatários
Depois de definir um endereço de resposta, o SMTP permite-nos identificar os destinatários da mensagem. Para tal, utilizamos o comando ‘RCPT TO:’:
RCPT PARA:
Exemplo: RCPT PARA:
Para definir vários destinatários, basta repetir este comando para cada destinatário. Caso o destinatário aceite correio para este utilizador e possa aceitar a mensagem neste momento, deverá responder com um 250 OK. No entanto, se o correio não for aceite para este utilizador, será enviada uma resposta de falha 550 ou o código de erro apropriado. Caso recebamos uma resposta 250 OK, podemos prosseguir com o envio dos dados da mensagem.
Enviar dados da mensagem
O envio de dados via SMTP é bastante simples; no entanto, os formatos das mensagens podem ser bastante complexos, especialmente quando se enviam anexos binários. Para começar a enviar dados, devemos emitir o comando ‘DATA’, ao qual o servidor deve responder com a resposta intermédia 354. Ou seja:
354 Introduza a mensagem, terminando com “.” numa linha separada
A mensagem mais simples que podemos enviar é uma mensagem de texto simples, que não requer a utilização do formato de mensagem MIME multiparte. Todas as mensagens, sejam elas de texto simples ou não, terminam com o envio de uma linha que contém apenas um ponto. Além disso, antes de enviar uma mensagem, pode incluir algumas informações de cabeçalho, tais como Data, Assunto, Para, Cc e De.
Exemplo:
DADOS
354 Introduza a mensagem, terminando com “.” numa linha separada
Assunto: Esta é a linha de assunto da mensagem de texto do plano
E este é o corpo da mensagem em texto simples.
Se for aceite, o servidor SMTP devolverá uma resposta 250 OK ou um código de erro, caso a transação tenha falhado ou tenha ficado incompleta. Repare no ponto final no final da linha do corpo da mensagem; só quando for encontrado um ponto final sozinho numa linha é que o servidor deixará de aguardar dados. Caso o servidor remetente esteja a enviar uma mensagem que possa provocar o encerramento prematuro da sessão de dados — uma vez que a mensagem contém um único ponto numa linha —, deve adicionar um ponto adicional à linha.
Concluir a transação
Até este momento, tudo o que foi enviado para o servidor SMTP de destino é considerado descartável. Se o comando ‘QUIT’ não for enviado antes do encerramento da ligação, o servidor de destino limitar-se-á a eliminar quaisquer dados de mensagens que tenham sido armazenados. Originalmente utilizado como uma forma elegante de encerrar uma ligação, é hoje comummente utilizado para indicar que uma transação foi concluída, sendo que muitos servidores de correio aguardam o comando QUIT antes de colocarem o correio na fila para que o Agente de Transferência de Mensagens o encaminhe. Depois de enviar o comando «QUIT», o servidor de destino deve enviar uma resposta 221 para confirmar que a transação foi concluída e que a ligação está a ser encerrada.
Se estiver a aprender o protocolo SMTP, recomenda-se que leia as RFC 821, 2476 e 2554. Deve ter em conta, especialmente ao ler a RFC 821, que, desde 1982, os servidores de e-mail sofreram alterações significativas, em parte como resposta aos abusos cometidos pelos spammers.
