PHPMailer

Enviar varios emails usando PHPMAILER con PHP y Ajax

Enviar varios emails usando PHPMAILER con PHP y Ajax. La mayor parte del sitio web tiene la función de envío de correo electrónico como enviar correo electrónico único o correo electrónico masivo. Hemos utilizado SMTP para enviar correo masivo porque SMTP nos es la forma más sugerida de enviar correo electrónico desde localhost o servidor en línea.

Requisitos para utilizar PHPMAILER

  • Poseer una cuenta de correo electrónico de alojamiento web, su empresa de alojamiento proporcionará credenciales SMTP como nombre de usuario, contraseña, dirección del servidor saliente y entrante y número de puerto. Mediante el uso de esta información puede configurar estos detalles en la clase PHPMailer y luego después de que pueda enviar correo electrónico desde su script.
  • Caso contrario podemos usar SMTP de GMAIL
Enviar varios emails usando PHPMAILER con PHP y Ajax
Enviar varios emails usando PHPMAILER con PHP y Ajax

¿Qué es PHPMailer?

Es una clase creada específicamente para hacer dinamizar y darle sencillez cuando envías emails que tienen características complejas, además es bastante útil y potente cuando de correos electrónicos se trata. También, nos da la opción de enviar email con archivos adjuntos.

Es una clase de transferencia y creación de correo electrónico con todas las funciones para PHP. Sin embargo, nos permite realizar tareas complejas como:

  • Enviar mensajes de correo con ficheros adjuntos (attachments)
  • Los mensajes de correo se pueden enviar en formato HTML
  • Mas seguros porque requieren autentificación.

Enviar varios emails: Ventajas

Con PHPMailer se pueden enviar emails vía sendmail, PHP mail(), o con SMTP. Lo más recomendable es usando smtp por dos razones:

  • Con phpmailer se pueden usar varios servidores SMTP. Esto permite repartir la carga entre varias computadoras, con lo que se podrán enviar un mayor número de mensajes en un tiempo menor.
  • Además, los servidores SMTP permiten mensajes con múltiples (destinatarios), (Las direcciones que aparezcan en este campo recibirán el mensaje. Todos los destinatarios verán las direcciones que aparecen en la sección Cc), bcc’s (Las direcciones que aparezcan en el campo Bcc recibirán el mensaje. Sin embargo, ninguno de los destinatarios podrá ver las direcciones que fueron incluidas en la sección Bcc) y Reply-tos (direcciones de respuesta)

La función PHP mail() no funcionará en localhost. Así que para enviar correo electrónico único o masivo desde localhost en PHP lo podemos hacer con PHPMailer mediante el uso de Ajax JQuery. Así que podemos enviar correo electrónico único o masivo sin actualización o página web.

¿Por qué usar phpmailer?

Recordemos que PHP posee la función mail() para enviar correos electrónicos, pero esta función es limitada y no permite un envío personalizado como, por ejemplo: El envío de email con ficheros adjuntos, Formato HTML en el contenido.

PHPMailer nos da la posibilidad de realizar estas tareas y viene con estas características tan fascinantes, además puedes utilizar tu propio servidor SMTP, aunque éste requiera autenticación (nombre de usuario y contraseña de tu correo corporativo).

Nota: También se puede usar el motor de SMTP de Gmail

¿Cómo funciona el Script?

Si bien PHPMAILER es una script para enviar emails, en este artículo hemos creado una aplicación sencilla para enviar correo electrónico unitario o múltiple a nuestros clientes, afiliados, etc.  Por lo tanto, funciona con un solo clic.

Para lograr nuestro objetivo hemos utilizado JQuery con Ajax para llamar al PHPMAILER y envíe los correos. Sin embargo, como utilizamos jQuery y Ajax la página no se actualizará.

Cuando damos clic en el botón ENVIAR entonces recogerá el correo electrónico de casillas de verificación atributo de datos mediante el uso de JQuery y después de recoger datos enviará estos datos a la solicitud de Ajax y a través de la solicitud de Ajax se transferirá a script PHP .

Además, tenemos utilizar la clase PHPMailer con la configuración SMTP requerida y enviará correo electrónico.

Estructura del Script: Enviar varios emails

A) Base de datos

Para este ejemplo usaremos una base de datos llamada «clientes» y una tabla con nombre «tbl_clientes». pero ustedes pueden elegir cualquier otro nombre.

CREATE TABLE `tbl_clientes` (
`cliente_id` int(11) NOT NULL,
`cliente_nombre` varchar(300) COLLATE utf8mb4_unicode_ci NOT NULL,
`cliente_email` varchar(300) COLLATE utf8mb4_unicode_ci NOT NULL,
`cliente_fecha` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Tabla clientes';

INSERT INTO `tbl_clientes` (`cliente_id`, `cliente_nombre`, `cliente_email`, `cliente_fecha`) VALUES
(1, 'Jorge B. Flores', 'busines@www.baulphp.com', '2020-09-26 11:15:31'),
(2, 'Carlos J. Vicencio', 'cuenta@www.baulphp.com', '2020-09-26 11:15:45'),
(3, 'Maria Fey Cotrina', 'demo@www.baulphp.com', '2020-09-26 11:16:00'),
(4, 'Nelly H. Figueroa', 'service@www.baulphp.com', '2020-09-26 11:16:16'),
(5, 'Dante S. Leguia', 'dante@www.baulphp.com', '2020-09-26 11:16:48');

ALTER TABLE `tbl_clientes`
ADD PRIMARY KEY (`cliente_id`);

ALTER TABLE `tbl_clientes`
MODIFY `cliente_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;

B) Conexión MySQL con PDO

Usaremos un fichero llamado «db_conect.php» para realizar la conexión entre PHP y MySQL. sin embargo, usaremos PDO

<?php
//Conexion con el servidor MySQL usando PDO

$host = "localhost";
$dbname = "clientes";
$username = "root";
$password = "";

try {
// Cree un nuevo objeto PDO y guárdelo en la variable $ db
$db = new PDO("mysql:host={$host};dbname={$dbname}", $username, $password);
// Configure el modo de error en PDO para mostrar inmediatamente las excepciones cuando haya errores
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $exception){
die("Connection error: " . $exception->getMessage());
}
?>

C) Fichero index.php

Sera el archivo principal donde mostraremos los registros de una tabla en este caso tabla «clientes». Incluiremos un archivo de conexión, funciones jQuery Ajax, y una consulta SQL usando PDO.

Email enviado con PHP Ajax MySQL
Email enviado con PHP Ajax MySQL
<?php
// Incluimos el fichero de conexion
include_once("db_conect.php");

// Consulta para lista clientes DB
$query = "SELECT * FROM tbl_clientes ORDER BY cliente_id";
$statement = $db->prepare($query);
$statement->execute();
$result = $statement->fetchAll();

?>
<!DOCTYPE html>
<html>
<head>
<title>Enviar varios email usando PHPMAILER con PHP y Ajax</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<br />
<div class="container">
<h3 align="left">Enviar varios email usando PHPMAILER con PHP y Ajax</h3>
<br />
<div class="table-responsive">
<table class="table table-bordered table-striped">
<tr>
<th>Nombre clientes</th>
<th>Email</th>
<th>Fecha Registro</th>
<th>Selección</th>
<th>Acción</th>
</tr>
<?php
$count = 0;
foreach($result as $row)
{
$count = $count + 1;
echo '
<tr>
<td>'.$row["cliente_nombre"].'</td>
<td>'.$row["cliente_email"].'</td>
<td>'.$row["cliente_fecha"].'</td>
<td>
<input type="checkbox" name="single_select" class="single_select" data-email="'.$row["cliente_email"].'" data-name="'.$row["cliente_nombre"].'" />
</td>
<td>
<button type="button" name="email_button" class="btn btn-info btn-xs email_button" id="'.$count.'" data-email="'.$row["cliente_email"].'" data-name="'.$row["cliente_nombre"].'" data-action="single">Enviar</button>
</td>
</tr>
';
}
?>
<tr>
<td colspan="4"></td>
<td><button type="button" name="select_email" class="btn btn-info email_button" id="select_email" data-action="bulk">Enviar </button></td>
</tr>
</table>
</div>
</div>
</body>
</html>

<script>
$(document).ready(function(){
$('.email_button').click(function(){
$(this).attr('disabled', 'disabled');
var id = $(this).attr("id");
var action = $(this).data("action");
var email_data = [];
if(action == 'single')
{
email_data.push({
email: $(this).data("email"),
name: $(this).data("name")
});
}
else
{
$('.single_select').each(function(){
if($(this).prop("checked") == true)
{
email_data.push({
email: $(this).data("email"),
name: $(this).data('name')
});
}
});
}

$.ajax({
url:"enviar_mail.php",
method:"POST",
data:{email_data:email_data},
beforeSend:function(){
$('#'+id).html('Enviando...');
$('#'+id).addClass('btn-danger');
},
success:function(data){
if(data == 'ok')
{
$('#'+id).text('Enviado');
$('#'+id).removeClass('btn-danger');
$('#'+id).removeClass('btn-info');
$('#'+id).addClass('btn-success');
}
else
{
$('#'+id).text(data);
}
$('#'+id).attr('disabled', false);
}
})

});
});
</script>

D) Enviar Email

Fichero encargado de validar la autentificación y enviar el email a través del PHPMAILER

<?php
//Validacion y phpmailer configuración

if(isset($_POST['email_data']))
{
require 'class/class.phpmailer.php';
$output = '';
foreach($_POST['email_data'] as $row)
{
$mail = new PHPMailer;
$mail->IsSMTP();//Mailer to send message using SMTP
$mail->Host = 'mail.www.baulphp.com';//Sets the SMTP hosts of your Email hosting
$mail->Port = '587';//the default SMTP server port
$mail->SMTPAuth = true;//SMTP authentication. Utilizes the Username and Password variables
$mail->Username = 'info@www.baulphp.com';//SMTP username
$mail->Password = 'xxxxxx';//SMTP password
$mail->SMTPSecure = '';//Connection prefix. Options are "", "ssl" or "tls"
$mail->From = 'info@www.baulphp.com';//the From email address for the message
$mail->FromName = 'BaulPHP';//Sets the From name of the message
$mail->AddAddress($row["email"], $row["name"]); //Adds a "To" address
$mail->WordWrap = 50; //Sets word wrapping on the body of the message to a given number of characters
$mail->IsHTML(true); //Sets message type to HTML
$mail->Subject = 'Lorem ipsum dolor sit amet'; // Asunto del mensaje
//An HTML or plain text message body
$mail->Body = '
<p>Sed at odio sapien. Vivamus efficitur, nibh sit amet consequat suscipit, ante quam eleifend felis, mattis dignissim lectus ipsum eget lectus. Nullam aliquam tellus vitae nisi lobortis, in hendrerit metus facilisis. Donec iaculis viverra purus a efficitur. Maecenas dignissim finibus ultricies. Curabitur ultricies tempor mi ut malesuada. Morbi placerat neque blandit, volutpat felis et, tincidunt nisl.</p>
<p>In imperdiet congue sollicitudin. Quisque finibus, ipsum eget sagittis pellentesque, eros leo tempor ante, interdum mollis tortor diam ut nisl. Vivamus odio mi, congue eu ipsum vulputate, consequat hendrerit sapien. Aenean mauris nibh, ultrices accumsan ultricies eget, ultrices ut dui. Donec bibendum lectus a nibh interdum, vel condimentum eros auctor.</p>';

$mail->AltBody = '';
//Enviar un correo electrónico. Devuelve verdadero en caso de éxito o falso en caso de error
$result = $mail->Send();

if($result["code"] == '400')
{
$output .= html_entity_decode($result['full_error']);
}

}
if($output == '')
{
echo 'ok';
}
else
{
echo $output;
}
}

?>
Email enviado SMTP
Email enviado SMTP

CONCLUSIÓN

    • En esta breve explicación hemos aprendido lo que es PHPMAILER, las ventajas y su funcionamiento.
    • Además, recordemos que phpmailer puede enviar emails desde un servidor local «LOCALHOST«, eso sí usando la autentificación de un email corporativo a través de SMTP.
    • También hemos aprendido a enviar un email o varios de manera simultánea usando jQuery Ajax. Por otro lado, este método puede enviar correos con formatos HTML.

Espero que la explicación les ayude en sus proyectos en desarrollo.

Nestor Tapia

Bloggero, amante de la programación PHP, innovador y me fascina compartir información. Desde que conocí el entorno informatico y el internet me llamó la atención la programación, Por tal motivo he creado mi blog BAULPHP.COM para compartir mis experiencias con todos ustedes. ¡Gracias por leerme!.

4 comentarios

  1. Hola que tal quisiera agradecer tu aporte me sirvió bastante, quisiera una ayuda hice unas modificaciones para attachar un documento me funciona bastante bien, al enviar mas de 350 correos solo envía 120 y de ahi sale un error 500 quisiera saber como poder solucionarlo gracias.

  2. Hola Nestor,

    Una pequeña consulta, todo funciona de maravilla y es hermoso tu contenido, gracias por tus aportes.
    Lo que he notado es que no acepta caracteres especiales o acentos, me refiero a que a la hora de recibir el correo, no se mira bien palabras acentuadas o con simbolos de exclamacion. Hay una forma de hacer un encode_UFT8 o algo por el estilo para recibir el correo de forma impecable?

    Saludos cordiales,

    1. Hola Mainor
      Puedes usar estas lineas de código para controlar los caracteres especiales

      $subject = "Recuperar contraseña";
      $subject = utf8_decode($subject);
      $mail->Subject = $subject;
      
      $mail->isHTML(true);
      $mail->CharSet = 'UTF-8';
      

      Saludos cordiales

  3. Hola Nestor:
    Me parecio muy bueno tu tutorial, ahora bien… te hago la siguiente complicación:
    – Supongamos que hay una web http://www.ofertas.com de ofrecimiento de mercaderias, o de alquileres o de no se… vehículos
    – Dicha web, facilita la comunicación entre el comprador y el vendedor con un formulario de contacto, usando PHPMailer, el tema es que el remitente del mensaje, es la http://www.ofertas.com a travez de un email real…. correo@ofertas.com, el problema es que cuando el que publica, recibe la consulta del posible comprador (comprador@gmail.com) lo hace desde correo@ofertas.com y al dar clic en responder, deberia figurar vendedor@yahoo.com; como se soluciona eso, para que no sea tomado como suplantacion de identidad.
    Gracias…

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba