Foros del Web » Programando para Internet » PHP »

mail() dentro de for, envía mas de 60 veces al usuario

Estas en el tema de mail() dentro de for, envía mas de 60 veces al usuario en el foro de PHP en Foros del Web. Hola estimados colegas, estoy teniendo un problema que me tiene un poco preocupado, el hecho es que tengo un Newsletter que envía promociones a todos ...
  #1 (permalink)  
Antiguo 15/05/2012, 12:37
Avatar de Sensorium  
Fecha de Ingreso: julio-2007
Ubicación: Montevideo-Uruguay
Mensajes: 207
Antigüedad: 16 años, 9 meses
Puntos: 7
Exclamación mail() dentro de for, envía mas de 60 veces al usuario

Hola estimados colegas, estoy teniendo un problema que me tiene un poco preocupado, el hecho es que tengo un Newsletter que envía promociones a todos los usuarios de mi base de datos una vez al día.

Este Newsletter verifica por usuario, las preferencias de envío y compone el email de acuerdo a lo seleccionado por el User.

Lo hemos probado con 4 o 5 emails sin problema pero cuando los hacemos con toda la base de datos(4000), me envía los emails duplicados en cuestión de 1 por segundo a la misma persona, pude llegar a constatar que recibí 120 emails a la vez.

Intentamos en vez de enviar el email, generamos un archivo guardando un log como si fuese enviado y este guarda todos los usuarios sin duplicados, por eso descartamos el script.


El codigo es algo similar a esto:

Código PHP:
foreach( $users as $u ):
            
$html_ofertas = array();
            
#
            
if( !empty($u->email)):
                
$userCats =  explode(","$u->preferer_cat_ids);
            
                foreach(  
$this->currentDeals as $cupon ):
                    
                    if( 
in_array$cupon->catg_id$userCats ) ):
                        
$html_ofertas[] = $this->htmlOferta($cupon);
                    endif;
                    
                endforeach;
                
                if( 
count$html_ofertas ) ):
                    
$message $this->htmlHeader(  ) . implode('',$html_ofertas) . $this->htmlFotter($u);
                    
$this->sendEmailToUser($u$message);
                endif;
                
            endif;
            
        endforeach;


   private function 
sendEmailToUser$user$message ){
        
$from            "Mi Empresa <[email protected]>";
        
$headers         "From: $from\r\n";
        
$headers        .= "Content-type: text/html\r\n";
        
$email_subject   "Tus ofertas para hoy";
        
mail($user->email$email_subject$message$headers); 
    } 
Se agradece cualquier ayuda!
__________________
Artis
  #2 (permalink)  
Antiguo 15/05/2012, 12:41
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: mail() dentro de for, envía mas de 60 veces al usuario

Quizá se estén ejecutando varias instancias de tu script al mismo tiempo. De no ser el caso, verificaría la lista de emails. A simple vista no noto nada raro.
  #3 (permalink)  
Antiguo 15/05/2012, 12:42
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: mail() dentro de for, envía mas de 60 veces al usuario

Lo olvidaba. Te sugiero generar un numero al azar (random) y crear un archivo con el nombre del numero aleatorio, de esa forma podrías verificar si se ejecutó en múltiples instancias.
  #4 (permalink)  
Antiguo 15/05/2012, 12:55
Avatar de Sensorium  
Fecha de Ingreso: julio-2007
Ubicación: Montevideo-Uruguay
Mensajes: 207
Antigüedad: 16 años, 9 meses
Puntos: 7
Respuesta: mail() dentro de for, envía mas de 60 veces al usuario

ocp001a, Muchas gracias por contestar tan rápidamente, esta comunidad es grandiosa, siempre lo fue.

En cuanto a tus sugerencias, probamos las instancias de la class, como tú, también pensé en ese problema, pero la clase se instancia solo una vez, también probé generado un archivo que guardara el email del usuario cuando intentaba enviarlo y el resultado fue el esperado, es decir, sin emails repetidos.

Nuevamente, gracias.
__________________
Artis
  #5 (permalink)  
Antiguo 15/05/2012, 13:25
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: mail() dentro de for, envía mas de 60 veces al usuario

Supongo el problema tampoco es el que yo sospechaba, sin embargo no me refería a la instancia de la clase, si no del script. A mi me sucedió en algunas ocasiones, Suponiendo que tu script se llame enviaemails.php, a veces había varios enviaemails.php corriendo al mismo tiempo, cada uno instanciando una vez su clase.
  #6 (permalink)  
Antiguo 15/05/2012, 13:47
Avatar de Rodrhigo  
Fecha de Ingreso: septiembre-2011
Ubicación: Temuco-Valdivia-Osorno
Mensajes: 254
Antigüedad: 12 años, 7 meses
Puntos: 48
Respuesta: mail() dentro de for, envía mas de 60 veces al usuario

yo creo que en tu consulta SQL estas trayendo email duplicados
prueba agregar un DISTINCT despues del select...
ejemplo:
(select distinct email from correos where email is not null and email != "")

y esta linea podrias preguntarla en tu consulta.
if( !empty($u->email)):


y te pego una recomendacion que hacen en la pagina de php al querer enviar un email

Es importante indicar que la función mail() no es conveniente para grandes volúmenes de correo en bucle. Esta función abre y cierra un socket SMTP para cada correo, algo que no es muy eficiente.

Para enviar una gran cantidad de correo, ver los paquetes » PEAR::Mail y » PEAR::Mail_Queue.

Etiquetas: headers, mail()
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 18:14.