PHP Foreach enviar email PHPMailer. En este tutorial vamos a prender en enviar múltiples emails usando PHPMailer y FOREACH. Además, los correos electrónicos serán obtenidos desde MySQL para tener como resultado un sistema dinámico y profesional.
¿Qué es y cómo usar PHPMailer en PHP?
PHPMailer es una biblioteca para enviar correos electrónicos muy importante y muy útil, recordemos que podemos enviar email con contenido HTML y personalizados muy fácilmente.
Generalmente, la función predeterminada de PHP mail() no funciona correctamente, entonces es necesario un PHPMailer. Se usa para enviar correo con PHP, HTML, Imágenes y Estilos personalizados.
Veamos los siguientes pasos para usar PHPMailer:
a) Descargue PHPMailer de GitHub
Debemos de descargar la última versión de esta biblioteca para un óptimo desempeño:
https://github.com/PHPMailer/PHPMailer/releases
b) Extraer la carpeta
Hay que descomprimir el paquete descargado y colocar solo la carpeta src en el directorio de su proyecto, la carpeta src contiene todos los archivos de clases necesarios de PHPMailer.
c) Crear el archivo PHPMailer.php
Para verificar la funcionalidad de envío de correo de PHPMailer, escriba el siguiente código y configure el correo y la contraseña. Además, la configuración de su servidor para correos salientes:
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'phpmailer/src/Exception.php'; require 'phpmailer/src/PHPMailer.php'; require 'phpmailer/src/SMTP.php'; //require 'vendor/autoload.php'; $mail = new PHPMailer(true); try { $mail->SMTPDebug = 2; $mail->isSMTP(); $mail->Host = 'smtp.gmail.com;'; $mail->SMTPAuth = true; $mail->Username = 'your-gmail-id'; $mail->Password = 'your-gmail-id-password'; $mail->SMTPSecure = 'tls'; $mail->Port = 587; $mail->setFrom('your-gmail-id', 'Name'); $mail->addAddress('client-gmail-id'); // where you want to send mail $mail->isHTML(true); $mail->Subject = 'Subject'; $mail->Body = 'HTML message body in <b>bold</b> '; $mail->AltBody = 'Body in plain text for non-HTML mail clients'; $mail->send(); echo "Mail has been sent successfully!"; } catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; } ?>
PHP Foreach enviar email PHPMailer
Para poder enviar múltiples correos es necesario usar un CICLO y en este caso el ciclo FOREACH será el elegido para crear un correo electrónico masivo de PHP. Por lo tanto, que envíe una copia diferente a las direcciones de correo electrónico almacenadas en MySQL y se dirija al cliente por su nombre en el asunto (Estimado, Michael, aquí está su correo electrónico).
¿Cuál sería la solución para enviar múltiples correos?
Podemos recuperar los nombres y correos electrónicos de la base de datos en variables al iterar el ciclo.
Si están tratando de enviar diferentes mensajes a diferentes usuarios. La solución seria trabajar con base de datos e iterar usando el ciclo foreach para enviar emails con PHPMailer.
¿Como enviar múltiples emails con FOREACH?
Mientras se recorre la misma instancia de correo, al principio de cada iteración se debe de declarar $mail -> ClearAllRecipients()
, para indicar al gestor que se trata de otro email y así sucesivamente. Veamos un ejemplo completo.
// settings $mail = new PHPMailer; $mail->isSMTP(); // Set mailer to use SMTP $mail->Host = 'xxx'; // Specify main and backup SMTP servers $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = 'xxx'; // SMTP username $mail->Password = 'xxx'; // SMTP password $mail->SMTPSecure = 'ssl'; // Enable TLS encryption, `ssl` also accepted $mail->Port = 465; $mail->CharSet = "UTF-8"; // TCP port to connect to function sendInvoice($mail, $addresses) { foreach($addresses as $recipient) { $mail->ClearAllRecipients(); $mail->setFrom('mail@domain.eu', 'My Server'); $mail->addAddress($recipient['email'], $recipient['name']); // Add a recipient $mail->addReplyTo('mail@domain.eu', 'My Server'); $mail->isHTML(true); $mail->Subject = $recipient[subject]; //$mail->Body = $message; $mail->MsgHTML($recipient[message]); if (! $mail->send()) { echo 'Message could not be sent.'; echo 'Mailer Error: ' . $mail->ErrorInfo; } else { //echo 'Message has been sent'; } } }
Enviar múltiple email con ciclo WHILE
Si desea enviar por el ciclo WHILE, primero debe contar sus filas de alguna manera para que no las vuelva a procesar. Además, AddAddress(); se usa para seguir agregando direcciones de correo electrónico al campo PARA:, por lo que debe llamar a ClearAllRecipients();
para reiniciar con un nuevo conjunto de destinatarios.
$customers_query = "SELECT customer_name, customer_email, customer_id FROM customers"; $customers = mysqli_query($customers_query); $count = mysqli_num_rows($customers); $result = mysqli_fetch_array($customers); $i = 0; if (!$customers) { $message = 'Error notice: ' . mysqli_error() . "\n"; $message .= 'Whole query: ' . $query; die($message); } require_once('class.phpmailer.php'); // create an instance while ($i < $count) { $email = mysqli_result($result,$i,"customer_email"); $name = mysqli_result($result,$i,"customers_name"); $id = mysqli_result($result,$i,"customer_id"); $mail = new PHPMailer(); //CODE PHPMAILER $mail->Body = "Dear ".$name.", welcome to MyWebsite. Your ID is: ".$id.". Enjoy your stay."; $mail->Send(); $mail->ClearAllRecipients(); $i++; }
Aquí les presento otro ejemplo para enviar múltiples emails con la biblioteca PHPMailer
<?php //Import the PHPMailer class into the global namespace use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; error_reporting(E_STRICT | E_ALL); date_default_timezone_set('Etc/UTC'); require 'vendor/autoload.php'; //Passing `true` enables PHPMailer exceptions $mail = new PHPMailer(true); $body = file_get_contents('contents.html'); $mail->isSMTP(); $mail->Host = 'smtp.example.com'; $mail->SMTPAuth = true; $mail->SMTPKeepAlive = true; //SMTP connection will not close after each email sent, reduces SMTP overhead $mail->Port = 25; $mail->Username = 'yourname@example.com'; $mail->Password = 'yourpassword'; $mail->setFrom('list@example.com', 'List manager'); $mail->addReplyTo('list@example.com', 'List manager'); $mail->Subject = 'PHPMailer Simple database mailing list test'; $mail->msgHTML($body); //msgHTML also sets AltBody, but if you want a custom one, set it afterwards $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; //Connect to the database and select the recipients from your mailing list that have not yet been sent to //You'll need to alter this to match your database $mysql = mysqli_connect('localhost', 'username', 'password'); mysqli_select_db($mysql, 'mydb'); $result = mysqli_query($mysql, 'SELECT full_name, email, photo FROM mailinglist WHERE sent = FALSE'); foreach ($result as $row) { try { $mail->addAddress($row['email'], $row['full_name']); } catch (Exception $e) { echo 'Invalid address skipped: ' . htmlspecialchars($row['email']) . '<br>'; continue; } if (!empty($row['photo'])) { //Assumes the image data is stored in the DB $mail->addStringAttachment($row['photo'], 'YourPhoto.jpg'); } try { $mail->send(); echo 'Message sent to :' . htmlspecialchars($row['full_name']) . ' (' . htmlspecialchars($row['email']) . ')<br>'; //Mark it as sent in the DB mysqli_query( $mysql, "UPDATE mailinglist SET sent = TRUE WHERE email = '" . mysqli_real_escape_string($mysql, $row['email']) . "'" ); } catch (Exception $e) { echo 'Mailer Error (' . htmlspecialchars($row['email']) . ') ' . $mail->ErrorInfo . '<br>'; //Reset the connection to abort sending this message //The loop will continue trying to send to the rest of the list $mail->getSMTPInstance()->reset(); } //Clear all addresses and attachments for the next iteration $mail->clearAddresses(); $mail->clearAttachments(); }
Enviar múltiple email con Foreach y MySQL y PDO
Aquí mostramos un ejemplo completo funcional de un sistema que enviar múltiples emails por rango de usuarios. es decir, si tu servidor permite en envío de 500 email por hora, podemos ajustando para que envíe a 450 email por hora en PHPMailer.
Podemos configurar el envío del rango de usuarios bajo el método GET o método POST según su preferencia.
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // Load Composer's autoloader require 'vendor/autoload.php'; include("db_conect.php"); if(!empty($_GET["inicio"]) and !empty($_GET["fin"])){ exit(); } $limit = filter_var($_GET["inicio"], FILTER_VALIDATE_INT); $offset = filter_var($_GET["fin"], FILTER_VALIDATE_INT); $stmt = $pdo->prepare("SELECT * FROM personas order by id asc LIMIT :limit, :offset"); $stmt->execute(['limit' => $limit, 'offset' => $offset]); //$stmt->execute(); $data = $stmt->fetchAll(); // and somewhere later: foreach ($data as $row) { $nombre = $row['nombre']; $email = $row['email']; $mail = new PHPMailer(true); try { //Server settings $mail->SMTPDebug = 0; $mail->isSMTP(); // Set mailer to use SMTP $mail->Host = 'xxxx.com'; // Specify main and backup SMTP servers $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = 'xxx@www.baulphp.com'; // SMTP username $mail->Password = 'xxxx'; // SMTP password $mail->SMTPSecure = 'tls';//PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption, `PHPMailer::ENCRYPTION_SMTPS` also accepted $mail->Port = 587; // TCP port to connect to $mail->setFrom('xxx@www.baulphp.com', 'No a la Guerra'); $mail->addAddress(''.$email.'', ''.$nombre.''); // Add a recipient // Content $mail->isHTML(true); // Set email format to HTML $mail->Subject = 'Ventas de Automoviles'; $email_template = 'contenido.html'; $message = file_get_contents($email_template); $message = str_replace('%nombre%', $nombre, $message); $mail->MsgHTML($message); $mail->send(); $mail->ClearAllRecipients(); sleep(5); //echo 'Message has been sent'; } catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; } }
Nota Importante
Generalmente al iterar por un ciclo PHPMailer suele haber errores para procesar los diversos emails desde la base de datos, para darle solución no olvidar de declarar esta variable $mail->ClearAllRecipients(); para que PHPMailer entienda de que se trata de otro email y también seria la solución.
Conclusión
En este articulo hemos aprendido a usar ciclo Foreach y while bajo el lenguaje PHP para enviar múltiples emails. Además, de recordarles descargar la última versión de la Biblioteca para un óptimo resultado.
Recordar, si están usando PHP v8 es recomendable descargar la versión de PHPMailer v6.6.0
Hemos visto lo sencillo que es iterar los nombres y emails de los usuarios a través de un ciclo.
Espero que esta breve explicación les ayude en sus proyectos web y no se olviden de compartir en las redes sociales para ayudar a más personas.