Envío masivo de correos electrónicos en PHP

Hola de nuevo,
en esta ocasión vamos a ver cómo enviar, de forma sencilla, correos electrónicos de forma masiva.
En las últimas versiones de PHP con las que he trabajado (Desde la 4) hay disponible un método llamado mail() que con una serie de parámetros, permite enviar de forma sencilla un correo a un destinatario.
En su web oficial (https://www.php.net/manual/es/function.mail.php) podéis encontrar su sintaxis completa, con ejemplos.
<?php
      mail('micorreo@miservidor.com', 'Mi título', "Mi mensaje');
?>

Pero esto, tal cual, no funciona. Es necesario que el equipo donde va montado el "programita" tenga un servidor SMTP funcionando (MTA). Podemos instalar cualquiera de estos, gratuitos o de pago, usar un Exchange de Microsoft, o cualquier otro. Esto puede ser un problema...Aunque hay códigos por ahí que sin un MTA local, creando sockets, pueden hacer el envío igualmente.
Pero además, existe otro problema añadido.
Imaginemos que queremos acceder a una base de datos con cientos de clientes, con sus respectivos correos electrónicos, a los que queremos enviar de forma automática, algún mensaje: unas ofertas, su última factura, unas felicitaciones navideñas, ...
Totalmente desaconsejado este método mail(). En primer lugar por eficiencia porque por cada destinatario, abre y cierra un socket de comunicación, lo que a la larga puede colapsar el servidor de correo y solamente saldrían unos pocos mensajes.
Por otro lado, los gestores de correo habituales (Outlook, Gmail, Yahoo, ... y todos los demás) si detectan una fuente de correos masivos pueden bloquear su emisión al considerar que se trata de un servidor de SPAM, con lo cual, los correos no llegarán tampoco a todos los destinatarios. Es más, por experiencia propia os puedo asegurar que estos gestores de correo son tan eficientes que solamente dejan pasar uno o dos correos antes de bloquear al resto.

Pero no desesperéis. Hay formas de solucionarlos y vamos a ver la que a mí me funciona sin ningún problema, por lo menos, hasta la fecha.

Lo primero que necesitamos son una serie de datos de configuración de nuestro servidor SMTP, que en este caso será remoto. Podemos usar nuestro servidor donde tenemos alojada nuestra web, la web de la empresa, etcétera.
Y también necesitaremos una librería, en nuestro caso, la PHPMailer. Gratuita, fácil de encontrar y bastante depurada. Aunque supongo que valdría cualquiera otra.
Los parámetros de los que hemos hablado antes serían:
  • Dirección del servidor SMTP, por ejemplo, smtp.1and1.es, aunque Gmail tiene el suyo, y así los demás. Es cuestión de bichear un poco.
  • Puerto de escucha, por ejemplo, el 587
  • Tipo de encriptación, por ejemplo, tls
  • Y, por último, un nombre de usuario de correo en dicho servidor, con sus respectiva clave.


Ahora el código:
<?php
// Correo electrónico
require './correos/PHPMailerAutoload.php';
// Creamos una nueva instancia
$mail = new PHPMailer();
// Activamos el servicio SMTP
$mail->isSMTP();
// Activamos / Desactivamos el "debug" de SMTP
// 0 = Apagado
// 1 = Mensaje de Cliente
// 2 = Mensaje de Cliente y Servidor
$mail->SMTPDebug = 2;
// Log del debug SMTP en formato HTML
$mail->Debugoutput = 'html';
// Servidor SMTP (para este ejemplo utilizamos 1and1)
$mail->Host = 'smtp.1and1.es';
// Puerto SMTP
$mail->Port = 587;
// Tipo de encriptacion SSL ya no se utiliza se recomienda TSL
$mail->SMTPSecure = 'tls';
// Si necesitamos autentificarnos
$mail->SMTPAuth = true;
// Usuario del correo desde el cual queremos enviar, para Gmail recordar usar el usuario completo (usuario@gmail.com)
$mail->Username = "correo@servidor.com";
// Contraseña
$mail->Password = "XXXXXXXXXXX";
       // Datos del destinatario del mensaje
       $email = "jorge@grupostudium.com";
       $nombre = "Jorge Rodríguez";

       // Enviar correo
$mail->setFrom('correo@servidor.com', 'Grupo Studium');
$mail->addAddress($email, $nombre);
/La linea de asunto
$mail->Subject = utf8_decode('Asunto');
// La mejor forma de enviar un correo, es creando un HTML e insertándolo de la siguiente forma, PHPMailer permite insertar, imágenes, css, etc. (No se recomienda el uso de Javascript)
$mensaje = "Buenos días,<br/>";
$mensaje .= "tal y tal y tal y tal.<br/>";
$mensaje .= "<hr/>";
$mensaje .= "<i>Atte. Grupo Studium</i>.";
$mensaje .= "<hr/>";
$mail->msgHTML(utf8_decode($mensaje), dirname(__FILE__));
// Enviamos el Mensaje
$operacion = $mail->send();
// Borramos el destinatario, de esta forma nuestros clientes no ven los correos de las otras personas y parece que fuera un único correo para ellos.
$mail->ClearAddresses();
?>

Obviamente, hay que adaptarlo. La parte de // Enviar correo, se puede meter en un bucle e ir cambiando los valores de $email y de $nombre para ir enviando a diferentes destinatarios.
Se puede analizar el valor de la variable $operacion para saber si se ha realizado o no el envío del correo correspondiente.

Espero os sea de utilidad y cualquier anotación, aclaración, mejora, ... ya sabéis que será bien recibida.

Comentarios

Entradas populares