El Protocolo SMTP, manual de uso y disfrute

Ya comenté al hablar del protocolo POP, que, cuando escribía en es.comp.hackers publiqué un par de artículos sobre protocolos de Interet.

Pues este es el segundo, sobre el protocolo SMTP, que es el que se usa para enviar el correo electrónico. Como con el anterior, os ruego que disculpeis los chistes, la tortura al lenguaje, etc. pero en su contexto original no parecía mala idea.

Grupo/s: es.comp.hackers
Fecha: 11/07/2000
Título Original: Re: informacion sobre telnet 2 (SMTP)
Ver post original
Bueno, visto que ya sabemos como recoger el correo, ahora vamos a ver 
como se envía:

El puerto para enviar correo es el 25. Como siempre, puede ser en otro 
puerto, pero yo no he visto jamás el SMTP (Simple Mail Transfer Protocol) 
en ninguno que no sea el 25.

De modo que nos enchufamos al puerto 25 del host que queramos (Si, al 
contrario de lo que vimos en POP3, puede ser casi cualquier host, solo 
tienes que probar con varios y ver si te aceptan.) En adelante, los 
mensajes que vayan precedidos de un número de tres dígitos son las 
respuestas del servidor, las expresiones entre "{" y "}" son variable que 
explicaré en cada caso, y mis comentarios irán detrás de //.

El numero de tres dígitos es el llamado "status-code", y nos indica el 
estado del servidor en un momento dado:

El primer dígito nos da el nivel de error (mientras sea 2, no hay 
problema):

2xx Todo va bien, sigue así.

4xx Fallo temporal, a lo mejor la próxima vez que lo intentes funciona.

5xx Fallo permanente, has hecho algo mal o no tienes permiso para hacer 
eso.

El segundo y tercer dígitos nos concretan los detalles:

x1x Relativo a la dirección de correo:

       X10     Pasa algo con la dirección, pero no sabemos qué
       X11     La dirección de destino está mal (el mailbox)
       X12     La dirección de destino está mal (el host)
       X13     La dirección de destino está mal escrita
       X14     La dirección de destino es ambigua
       X15     La dirección de destino es válida
       X16     El mailbox ha cambiado
       X17     La dirección de origen está mal escrita
       X18     La dirección de origen está mal (el host)

x2x Relativo al mailbox (buzón):

       X20     Pasa algo con el mailbox, pero no sabemos qué
       X21     Mailbox desactivado, no se aceptan mensajes
       X22     Mailbox lleno
       X23     Mensaje demasiado largo
       X24     Error al expandir la lista de correo

x3x Relativo al host:

       X30     Pasa algo con el host, pero no sabemos qué
       X31     Host lleno ¡!, no se aceptan mensajes
       X32     El host no acepta mensajes de la red
       X33     El host no acepta esa característica
       X34     Mensaje demasiado largo para el host

x4x Relativo a la red:

       X40     Pasa algo con el la red o el enrutado, pero no sabemos qué
       X41     Sin respuesta del host
       X42     Error de conexión
       X43     error de enrutado
       X44     No se puede enrutar
       X45     Congestión de red
       X46     detectado loop de Routing
       X47     Tiempo de envío expirado

x5x Relativo al protocolo:

       X50     Pasa algo con el protocolo, pero no sabemos qué
       X51     Comando inválido
       X52     Error de sintaxis
       X53     Demasiados receptores
       X54     Argumento/s inválido/s
       X55     Versión de protocolo equivocada

x6x Relativo al contenido o formato del mensaje:

       X60     Pasa algo con el media (formato, más o menos), pero no 
sabemos qué
       X61     Media no soportado
       X62     Conversión requerida y prohibida
       X63     Conversión requerida pero no soportada
       X64     Conversión con errores
       X65     Conversión fallida

x7x Relativo a la seguridad:

       X70     Error de seguridad indefinido
       X71     Envío rechazado, mensaje rehusado
       X72     Expansión de lista de correo prohibida
       X73     Conversión de seguridad necesaria pero imposible
       X74     Característica de seguridad no disponible o soportada
       X75     Error criptográfico
       X76     Algoritmo criptográfico no soportado
       X77     Fallo de integridad del mensaje



Cuando te conectes al host (supongamos que se llama mail.correo.com) te 
dirá algo así como:

220 mail.correo.com ESMTP

// También es usual que te de algunos datos más, como la versión de 
software que usa, la fecha, etc. Si, directamente, no te deja conectar, 
es que está filtrando las IPs. Déjalo y busca otro.

//Ahora, lo primero es presentarse (hay que ser educados) diciendo desde 
qué host nos conectamos:

HELO {host}

// Donde "host" es tu dominio o el nombre de tu máquina. Puedes intentar 
engañarle, que muy probablemente te acepte igual, para lo que te va a 
servir...

// el servidor te responderá algo del estilo de:

250 mail.correo.com

// Si, además, te dice algo como ESMTP, es que soporta SMTP Extendido, y 
también admitirá caracteres de 8 bits (solo en el cuerpo de los mensajes, 
no en las cabeceras). Otra opción es presentarse usando el comando:

EHLO {host}

// que es casi igual que el HELO, pero te presenta algunas opciones 
avanzadas de las que dispone el servidor:

250-mail.correo.com
250-PIPELINING
250 8BITMIME
250 HELP

// variarán de servidor en servidor, y la mayoría no nos interesan ahora.

// A lo mejor te dice que el host no es válido, puedes intentarlo con 
varios distintos. Normalmente, hoy día, no podrás hacer nada si no haces 
un HELO o EHLO antes, pero si encuentras una máquina que no lo requiera, 
es más que probable que puedas hacer cosas interesantes con ella, como 
mandar correo anónimo...

//El siguiente paso es decirle de parte de quién viene el correo:

MAIL FROM: {yo@host.com}

// donde yo@host.com es la dirección desde la que se envía el mensaje, y 
a la que, por defecto, se mandará cualquier mensaje de "nondeliberable 
mail" y similares. Puedes inventarte la dirección, o incluso no poner 
ninguna poniendo:

MAIL FROM: <>

// El servidor, si te acepta, te responderá algo como:

250 Sender <{yo@host.com}> Ok

// Ahora le indicamos a quién va dirigido el mensaje:

RCPT TO: {receptor@site.com}

// Donde "receptor@site.com" es la dirección a quien va dirigido el 
mensaje. Puedes usar este comando varias veces, y se enviarán copias del 
mensaje a cada uno de los receptores. El servidor debería responder:

250 Recipient <receptor@site.com> Ok

// NOTA: Algunos servidores exigen que la direcciones de remitente y 
receptor se den entre los signos "<" y ">".

// Una vez que nos han aceptado el receptor, vamos a escribir el mensaje. 
Para ello escribimos simplemente:

DATA

// a lo que el servidor nos responde:

354 Ok Send data ending with <CRLF>.<CRLF>

// Lo que significa que, tras terminar de escribir el mensaje, debemos 
poner un punto en una sola línea para que sepa que hemos acabado. Algo 
así como:

hola

Esto es un mensaje escrito con el telnet.

que cosas.
.

// Mucho ojo, hasta que no escribes el punto solitario, todo lo que 
escribas irá en el mensaje.

// El servidor, una vez acabes, te responderá:

250 Message received: {número raro}

// donde "número raro" es el código de identificación del mensaje. Con 
esto ya has enviado tu primer e-milio manual.

// Algunos comando más que puedes usar son:

NOOP

// Que no hace nada. Sirve para mantener la conexión (hay servidores que 
se desconectan tras algún tiempo de inactividad) y para verificar que 
sigues conectado.

VRFY {dirección}

// Donde "dirección es la dirección de correo que quieres testear. Sirve 
para ver si existe esa dirección de e-milio. Usualmente solo servirá para 
direcciones en el propio servidor ,y debería responderte algo como:

250 <receptor@site.com> Ok

// si es que existe. Si no existe te dirá:

550 Unknown address: <receptor@site.com>

// Como ves. este puede ser un comando muy útil. Además, es posible que 
te de el nombre del usuario...

// Y si no te lo da, quizás este comando si:

EXPN {receptor@site.com}

// En principio, esto sirve para expandir una lista de correo, pero tanto 
si se trata de un usuario como de una lista de correo, este comando puede 
devolverte algunos datos interesantes:

250 receptor@site.com (Fulano García García)

// No es muy usual, pero yo lo he visto en varios sitios.

// Otros comandos pueden ser:

SEND FROM: {yo@host.com}

// que funciona igual que "MAIL FROM:" pero, en lugar de enviar el 
mensaje al mailbox, lo envía al terminal del usuario, siempre y cuando 
este esté en una sesión en el host en ese momento y tenga habilitada la 
recepción de mensajes.

SOML FROM: {yo@host.com}

// Hace lo mismo que el anterior pero, si el usuario no está disponible o 
no acepta mensajes, entonces el mensaje se envía a su mailbox.

SAML FROM: {yo@host.com}

// Casi igual que el anterior, solo que este envía el mensaje al terminal 
del usuario (si está disponible) Y TAMBIEN al mailbox.

// Si, en un momento dado, te arrepientes de lo que estabas haciendo y 
quieres empezar otra vez (por ejemplo, estás a medio escribir un mensaje 
a tu jefe con tu curriculum y piensas que "cocainómano" no es una buena 
palabra) tienes este comando:

RSET

// que elimina toda la información relativa al mailbox (remitente, 
receptor, texto...)

// Y siempre tienes a nuestro viejo amigo y aliado (bueno, no siempre):

HELP

// que no creo que haya que explicar.

// Otros comandos menos usados (y muy poco soportados) son:

TURN

// que, si es aceptado, le da la vuelta a la situación, transformando al 
servidor en cliente y al cliente en servidor (más exactamente, lo que 
hace es decirle al servidor: "si quieres decir algo, estoy a la 
escucha").

AUTH

// que sirve para autentificarse, usando el mismo protocolo MB5 que ya 
comenté anteriormente.

Y estos son los comandos de SMTP. Para una información más detallada 
puedes consultar el RFC 821 para el SMTP y el RFC 1893 para los códigos 
de status.

Quizás habría que comentar algo de lo que se puede hacer con las 
cabeceras de los e-milios, pero esto se está haciendo un poco largo. Si a 
alguien le interesa que lo diga y lo pongo en otro post.

Regresar