Enviar correos con PHPMailer en lotes y con pausas - Enviar emails con PHPmailer

Blog sobre Programacion y Enviar emails con PHPmailer en Argentina

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.

Visitar articulo completo sobre Enviar emails con PHPmailer

Comparte tu opinion o comenta

Cuenta tu opinion o amplia el contenido del articulo