Foros del Web » Programando para Internet » PHP »

PHP OO Me replica el envia de correo

Estas en el tema de Me replica el envia de correo en el foro de PHP en Foros del Web. hola Tengo un script que envia correos mediante la funcion mail(). El problema que tengo es que al cabo de un tiempo de enviar los ...
  #1 (permalink)  
Antiguo 19/11/2019, 06:27
Avatar de teslas  
Fecha de Ingreso: febrero-2013
Ubicación: Barcelona
Mensajes: 106
Antigüedad: 11 años, 9 meses
Puntos: 1
Me replica el envia de correo

hola

Tengo un script que envia correos mediante la funcion mail().

El problema que tengo es que al cabo de un tiempo de enviar los correos, el navegador se bloquea, y parece ser que este puede ser el motivo por el que replican los correos, y los envia dos veces en el envio, y claro los usuarios reciben el correo por duplicado.

He estado mirando el codigo de envio y solo lo realiza una sola vez. Es más he puesto un break cuando envie el ultimo correo para salir del blucle.

Por lo que pienso que la solucion esta en que no se bloquee el navegador, y que el envio de correos disponga de mas tiempo de ejecucion para evitar el bloque del navegador.

Alguna sugerencia ??

Os dejo una parte del codigo del envio de los emails (el bucle de envio).



Código PHP:
$i=0;     
$email_count $count['tot']; //consulta del total de correos
 
WHILE($user mysql_fetch_array($email_list_results))
      {
        
$i++;
        
        
$tmp_message parseTags($_POST['content'], $user ['id'], $message"""");
        
$tmp_subject parseTags($_POST['content'], $user['id'], $subject"""");
         
         
//Email Headers for HTML
        
$headers "MIME-Version: 1.0\r\n";
        
$headers .= "Content-type: text/html; charset=UTF-8\r\n";             
        
$headers .= "From: $from";       
   
    
mail($user['email'], $tmp_subject,$tmp_message$headers);
             
 
         
      
        
flush();
        
set_time_limit(150); 
        
        if (
$i == $email_count
                { 
                 break();
                }        
        
      } 
  #2 (permalink)  
Antiguo 21/11/2019, 22:15
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Me replica el envia de correo

Es muy mala idea ejecutar una lista de correos desde el navegador, si no puedes configurarlo como una tarea programada, entonces busca la forma de hacerlo por lotes.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 22/11/2019, 17:50
Avatar de teslas  
Fecha de Ingreso: febrero-2013
Ubicación: Barcelona
Mensajes: 106
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Me replica el envia de correo

Hola Triby

Gracias por responder, el envio de correos lo efectuo bien, me puedes decir como se haria por 'lotes' ??

Y donde puedo tener ejemplos.

saludos
  #4 (permalink)  
Antiguo 24/11/2019, 10:14
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años, 6 meses
Puntos: 120
Respuesta: Me replica el envia de correo

Cita:
Iniciado por teslas Ver Mensaje
Hola Triby

Gracias por responder, el envio de correos lo efectuo bien, me puedes decir como se haria por 'lotes' ??

Y donde puedo tener ejemplos.

saludos
lo de enviar por lotes se refirio a que envies primero 20, luego abres otra url y envias otros 20 , asi hasta enviarlos todos, por que como lo estas haciendo se referia a que los servidores WEB tiene un limite preconfigurado, para evitar Procesos infinitos que consuman recursos del servidor y generalmente tiene una duracion de 30 segundos, pero a esto, muchos programadores en php se olvidan limpiar la memoria ram, y empiezan a acumular datos, , como consultas SQL infinitas, y son miles y miles de registros, que cuando las recorres y las procesas, van acumulandose, hasta que tu script empieze a consumir 30mb ,40mb, 128mb,256mb, y lo mismo el servidor al ver que esta sobrepasando su limite, Lo mata el proceso en el mejor de los casos.

----resumiendo, la forma correcta de tratar datos infinitos es que tengas un proceso por Lotes, por Ejemplo en tu TABLA MYSQL, puedes obtener solo los primeros 20 registros con ultima fecha y enviar tus emails, luego actualizar ese registro, y agregar a cada uno en un FIELD o campo, un dato como "enviado", y asi vuelves a ejecutar tu SCRIPT y volveras a obtener los 20, hasta el punto que tu base de datos no retorne nada.

y quien se ocupara de hacer ese Bucle de LOTE por LOTE, pues AJAX , y le puedes poner como condicional, si Ejecutas el AJAX, si Hay datos, la proxima vez, volvera a ejecutar el AJAX, y si no hay datos, entonces termina el BUcle

serial algo asi
Código Javascript:
Ver original
  1. function enviarEmails(){
  2.      $.get("http://tudominio.com/envio_email_lote.php")
  3.       .then(function(ay_datos){
  4.         ay_datos && enviarEmails();
  5. },function() {
  6.     alert("Termino el envio de Emails");
  7. });
  8. }
  9. //y aqui invocamos la funcion para que sea infinito hasta que la pagina de [B]envio_email_lote.php[/B] ya no retorne nada
  10. enviarEmails();
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9
  #5 (permalink)  
Antiguo 25/11/2019, 10:45
Avatar de teslas  
Fecha de Ingreso: febrero-2013
Ubicación: Barcelona
Mensajes: 106
Antigüedad: 11 años, 9 meses
Puntos: 1
Respuesta: Me replica el envia de correo

Gracias por esta amplia respuesta.

saludos

Etiquetas: duplicar, email.envio
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:39.