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