SMTP utilizando Sockets en PHP

Comenzaremos por mostrar como se usa la funcin fsockopen(), porque la vamos a necesitar antes de conectarnos al servidor SMTP. Esta funcin toma dos argumenstos ms 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 cdigo es como sigue:


<?

//Abrimos la conexin
$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". Fjate 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 sesin, primero diciendo "Adios" al servidor
//y luego cerrando el socket con fclose()
if(!fputs($Conexion,"QUIT
"))
{
	echo "No se pudo salir de la sesin con el servidor SMTP";
	exit;
}
else
{
	fclose($Conexion);
	echo "Cerrado y terminado";
	exit;
}



?>

 

Como vemos, no es tan complicado como parece. A continuacin vamos a mostrar una lista de comandos SMTP que nos sern imprescindibles a la hora de tratar con un servidor de correo. Asimismo, veremos los distintos cdigos que nos puede devolver el servidor.

Comandos SMTP y respuestas del servidor

A continuacin, muestro una lista de comandos SMTP junto con su significado.

Comando Significado
HELOHola sencillo. Es el modo ms antiguo y seguro de decir "hola". Si el servidor es capaz de responder a l, soporta las funcionalidades bsicas que vamos a ver en este tutorial.
EHLOHola extendido. Es el modo de decirle hola al servidor ms moderno. Si es capaz de responder, significa que posee muchas ms caractersticas que si solo pudiese responder a HELO. Muchas de ellas son muy avanzadas y no las vamos a ver en este tutorial.
MAIL FROM: [email protected]Con este comando se especifica de quin proviene el correo a enviar. A menudo el dominio ha de ser uno vlido, pues ciertos servidores comprueban la existencia del mismo, devolviendo un mensaje de error si no pueden ser identificados.
RCPT TO: [email protected]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 mquina, 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 ms comn 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 ms bsico. 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 continuacin, una lista de los cdgos numricos ms usuales de un servidor SMTP.

Cdigo 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 accin requerida ha sido realizada sin problemas. Tambin 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 transcripcin de mi sesin 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 cdigo 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 artculo

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.