El correo electrónico existe de una forma u otra desde los años sesenta. La gente se dejaba mensajes utilizando distintos métodos en ordenadores centrales, pero no fue hasta agosto de 1982, cuando el Instituto de Ciencias de la Información publicó el Protocolo Simple de Transferencia de Correo (SMTP; RFC 821), que se propuso un método estandarizado para enviar y recibir correo electrónico.
El protocolo SMTP no tardó en popularizarse en ARPANET, sustituyendo a los métodos más antiguos y complicados que se utilizaban para transferir correo de un ordenador central a otro, y fue compatible por primera vez a finales de 1982 con Sendmail, uno de los primeros agentes de transferencia de correo, en BSD 4.1c.
Desde entonces, el protocolo se ha revisado y ampliado con bastante regularidad, pero el método básico para enviar correo electrónico se ha mantenido prácticamente sin cambios.
El protocolo es un protocolo basado en texto que, en un principio, no admitía el envío de datos binarios. Sin embargo, al estar basado en texto, resultaba fácil de implementar y mantener. El protocolo MIME (Multipurpose Internet Mail Extensions) se popularizó a finales de los años 80 para codificar y enviar datos binarios a través de SMTP. Hoy en día, el SMTP es el protocolo dominante para enviar y recibir correo electrónico en Internet, y conocer a fondo este protocolo es esencial para cualquier administrador de redes.
Dado que el SMTP se basa en texto, aprender el protocolo resulta mucho más sencillo que en muchos otros casos, y lo único que se necesita para comunicarse directamente con un servidor SMTP es un programa capaz de enviar datos ASCII a través del puerto 25 de TCP/IP, como Telnet.
El correo se envía a través de SMTP en una transacción; es decir, si el envío del mensaje no se completa en su totalidad y sin generar ningún error, el mensaje se descarta. La RFC 821 describe una transacción como un proceso que consta de tres etapas: especificar un remitente, indicar uno o varios destinatarios y, a continuación, enviar el mensaje propiamente dicho. Sin embargo, resulta más sencillo concebir una transacción SMTP como un proceso de cinco etapas:
- Apretón de manos
- Enviar dirección de respuesta
- Enviar a los destinatarios
- Enviar datos del mensaje
- Finalizar transacción
Apretón de manos
Al conectarse a un servidor SMTP en el puerto 25, el remitente de un mensaje debe esperar a que el destinatario acepte la conexión y se identifique con el siguiente formato:
220 [dominio] [Información del servicio]
Ejemplo: 220 example.com. Servicio disponible
A continuación, el remitente debe identificarse ante el destinatario mediante el comando HELO.
HELO [dominio]
Ejemplo: HELO example.com
Los servidores de correo esperarán que cada uno de ellos se identifique mediante un nombre de dominio que podría utilizarse para verificar la identidad del servidor mediante una consulta del registro MX; sin embargo, el servidor receptor no debe rechazar la conexión en esta fase, incluso si no es posible verificar la identidad del remitente, por lo que debe responder con:
250 [Mensaje]
Ejemplo: 250 example.com Hola, Bob, en example.com
El código de respuesta 250 es la respuesta genérica ‘OK’ que envía un servidor SMTP para indicar que la última acción se ha completado correctamente.
Dirección para enviar la respuesta:
Una vez que los dos servidores hayan completado el proceso de establecimiento de conexión, la transacción SMTP habrá comenzado y podremos empezar a enviar comandos al servidor. Si deseas conocer los comandos que admite el servidor, envía el comando HELP y el servidor SMTP debería responder con un mensaje en el que se detallen dichos comandos.
Sin embargo, para poder enviar un mensaje a un usuario en este servidor, primero debemos configurar una dirección de respuesta. Es necesario indicar primero la dirección de respuesta para que, si se produce algún error durante la transacción SMTP, este se pueda notificar a dicha dirección. Para ello, utilizamos el comando ‘MAIL FROM:’:
CORREO DE:
Ejemplo: REMITENTE:
Fíjate en los caracteres «menor que» y «mayor que». Según la norma RFC 821, estos son obligatorios para que la dirección de correo electrónico sea válida. Si la dirección es válida, el SMTP devolverá una respuesta 250 OK.
Enviar a los destinatarios
Una vez configurada la dirección de respuesta, el SMTP nos permitirá identificar a los destinatarios del mensaje. Para ello, utilizamos el comando ‘RCPT TO:’:
RCPT A:
Ejemplo: DESTINATARIO:
Para establecer varios destinatarios, basta con repetir este comando para cada uno de ellos. Si el destinatario acepta correo para este usuario y puede recibir el mensaje en este momento, debería responder con un «250 OK». Sin embargo, si no se acepta el correo para este usuario, se enviará una respuesta de error 550 o el código de error correspondiente. Si recibimos una respuesta 250 OK, podemos continuar con el envío de los datos del mensaje.
Enviar datos del mensaje
Enviar datos a través de SMTP es bastante sencillo; sin embargo, los formatos de los mensajes pueden resultar bastante complicados, sobre todo cuando se envían archivos adjuntos binarios. Para empezar a enviar datos, debemos introducir el comando ‘DATA’, al que el servidor debe responder con el código 354 (respuesta intermedia). Es decir:
354 Escribe el mensaje, terminando con “.” en una línea aparte
El mensaje más sencillo que podemos enviar es un mensaje de texto sin formato, que no requiere el uso del formato de mensaje MIME multiparte. Todos los mensajes, ya sean de texto sin formato o de otro tipo, finalizan con el envío de una línea que contiene únicamente un punto. Además, antes de enviar un mensaje, puedes incluir cierta información en el encabezado, como la fecha, el asunto, el destinatario, la copia y el remitente.
Ejemplo:
DATOS
354 Escribe el mensaje, terminando con “.” en una línea aparte
Asunto: Este es el asunto del mensaje de texto del plan
Y este es el cuerpo del mensaje de texto sin formato.
Si se acepta, el servidor SMTP devolverá una respuesta «250 OK» o un código de error si la transacción ha fallado o estaba incompleta. Fíjate en el carácter de punto al final de la línea del cuerpo del mensaje: el servidor solo dejará de esperar datos cuando encuentre un carácter de punto solo en una línea. Si el servidor remitente va a enviar un mensaje que provocaría el cierre prematuro de la sesión de datos —por ejemplo, porque el mensaje contiene un único punto en una línea—, deberá añadir un punto adicional a dicha línea.
Finalización de la transacción
Hasta este momento, todo lo que se ha enviado al servidor SMTP receptor se considera desechable. Si no se envía el comando ‘QUIT’ antes de que se cierre la conexión, el servidor de destino simplemente eliminará cualquier dato de los mensajes que se haya almacenado. Aunque en un principio se utilizaba como una forma elegante de cerrar una conexión, hoy en día se emplea habitualmente para indicar que una transacción ha finalizado, ya que muchos servidores de correo esperan el comando QUIT antes de poner el correo en cola para que el agente de transferencia de mensajes lo enrute. Una vez enviado el comando QUIT, el servidor de destino debería enviar una respuesta 221 para confirmar que la transacción ha finalizado y que la conexión se está cerrando.
Si estás aprendiendo el protocolo SMTP, te recomendamos que leas los RFC 821, 2476 y 2554. Debes tener en cuenta, sobre todo al leer el RFC 821, que desde 1982 los servidores de correo electrónico han cambiado considerablemente, en parte como respuesta al abuso por parte de los spammers.
