8.3.- Comandos del protocolo SMTP


          El diálogo entre un cliente SMTP y un servidor SMTP se basa en un conjunto de comandos enviados por el cliente SMTP, que son palabras en formato texto ASCII legibles con facilidad y unos códigos de respuesta numéricos seguidos de un texto que explica dicho código, que son enviados por el servidor SMTP.




Códigos de respuesta

          Los códigos de respuesta están formados por tres dígitos, cada uno de los cuales tiene un significado.

          El primero de los dígitos de un código de respuesta, indica si el comando funcionó correctamente o si fallo. La siguiente tabla representa los significados del primer dígito de un código de respuesta:

Primer dígito Significado
1 Respuesta positiva preliminar. Se produjo una aceptación del comando, pero se están esperando que el cliente envíe comandos de confirmación.
2 Respuesta de finalización positiva. El comando finalizo correctamente.
3 Respuesta positiva intermedia. Se acepto el comando pero se espera a que el cliente envíe mas información.
4 Respuesta de finalización negativa temporal. El comando ha sido rechazado, pero el cliente debería intentarlo de nuevo.
5 Respuesta de finalización negativa permanente. Se rechazo el comando.

          El segundo de los dígitos de un código de respuesta, especifica la categoría de la respuesta enviada. La siguiente tabla indica el significado del segundo dígito:

Segundo dígito Significado
0 Sintaxis
1 Información
2 Conexiones
5 Sistema de correo

          El tercer dígito de un código de respuesta, especifica mas el significado de las categorías de las respuestas.




Comandos SMTP

          Los comandos SMTP son variados y bastante numerosos. Antes de ver en detalle cada uno de ellos veremos como se realiza la conexión del cliente SMTP al servidor SMTP.

          Para establecer una conexión, el cliente se conecta al servidor mediante el puerto TCP 25. Cuando se establece la conexión, el cliente recibe un código de respuesta que le indica si el servidor esta en disposición de aceptar la conexión y si es capaz de abrir una sesión o bien si el servicio de correo no esta disponible en ese momento. La tabla siguiente indica los códigos de respuesta posibles:

Código Significado
220 El servicio de correo esta disponible
421 El servicio de correo no esta disponible

          A continuación paso a nombrar y describir los comandos SMTP:




              - DATA: este comando indica al servidor que el texto que va a continuación del comando es ya el mensaje de correo que debe de llevarse al destinatario indicado por el encabezado del mensaje. El texto del mensaje debe de estar de acuerdo con el estándar del formato de mensaje de Internet, descrito en la RFC 822. Este texto del mensaje debe finalizar con un punto, que tiene que ir precedido (del comando anterior) y sucedido de los caracteres de retorno carro/avance de línea, #13#10. El funcionamiento es sencillo, se envía el comando y el servidor debería responder con el código de respuesta 354. El paso siguiente es enviar el mensaje, al termino del cual se debería de recibir el código de respuesta 250. La sintaxis del comando DATA es la siguiente:

DATA#13#10

              La tabla siguiente indica los posibles códigos de respuesta que puede recibir este comando:

Código Significado
250 La acción solicitada se ha completado
354 Comenzar la introducción del correo, acabando con <CRLF>.<CRLF>
421 El servicio no esta disponible
451 Se abandono la acción por un error de procesamiento local
452 No se produjo la acción por que el disco no tiene espacio de almacenamiento suficiente
500 Error en la sintaxis, no se pudo reconocer el comando
501 Error en la sintaxis de los parámetros del comando
503 Secuencia de comandos incorrecta
552 Abandono de la acción porque se supero la reserva de espacio
554 Se produjo un fallo en la transacción




              - EXPN (expandir): este comando se utiliza para verificar las listas de correo. Si se le pasa como parámetro un nombre de lista de correo, el servidor nos devuelve los nombres de usuario y las direcciones de los destinatarios de la lista de correo. La sintaxis de este comando es:

EXPT nombre_lista_de_correo#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
250 La acción solicitada se ha completado
421 El servicio no esta disponible
500 Error en la sintaxis, no se pudo reconocer el comando
501 Error en la sintaxis de los parámetros del comando
502 El comando no esta implementado
504 El parámetro del comando no esta implementado
550 La acción no se realizo por que no se ha encontrado el buzón




              - HELO: este comando es el encargado de iniciar el dialogo SMTP. Este comando tiene como parámetro el nombre del cliente para establecer su identidad. El servidor responderá con un código de respuesta 250 seguido del nombre del servidor. La sintaxis de este comando es la siguiente:

HELO nombre_cliente#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
250 La acción solicitada se ha completado
421 El servicio no esta disponible
500 Error en la sintaxis, no se pudo reconocer el comando
501 Error en la sintaxis de los parámetros del comando
504 El parámetro del comando no esta implementado




              - HELP: este comando hace que el servidor envíe información de ayuda sobre todos los comando o sobre un comando en concreto. Su sintaxis es:

HELP [ cadena-comandos ]#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
211 El sistema tiene disponible la ayuda
214 Mensaje de información de ayuda
421 El servicio no esta disponible
500 Error en la sintaxis, no se pudo reconocer el comando
501 Error en la sintaxis de los parámetros del comando
502 El comando no esta implementado
504 El parámetro del comando no esta implementado




              - MAIL: este comando indica al servidor el inicio de un mensaje de correo y le indica además quien es el remitente del mensaje. La sintaxis de este comando es:

MAIL FROM: nombre_remitente@host_remitente#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
250 La acción solicitada se ha completado
421 El servicio no esta disponible
451 Se abandono la acción por un error de procesamiento local
452 No se produjo la acción por que el disco no tiene espacio de almacenamiento suficiente
500 Error en la sintaxis, no se pudo reconocer el comando
501 Error en la sintaxis de los parámetros del comando
552 Abandono de la acción porque se supero la reserva de espacio




              - NOOP (no operación): este comando provoca que el servidor responda con un OK. No afecta a ningún comando enviado anteriormente o posteriormente. Se suele usar para asegurarse de que la conexión permanece activa. La sintaxis del comando es:

NOOP#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
250 La acción solicitada se ha completado
421 El servicio no esta disponible
500 Error en la sintaxis, no se pudo reconocer el comando




              - QUIT: este comando le indica al servidor que el cliente no tiene mas operaciones que realizar y que se debería cerrar la conexión. El servidor responde OK y seguidamente, cierra la conexión con el cliente. Su sintaxis es:

QUIT#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
221 Se está cerrando la conexión
500 Error en la sintaxis, no se pudo reconocer el comando




              - RCPT (destinatario): este comando indica al servidor quien es el destinatario del mensaje que se está enviando. Si el mensaje debe de ir a varios destinatarios, se pueden expresar separados por comas. La sintaxis del comando es:

RCPT TO: nombre_destinatario@host_destinatario [,nombre_destinatario@host_destinatario, ...]#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
250 La acción solicitada se ha completado
251 El usuario no es local, entonces se remite el mensaje a nombre-servidor
421 El servicio no esta disponible
450 No ser realizo la acción porque el buzón no esta disponible
451 Se abandono la acción por un error de procesamiento local
452 No se produjo la acción por que el disco no tiene espacio de almacenamiento suficiente
500 Error en la sintaxis, no se pudo reconocer el comando
501 Error en la sintaxis de los parámetros del comando
503 Secuencia de comandos incorrecta
550 La acción no se realizo por que no se ha encontrado el buzón
551 El usuario no es local, el cliente debería conectarse a nombre-servidor
552 Abandono de la acción porque se supero la reserva de espacio
553 No se realizo la operación porque la sintaxis del nombre del buzón es incorrecta




              - RSET (reinicio): este comando le indica al servidor que abandone la transacción de correo actual, que descarte los datos introducidos del remitente, destinatario o el mensaje. RSET provoca que se vacíen y reinicien todos los buffers y tablas de estado. Su sintaxis es:

RSET#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
250 La acción solicitada se ha completado
421 El servicio no esta disponible
500 Error en la sintaxis, no se pudo reconocer el comando
501 Error en la sintaxis de los parámetros del comando
504 El parámetro del comando no esta implementado




              - SEND: este comando se utiliza para enviar correo a la pantalla del terminal de la sesión actual del destinatario del mensaje. No se envía el mensaje al buzón del destinatario. Este comando se utiliza fundamentalmente cuando se necesita enviar un mensaje critico, por ejemplo, al administrador del sistema. Si el destinatario no puede recibir el mensaje, bien porque no esta en sesión, bien porque el terminal no acepta mensajes, etc. el servidor devolverá un código de respuesta al comando RCPT que debería seguir al comando SEND. La sintaxis de este comando es:

SEND FROM: nombre_remitente@host_remitente#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
250 La acción solicitada se ha completado
421 El servicio no esta disponible
451 Se abandono la acción por un error de procesamiento local
452 No se produjo la acción por que el disco no tiene espacio de almacenamiento suficiente
500 Error en la sintaxis, no se pudo reconocer el comando
501 Error en la sintaxis de los parámetros del comando
502 El comando no esta implementado
552 Abandono de la acción porque se supero la reserva de espacio




              - SOML (enviar o enviar por correo): este comando funciona como el comando SEND, con la diferencia de que si la pantalla del terminal de destinatario del mensaje no puede recibir, por el motivo que sea, el mensaje, el buzón de dicho usuario recibirá de forma automática el mensaje. La sintaxis del comando es:

SOML FROM: nombre_remitente@host_remitente#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
250 La acción solicitada se ha completado
421 El servicio no esta disponible
451 Se abandono la acción por un error de procesamiento local
452 No se produjo la acción por que el disco no tiene espacio de almacenamiento suficiente
500 Error en la sintaxis, no se pudo reconocer el comando
501 Error en la sintaxis de los parámetros del comando
502 El comando no esta implementado
552 Abandono de la acción porque se supero la reserva de espacio




              - SAML (enviar y enviar por correo): este comando funciona igual que el comando SOML, con la diferencia de que siempre se envía el mensaje al buzón independientemente de que llegue a la pantalla del terminal o no. La sintaxis de este comando es:

SAML FROM: nombre_remitente@host_remitente#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
250 La acción solicitada se ha completado
421 El servicio no esta disponible
451 Se abandono la acción por un error de procesamiento local
452 No se produjo la acción por que el disco no tiene espacio de almacenamiento suficiente
500 Error en la sintaxis, no se pudo reconocer el comando
501 Error en la sintaxis de los parámetros del comando
502 El comando no esta implementado
552 Abandono de la acción porque se supero la reserva de espacio




              - TURN: este comando invierte los papeles del servidor y del cliente. El cliente toma el papel de destinatario y el servidor toma el papel de remitente. Este comando se usa para recibir los mensajes de correo que desde el servidor se quiera enviar sin tener que esperar a que el servidor inicie una sesión SMTP con el cliente después de terminar la actual. Su sintaxis es:

TURN#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
250 La acción solicitada se ha completado
500 Error en la sintaxis, no se pudo reconocer el comando
502 El comando no esta implementado
503 Secuencia de comandos incorrecta




              - VRFY (verificar): este comando le indica al servidor que verifique que el destinatario especificado, sea un usuario real y valido por tanto, del sistema servidor. Este comando se utiliza antes de iniciar un nuevo mensaje de correo. La sintaxis de este comando es:

VRFY nombre_usuario#13#10

              Los posibles códigos de respuesta a este comando están en la siguiente tabla:

Código Significado
250 La acción solicitada se ha completado
251 El usuario no es local, entonces se remite el mensaje a nombre-servidor
421 El servicio no esta disponible
500 Error en la sintaxis, no se pudo reconocer el comando
501 Error en la sintaxis de los parámetros del comando
502 El comando no esta implementado
504 El parámetro del comando no esta implementado
550 La acción no se realizo por que no se ha encontrado el buzón
551 El usuario no es local, el cliente debería conectarse a nombre-servidor
553 No se realizo la operación porque la sintaxis del nombre del buzón es incorrecta




          Estos son los comandos de la especificación del SMTP. Pero este es un protocolo que lleva funcionando ya muchos años y como es lógico, se han realizado algunas extensiones. Ninguna de las extensiones se ha popularizado, pero se ha estandarizado una de estas extensiones en la RFC 1651, cuyo objetivo es permitir que el cliente de correo electrónico, pueda conocer cuales son las extensiones que soporta un servidor SMTP concreto. El comando que permite esta posibilidad es EHLO, que se utiliza en lugar de HELO y con la misma sintaxis. Si el servidor no admite ninguna extensión, responde con un código de respuesta 500, es decir, no reconoce el comando. En el caso de que sí reconozca el comando, responde con un código 250 y si admite alguna extensión, envía varias líneas que ofrecen una lista de las extensiones que soporta dicho servidor (cada línea comienza con el código de respuesta 250).

          Un aspecto importante, es que el conjunto de comandos SMTP ni el modelo de comunicación de este protocolo, no disponen de un comando de entrada a un sistema de correo. Por este motivo, cualquier cliente de correo puede conectarse a cualquier servidor y enviar mensajes de correo, lo que hace que el sistema de correo de Internet sea vulnerable en cuanto a seguridad se refiere. Cualquier usuario de Internet puede enviar correo con una dirección de remite falsa o real de otra persona. Aunque si es cierto que para poder realizar esto, se debe tener un conocimiento de estos protocolos y además hay que tener en cuenta que siempre hay ficheros logs, es decir, de registro de operaciones, mediante las cuales se pueden hacer rastreos.