SMTP utilizando Sockets en PHP

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
HELOHola 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.
EHLOHola 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@dominioCon 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@dominioCon 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
502No 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.
250Todo 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.
553El Recipiente del mensaje (RCPT TO:), no está incluido en la lista de dominios a los que el servidor esté configurado para entregar el correo.
354Sigue adelante enviando el mensaje. Esto es lo que devuelve el servidor tras introducirle correctamente la palabra DATA.
221Significa "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

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO