ESPAÑOL: ¡Bienvenido! Es la página inicial de OSIRIS LMS. Regístrese hoy mismo y obtenga acceso a todos nuestros CURSOS GRATUITOS. Clic aquí para registrarse ya. Hemos desarrollado una amplia gamma de cursos “online” (Programación, Multimedia, 3D, Habilidades suaves, etc.), disponibles 24X7. Para más detalle consulte la lista de Cursos Disponibles. Si tiene problemas con el acceso a la plataforma, vea el Tour Virtual de Osiris LMS. También puede consultar la sección de FAQ’s o enviar Solicitud de Soporte Técnico.

ForoForo de discusión
Enviar un mail con PHP especificando el servidor SMTP
Buscador:
Foro > PHP > Enviar un mail con PHP especificando el servidor SMTP

Enviado por: Texto del mensaje
Antonio Gonzalez
Nivel : Profesor
Mensajes : 23
> Perfil
Archivo adjunto :archivo
Escrito el : Miércoles 13-12-2006 A las : 05:00 ( > un mes )
Asunto : Enviar un mail con PHP especificando el servidor SMTP
Antes de explicar cómo nos podemos conectar directamente al servidor SMTP, explicaremos rápidamente para que sirve la función fsockopen(), porque la vamos a necesitar.

Mediante la función fsockopen() podemos abrir una conexión de sockets, que tiene la siguiente estructura:

fsockopen ( string destino [, int puerto [, int &errno [, string &errstr [, float tiempo_espera]]]] )

Inicia una conexión a través de sockets con el recurso especificado por destino como único parámetro requerido, también recibe el puerto, número de error, descripción de error y tiempo de espera para la respuesta.

Ahora veamos los comandos SMTP y las respuestas del servidor:

HELO - Es la forma de decir al servidor SMTP "hola". Si el servidor es capaz de responder a él, soporta las funcionalidades básicas que vamos a ver en este artículo.
MAIL FROM: - correo@dominio Con este comando se especifica de quién proviene el correo a enviar.
RCPT TO: - correo@dominio Con este comando se especifica el receptor (o receptores, el comando puede ser repetido tantas veces como receptores haya), del mensaje enviado.
DATA - Este comando permite ingresar el mensaje a enviar e introducir encabezados. 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 asunto. Tras todo el mensaje, debe escribirse “Enter” . “Enter”. Así se le dice al servidor que el mensaje ha terminado.

Veamos los códigos numéricos de respuesta de un servidor SMTP.

502 No implementado. Es el error que devuelve cuando uno de los comandos no está implementado en el servidor.
250 Todo correcto. El comando introducido ha funcionado correctamente 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.
553 El Receptor 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.

Y, para demostrar que todo lo anterior es cierto, aquí está un ejemplo completo que podemos utilizar para enviar correos mediante un servidor SMTP:

function mymail($to, $subject, $message, $headers, $host, $port, $user, $pwd)
{
global $GLOBAL;

// obtiene al remitente
if ( preg_match("/From:.*?[A-Za-z0-9\._%-]+\@[A-Za-z0-9\._%-]+.*/", $headers, $froms) ) {
preg_match("/[A-Za-z0-9\._%-]+\@[A-Za-z0-9\._%-]+/", $froms[0], $fromarr);
$from = $fromarr[0];
}

// Abre conexión con servidor SMTP
$cp = fsockopen ($host, $port, &$errno, &$errstr, 1);
if (!$cp)
return "Falló la conexión";
$res=fgets($cp,256);
if(substr($res,0,3) != "220") return "Falló la conexión";

// Dice hola
fputs($cp, "HELO ".$host."\r\n");
$res=fgets($cp,256);
if(substr($res,0,3) != "250") return "Falló el saludo";

// Realiza autenticación del usuario
fputs($cp, "auth login\r\n");
$res=fgets($cp,256);
if(substr($res,0,3) != "334") return "Falló la iniciación de autenticación";

fputs($cp, base64_encode($user)."\r\n");
$res=fgets($cp,256);
if(substr($res,0,3) != "334") return "No se pudo proporcionar el usuario";

fputs($cp, base64_encode($pwd)."\r\n");
$res=fgets($cp,256);
if(substr($res,0,3) != "235") return "Falló la autenticación";

// Mail from...
fputs($cp, "MAIL FROM: <$from>\r\n");
$res=fgets($cp,256);
if(substr($res,0,3) != "250") return "MAIL FROM falló";

// Rcpt to...
fputs($cp, "RCPT TO: <$to>\r\n");
$res=fgets($cp,256);
if(substr($res,0,3) != "250") return "RCPT TO falló";

// Data...
fputs($cp, "DATA\r\n");
$res=fgets($cp,256);
if(substr($res,0,3) != "354") return "DATA falló";

// Envía a: Remitente:, Asunto:, otros encabezados y messaje
fputs($cp, "To: $to\r\nFrom: $from\r\nSubject: $subject\r\n$headers\r\n\r\n$message\r\n.\r\n");
$res=fgets($cp,256);
if(substr($res,0,3) != "250") return "Cuerpo de mensaje falló";

// Termina el envío
fputs($cp,"QUIT\r\n");
$res=fgets($cp,256);
if(substr($res,0,3) != "221") return "Falló en la salida";

return true;
}


Nota: Un servidor SMTP por defecto escucha en el puerto 25.

Puedes descargar este ejemplo del archivo adjunto.
Profesor de PHP
Osiris LMS
Amplía tus conocimientos en línea
 
 
andres malpica
Nivel : Estudiante
Mensajes : 1
> Perfil
Escrito el : Viernes 19-10-2007 A las : 16:29 ( > un mes )
Asunto : $user, $pwd
estos datos se refieren a que usu y que pass