Enviar emails con PHPmailer Por Admin (24/11/2017)

Blog sobre Programacion en Estados Unidos

Enviar emails con PHPmailer

Envia correos desde tu sitio web con formato HTML y de forma segura con PHPMailer. Esta libreria te permite enviar correos autenticados al igual que si enviaras un correo mediante Outlook, webmail y otros gestores de correo. Su implementacion es muy sencilla.

Que es y para que sirve PHPMailer

PHPMailer es una clase PHP que proporciona funciones avanzadas para envio de correos. Esta clase es principalmente para envio desde formularios, envio de newsletters, envios de mensajes al usuario por ej. recordar contraseña, mensaje de usuario registrado, comunicaciones automaticas, etc.

La principales caracteristicas son enviar correos con etiquetas HTML, enviar correos autenticados vinculados a una cuenta real de correo, enviar correos mediante SSL/TLS y puertos seguros. Enviar archivos adjuntos, enviar correos a multiples destinatarios, incluir headers especiales y mucho mas.

Se recomienda no utilizar la funcion clasica mail() de PHP por el motivo que no permite autenticar los correos y en la mayoria de las ocasiones los correos seran recibidos como no deseados e incluso no aceptados por el servidor destino.

 

Configuracion basica de PHPMailer

La implementacion de PHPMailer es muy sencilla. Debes incluir la clase phpmailer y menos de 20 lineas de codigo para configurar a donde se enviara el mensaje, el asunto, el cuerpo del mensaje y otras configuraciones. Si trabajas en localhost es posible que no funcione, tenlo en cuenta para realizar las pruebas directamente en tu servidor de hosting.

Hay un parametro muy importante a tener en cuenta, es el modo debug, en caso de estar activo se mostrara un log en pantalla donde podras encontrar el motivo por cual no se esta enviando el correo. Al funcionar correctamente debes desactivarlo. El valor inactivo es SMTPDebug=0; y para mostrar el log es SMTPDebug=2;

Codigo ejemplo

require 'PHPMailerAutoload.php'
$mail = new PHPMailer;
$mail->SMTPDebug = 2; // Activar log para encontrar errores
$mail->isSMTP(); // Indicar que el email se enviara mediante SMTP
$mail->Host = 'mail.sitioweb.com;'; // Servidor SMTP del servidor
$mail->SMTPAuth = true; // Autenticar SMTP con usuario y password de una cuenta existente
$mail->Username = 'user@example.com'; // Correo electronico a utilizar para los envios
$mail->Password = 'password'; // Password de la cuenta de correo
$mail->SMTPSecure = 'tls'; // Activa envio seguro mediante SSL / TLS
$mail->Port = 587; // Puerto a utilizar, puede variar segun el proveedor de hosting. Si no se utiliza SSL el puerto deberia ser 25 o 26.
$mail->setFrom('from@sitio.com', 'Notificaciones'); // Indica quien envia el correo, y un nombre, en este caso notificaciones.
$mail->addAddress('cuenta@sitiodestino.com', 'Nombre de usuario'); // Indica a quien se envia el correo y nombre (nombre es opcional);
$mail->addReplyTo('info@misitio.com', 'Notificaciones'); // Un email para recibir respuestas
$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Enviar adjunto(opcional)
$mail->isHTML(true); // Para enviar correo utilizando etiquetas html
$mail->Subject = 'Asunto del correo'; //El asunto del correo
$mail->Body = 'Cuerpo del mensaje';
$mail->AltBody = 'Cuerpo del mensaje solo texto'; //Recomendado utilizar para gestores de correo que no permitan html y mejorar la recepcion de correos.
if($mail->send()) { // Se envia el correo 
    echo 'Mensaje enviado.'
}else { 
    echo 'El mensaje fallo'; echo 'Mailer Error: ' . $mail->ErrorInfo;
}

Estructura del sitio utilizando PHPMailer

El codigo anterior es suficiente para enviar correos de forma correcta y segura. Sin embargo tambien necesitaras obtener los datos que seran enviados con el script. Hay varias estructuras que se podrian utilizar. Algunos ejemplos son:

  • Una pagina html/php con un formulario y una pagina .php con el script que envia los datos del formulario.
  • Una unica pagina PHP que tome los datos de base de datos
  • Una unica pagina PHP que tome multiples datos de base de datos y envie un lote de correos.
  • Una funcion PHP que incluya el script y pueda ser utilizado para diferentes envios.

En todos los casos la configuracion sera la misma pero tendremos que reemplazar algunos parametros por variables. Los principales serian:

$mail->addAddress($email_destino, $nombre_destino);

$mail->Subject=$asunto;

$mail->Body=$cuerpo;

$mail->AltBody=$cuerpo_texto

Modificando estas lineas nuestro script podra recibir datos de forma dinamica. Por ejemplo un formulario para enviar mensajes a nuestros usuarios mediante PHPMailer seria:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Documento sin título</title>
</head><body>
<form method="post" action="enviar.php">
    <input type="text" name="email" />
<input type="text" name="asunto" />
    <input type="text" name="mensaje" />
    <input type="submit">
</form>
</body>
</html>

Este formulario enviara un correo a nuestro usuario con el correo indicado, el asunto y el mensaje. Estos datos son enviados a nuestro primer script en enviar.php. Al script solo seran necesario reemplazar estas variables y tomar los valores mediante POST. El siguiente codigo muestra el codigo final de enviar.php utilizando PHPMailer

require 'PHPMailerAutoload.php'
$mail = new PHPMailer;
$email_destino=$_POST["email"];
$asunto=$_POST["asunto"];
$mensaje=$_POST["mensaje"];

$mail->SMTPDebug = 2; // Activar log para encontrar errores
$mail->isSMTP(); // Indicar que el email se enviara mediante SMTP
$mail->Host = 'mail.sitioweb.com;'; // Servidor SMTP del servidor
$mail->SMTPAuth = true; // Autenticar SMTP con usuario y password de una cuenta existente
$mail->Username = 'user@example.com'; // Correo electronico a utilizar para los envios
$mail->Password = 'password'; // Password de la cuenta de correo
$mail->SMTPSecure = 'tls'; // Activa envio seguro mediante SSL / TLS
$mail->Port = 587; // Puerto a utilizar, puede variar segun el proveedor de hosting. Si no se utiliza SSL el puerto deberia ser 25 o 26.
$mail->setFrom('from@sitio.com', 'Notificaciones'); // Indica quien envia el correo, y un nombre, en este caso notificaciones.
$mail->addAddress($email_destino, 'Nombre de usuario'); // Indica a quien se envia el correo y nombre (nombre es opcional);
$mail->addReplyTo('info@misitio.com', 'Notificaciones'); // Un email para recibir respuestas
$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Enviar adjunto(opcional)
$mail->isHTML(true); // Para enviar correo utilizando etiquetas html
$mail->Subject = $asunto; //El asunto del correo
$mail->Body = $mensaje;
$mail->AltBody = 'Cuerpo del mensaje solo texto'; //Recomendado utilizar para gestores de correo que no permitan html y mejorar la recepcion de correos.
if($mail->send()) { // Se envia el correo      
echo 'Mensaje enviado.'
}else {
      echo 'El mensaje fallo';
echo 'Mailer Error: ' .
$mail->ErrorInfo;
}

PHPMailer para multiples envios

Con PHPMailer puedes enviar correos a lotes de usuarios. Principalmente podria ser utilizado para enviar periodicamente ciertos datos a nuestros usuarios. Por ejemplo. semanalmente estadisticas de visitas a sus articulos, recordatorios de pago, sobre todo seria para enviar datos muy personalizados ya que para enviar newsletters existen mejores opciones como phpList.

El funcionamiento es sencillo aunque si enviaras mas de 200 correos sera recomendable incluir tiempos entre envio de los mensajes, si bien se complicaria tambien es posible y al final de este articulo mostrare una forma de incluir pausas en el envio.

  • Debemos incluir la clase phpmailer
  • Incluir una funcion php enviar_email(destino, asunto, mensaje)
  • Recorrer tabla con datos de los usuarios, armar el mensaje y ejecutar la funcion

Enviar correos con PHPMailer en lotes y con pausas

Si enviaremos mas de 200 correos es recomendable enviar los correos en lotes de aprox. 20 correos y crear una pausa entre cada lote. De esta forma los correos llegaran a correo deseado mas facil y no llegaremos al limite de nuestro proveedor de hosting con lo cual significaria en muchos casos perder correos.

El siguiente ejemplo en PHP, envia 20 emails, espera 15 segundos y recarga la pagina para enviar los siguientes 20 correos. Para el ejemplo utilizaremos una tabla con usuario, email y cantidad de visitas. En el ejemplo no se incluiran conexiones a la base de datos.

 

ini_set("memory_limit","256M");
ini_set ( 'max_execution_time', 1200); 
$TAMANO_PAGINA = 20;
$pagina = $_GET["pagina"];
if (!$pagina) {
        $inicio = 0;
        $pagina=0;
}
else {
    $inicio = ($pagina) * $TAMANO_PAGINA;
}
$db->cargar_sql("select * from usuarios");
$rs_usuarios=$db->cargar_avisos();
$num_total_registros=count($rs_usuarios);
$total_paginas = ceil($num_total_registros / $TAMANO_PAGINA);
$db->cargar_sql("select * from rs_usuarios limit " . $inicio . "," . $TAMANO_PAGINA);
$rs_usuarios=$db->cargar_avisos();
foreach ($rs_usuarios as $usuario){
    $email_destino=$usuario->email;
    $visitas=$usuario->visitas;
    $asunto="Esta semana vieron tu articulo " . $visitas . ' usuarios';
    $mensaje="Estadisticas detalladas sobre visitas <br> Visitantes durante la ultima semana: " . $visitas;
    enviarcorreo($email_destino, $asunto, $mensaje);
}
if ($inicio<=$num_total_registros){
    $pagina=$pagina+1;
    printf('<META HTTP-EQUIV="Refresh" CONTENT="15; URL=enviar.php?pagina=' . $pagina . '&total=' . $num_total_registros . '&ini=' . $inicio .'">');
}

En el ejemplo se utilizan 2 consultas mysql que podrian reemplazarse por una sola y cambiar foreach por for

  • Las 2 primeras lineas se utilizan para que el script no genere errores por limite de memoria y tiempo de ejecucion.
  • $TAMANO_PAGINA indica la cantidad de emails que se enviaran por lote.
  • $pagina indica el numero de pagina que se esta enviando. Nuestro script se recargara automaticamente mostrando este parametro en la url. Por ejemplo si la pagina es 5 significaria que se enviaron 5*$TAMANO_PAGINA serian 100 correos.
  • foreach incluira el rango limitado por $inicio y $TAMANO_PAGINA
  • Al final incluimos una etiqueta HML META que recargara la misma pagina con los parametros necesarios para que nuestros script pueda enviar los siguientes 20 email. 
  • Cuando $inicio alcance el valor limite de $num_total_registros ya no se recargara la pagina y todos los correos habran sido enviados. 

Si modificamos la consulta y el contenido del foreach este script nos podria servir como importante herramienta para administrar nuestros sitios web. Por ejemplo podriamos realizar miniaturas con GD de miles de imagenes en lotes de 100 para no saturar el servidor ni ejecutar scripts durante mas de 2 minutos. De igual forma podriamos mover todas las imagenes de un directorio a otro en lotes. Podriamos generar informacion(obtener facturas, generar cupones de pago, etc) o imagenes de sitios externos en pequeños lotes.

Comparte tu opinion o comenta

Cuenta tu opinion o amplia el contenido del articulo
Contactenos Ahora!