Comenzaremos por mostrar como se usa la función fsockopen(), porque la vamos a necesitar antes de conectarnos al servidor SMTP. Esta función toma dos argumenstos más tres opcionales, pero a nosotros solo nos interesan los dos obligatorios. El primero es la IP o nombre del servidor al que conectar, y el segundo es el puerto. Así, nosotros, usaremos el puerto 25, y, como servidor, uno que conozcamos que funcione.
Así pues, primero vamos a ver un ejemplo de como abrir un socket, y luego encapsularemos en una clase las funciones que vamos a necesitar en la clase a crear. En este sencillo ejemplo, solo vamos a conectar a un servidor de correo y decirle "Hola", en su lenguaje. El código es como sigue:
<? //Abrimos la conexión $Conexion = fsockopen("programacion.com","25"); //Sacamos el contenido de lo que nos devuelve el servidor antes de seguir $str_recibe = fgets($Conexion,256); echo "<pre>"; print_r($str_recibe); echo "</pre>"; //Esta es la cadena que dice "Hola". Fíjate en en final que marca //un "Enter", para confirmar el comando $str_hola = "EHLO programacion.com "; //Le soltamos la cadena al socket if(!fputs($Conexion,$str_hola)) { echo "Imposible decirle "hola" al servidor."; exit; } else { $str_recibimos = fgets($Conexion,256); echo "<pre>"; print_r($str_recibimos); echo "</pre>"; } //Salimos de la sesión, primero diciendo "Adios" al servidor //y luego cerrando el socket con fclose() if(!fputs($Conexion,"QUIT ")) { echo "No se pudo salir de la sesión con el servidor SMTP"; exit; } else { fclose($Conexion); echo "Cerrado y terminado"; exit; } ?>
Como vemos, no es tan complicado como parece. A continuación vamos a mostrar una lista de comandos SMTP que nos serán imprescindibles a la hora de tratar con un servidor de correo. Asimismo, veremos los distintos códigos que nos puede devolver el servidor.
Comandos SMTP y respuestas del servidor
A continuación, muestro una lista de comandos SMTP junto con su significado.
Comando | Significado |
---|---|
HELO | Hola sencillo. Es el modo más antiguo y seguro de decir "hola". Si el servidor es capaz de responder a él, soporta las funcionalidades básicas que vamos a ver en este tutorial. |
EHLO | Hola extendido. Es el modo de decirle hola al servidor más moderno. Si es capaz de responder, significa que posee muchas más características que si solo pudiese responder a HELO. Muchas de ellas son muy avanzadas y no las vamos a ver en este tutorial. |
MAIL FROM: correo@dominio | Con este comando se especifica de quién proviene el correo a enviar. A menudo el dominio ha de ser uno válido, pues ciertos servidores comprueban la existencia del mismo, devolviendo un mensaje de error si no pueden ser identificados. |
RCPT TO: correo@dominio | Con este comando se especifica el receptor (o receptores, pues el comando puede ser repetido tantas veces como receptores haya), del mensaje enviado. Es importante tener en cuenta que ciertos servidores poseen una tabla de dominios a los que pueden entregar el correo. Por ejemplo, mucha gente configura el servidor para que solo pueda admitir correo para la máquina, rechazando todas las otras direcciones cuyos registros DNS no se encuentren en la misma. Como regla general, es seguro usar el servidor de correo del dominio al cual pertenece el correo de la persona a la que va dirigida el mensaje. |
DATA (Subject: ) . | Este comando, pese a su apariencia compleja, no lo es tanto en realidad. Primero va la palabra clave DATA, que indica al servidor de correo que se inicia la transferencia de los datos del correo en si. Tras esta sentencia, y, antes del correo, podemos incluir cabeceras, siendo la más común Subject: , para indicar el tema. Tras todo el mensaje, debe escribirse . . Si eso es. Un "Enter", seguido de un punto y otro "Enter". Así se le dice al servidor que el mensaje ha terminado. Una vez pulsemos el último "Enter", el mensaje será enviado a la cola de proceso, listo para su entrega. |
Pues ya ves que no son tantos. En realidad solo cinco, para hacer el trabajo más básico. Con esto se pueden mandar e-mails en formato de texto simple, sin ficheros adjuntos. No es mucho, pero, para estar trabajando a este nivel, ya es.
A continuación, una lista de los códgos numéricos más usuales de un servidor SMTP.
Código | Significado |
---|---|
502 | No implementado. Es el error que devuelve cuando uno de los comandos no está implementado en el servidor. Por ejemplo, programacion.com responde 502 a EHLO. |
250 | Todo correcto. El comando introducido ha funcionado correctamnte y la acción requerida ha sido realizada sin problemas. También es lo que devuelve el servidor cuando un mensaje ha sido enviado correctamente a la cola de proceso. |
553 | El Recipiente del mensaje (RCPT TO:), no está incluido en la lista de dominios a los que el servidor esté configurado para entregar el correo. |
354 | Sigue adelante enviando el mensaje. Esto es lo que devuelve el servidor tras introducirle correctamente la palabra DATA. |
221 | Significa "Adios" en la jerga SMTP |
Y, para demostrar que todo lo anterior es cierto, aquí está la transcripción de mi sesión telnet con el servidor de programacion.com
220 us-8.34web.com ESMTP EHLO programacion.com 502 unimplemented (#5.5.1) HELO programacion.com 250 us-8.34web.com MAIL FROM:[email protected] 250 ok RCPT TO:[email protected] 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1) RCPT TO:[email protected] 250 ok DATA 354 go ahead Subject: Esto es una prueba del webmaster de la seccion de php fLIPIS Este es el mensaje de prueba . 250 ok 1033728059 qp 1944 quit 221 Goodbye
Escribiendo la clase SMTP
Llegados a este punto, hemos visto cual es la secuencia de comandos necesaria para mandarle al servidor lo que nos hace falta para enviar un correo sencillo, de solo texto. Dado que el código de la clase es considerablemente largo, no lo incluyo aquí. Descargadlo en el sguiente link. Hay dos scripts, uno de ejemplo y otro que es la clase en si.
Descargate los ficheros del artículo