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.
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.