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.
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.
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;
}
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:
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;
}
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.
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
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.