PHPMailer: Envía correos desde tu web

Publicado: 11/12/2009 en desarrollo, email, php, phpmailer, Programación
Etiquetas:, , , , ,

You can read the English version of this post in http://phpsblog.agustinvillalba.com/phpmailer-send-emails-from-your-site/

En esta ocasión me gustaría hablar de la librería PHPMailer, ideal si necesitas enviar correos electrónicos desde tu sitio a web a los usuarios del mismo (por ejemplo: notificar los datos de suscripción, avisar de la proximidad de la caducidad de su cuenta, etc). Una característica interesantísima que ofrece esta librería es que nos permite enviar los correos a través de una cuenta de correo en GMail, lógicamente hemos de ser los dueños de dicha cuenta, teniendo la contraseña de la misma. Es cierto que el propio lenguaje PHP ya incluye funciones de envío de correo electrónico (la función mail() por ejemplo), pero siempre me ha resultado bastante engorroso hacerlo de esta manera.

En primer lugar, para utilizar la función mail() de PHP, hemos de configurar correctamente el servidor PHP, estableciendo todos los parámetros relacionados con el envío de mails en el archivo php.ini. Pero esto no acaba aquí, lo peor de todo está en que hemos de tener un servidor de correo electrónico (por ejemplo postfix o qmail, o el que sea) montado en la misma máquina donde corre nuestra aplicación, que en el caso de que lo hagamos en un servidor externo contratado no hay problema, pero si la máquina hemos de mantenerla nosotros mismos (por los motivos que sean), pues ya no es tan fácil.

Para montar un servidor de correo hacen falta, además de conocimientos bastante avanzados en el tema (funcionamiento, configuración, etc), muchos y muy buenos conocimientos de seguridad, dado que un servidor de correo es un caramelo para todos aquellos que gustan de adueñarse de máquinas ajenas, haciéndolas “zombies” y utilizándolas como plataformas de reenvío de sus spams. Es por esto que me decanto por esta librería por los motivos que veremos a continuación.

Utilizando la librería

Lo primero que hemos de hacer es descargarnos la última versión de esta librería. Una vez hemos descomprimido el archivo y colocado el directorio de la librería en el directorio de nuestra aplicación web ya podemos empezar a trabajar para poder utilizarla. Si lo deseamos, podemos eliminar los directorios test, examples y docs, dado que no son necesarios para el funcionamiento de la librería.

Pongamos un caso de ejemplo, le hemos presentado un formulario al usuario, el cual rellena (entre otros datos nos proporciona una dirección de correo) y cuando lo envía nosotros hemos de procesarlo y enviarle un correo electrónico confirmándole que se ha procesado. Lo enviaremos a través de una cuenta GMail por protocolo SMTP seguro, tenemos la tranquilidad de que es Google quien está detras. Bien, pues en nuestro controlador que procesa el formulario hemos de incluir el siguiente código:

include(PHPMailer/class.phpmailer.php);

Con esto ya tenemos acceso a las funciones de la librería. A partir de aquí ya tan sólo nos queda crear el objeto, añadirle todos los parámetros que hemos recogido del formulario previamente presentado al usuario y enviarlo, para ello hemos de añadir el siguiente código:

$mail = new PHPMailer();

$mail->IsSMTP(); // establecemos que utilizaremos SMTP
$mail->SMTPAuth   = true; // habilitamos la autenticación SMTP
$mail->SMTPSecure = "tls";  // establecemos el prefijo del protocolo seguro de comunicación con el servidor
$mail->Host       = "smtp.gmail.com";      // establecemos GMail como nuestro servidor SMTP
$mail->Port       = 587;                   // establecemos el puerto SMTP en el servidor de GMail
$mail->Username   = "minombreusuario@gmail.com";  // la cuenta de correo GMail
$mail->Password   = "contraseña";            // password de la cuenta GMail

$mail->SetFrom('info@tudominio.com', 'Nombre Apellido');  //Quien envía el correo
$mail->AddReplyTo("response@tudominio.com","Nombre Apellido");  //A quien debe ir dirigida la respuesta

$mail->Subject    = "Su formulario ha sido recibido";  //Asunto del mensaje
$mail->Body      = "Hola,<br />
 su formulario ha sido recibido correctamente.<br />
 <strong>Muchas gracias</strong>";  //Cuerpo del mensaje en código HTML
$mail->AltBody    = "Hola,\n
 su formulario ha sido recibido correctamente.\n
 Muchas gracias";  //Cuerpo del mensaje para aquellos lectores que no permitan el código HTML

$destino = "destinatario@otrodominio.com";
$mail->AddAddress($address, "Juan Palotes");

$mail->AddAttachment("images/phpmailer.gif");      // añadimos archivos adjuntos si es necesario
$mail->AddAttachment("images/phpmailer_mini.gif"); // tantos como queramos

if(!$mail->Send()) {
echo "Error en el envío: " . $mail->ErrorInfo;
} else {
 echo "¡Mensaje enviado correctamente!";
}

Con esto tendríamos listo nuestro código de envío de correo electrónico a los usuarios de nuestro sitio. Ahora me gustaría matizar un par de líneas del código anterior, en el que creamos el cuerpo del mensaje. Para mayor comodidad, si lo que enviamos es un cuerpo HTML, podemos tener ese mensaje tipo en un archivo .html externo, el cual incluimos posteriormente en el correo de esta manera:

$body  = file_get_contents('cuerpo_correo.html');
$body  = eregi_replace("[\]",'',$body);
...
...
$mail->MsgHTML($body);

Con esto ya tenemos completamente terminado nuestro código de envío de correo electrónico desde nuestro sitio web a través de GMail. Para finalizar me gustaría puntualizar que este código es válido también para enviar correos electrónicos a través de una cuenta en cualquier otro servidor de correo, siempre y cuando tengamos cuenta de correo en ese servidor y su contraseña, y dicho servidor tenga habilitado el envío de correos a través de SMTP.

You can read the English version of this post in http://phpsblog.agustinvillalba.com/phpmailer-send-emails-from-your-site/

Anuncios
comentarios
  1. criszz dice:

    yo ya puedo enviar correo masivo con phpmailer jalando los datos desde mysql pero lo que no funciona es que si un correo esta mal escrito envia el correo hasta antes del que esta mal escrito y los correos que le siguen no se envian denme una solucion por favor posdata : el envio masivo lo hago con un while

    • Antes que nada he de advertirte que es arriesgado enviar correos masivos desde tu web, es muy probable que pases a formar parte de las listas de spammers de los ISPs, cuidado.
      Aún así, todo depende de cómo hayas programado ese bucle while, tiene pinta de que tienes una condición de salida del while si el correo no se pudo enviar, pero sin ver el código no se puede asegurar.

      Y repito, cuidado con el spam que se detecta enseguida!

  2. Alan dice:

    Yo de nuevo ahora por lo menos me sale error:
    Language string failed to load: tls
    Error en el envío: Language string failed to load: tls

    y otra pregunta.. su variable “$address” seria la misma que “$destino”

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s