Foros del Web » Programando para Internet » PHP »

Dividir consulta MySQL para newsletter

Estas en el tema de Dividir consulta MySQL para newsletter en el foro de PHP en Foros del Web. Hola chic@s, Os cuento un poco el problema que tengo haber si sabeis como puedo hacerlo. He desarrollado un newsletter en php con apoyo de ...
  #1 (permalink)  
Antiguo 04/12/2008, 07:22
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Dividir consulta MySQL para newsletter

Hola chic@s,

Os cuento un poco el problema que tengo haber si sabeis como puedo hacerlo.

He desarrollado un newsletter en php con apoyo de MySQL, el programa usa la clase Swift Mailer y la opción que tiene esta para enviar newletter (http://www.swiftmailer.org/wikidocs/v3/sending/batch)

Lo que pasa es que cuando eran pocos no pasaba nada, lo enviaba sin problemas, el problema es que ahora que hay unos 3000 no me deja enviarles todos a la vez y se me bloquea el programa.
Mi duda es si hay alguna forma para poder dividir el enviarles de forma automática en varias veces, por ejemplo en grupos de 100 emails.

El código que uso es el siguiente:
Código PHP:
        //Incluimos la librería Swift
        
require_once "lib/Swift.php";
        require_once 
"lib/Swift/Connection/SMTP.php";
        
        
//Propiedades para enviar por SMTP
        
$smtp =& new Swift_Connection_SMTP("mail.dominio.com"587);
        
$smtp->setUsername("[email protected]");
        
$smtp->setpassword("contraseña");
         
        
//Propiedades de la clase
        
$swift =& new Swift($smtp);
 
        
$message =& new Swift_Message($asunto$cuerpo);
        
$message->setContentType("text/html");
        
        
//Creamos la lista de recepción
        
$recipients =& new Swift_RecipientList();
        
        
//Enviamos los emails
        
$resultadoemails mysql_query("SELECT email FROM newsletter"$conexion);
        while(
$newsletter mysql_fetch_array($resultadoemails)){
            
//Añadimos un destinatario
            
$recipients->addTo($newsletter['email']);
        }
        
        
//Otra forma de enviar el newsletter
        
$batch =& new Swift_BatchMailer($swift);
        
$batch->setMaxTries(2);
        
$batch->setMaxSuccessiveFailures(3);
        
        if (
$num_sent $batch->send($message$recipients, new Swift_Address("[email protected]""Nombre"))){
            echo 
"Enviado";
        }
        
        
//Desconectamos y vaciamos
        
$batch->flushFailedRecipients(); 
¿Alguien sabe como solucionarlo?

Muchas Gracias
  #2 (permalink)  
Antiguo 04/12/2008, 07:33
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: Dividir consulta MySQL para newsletter

La lógica que siempre he usado es la misma que usa un paginado normal.

O sea, paginas los resultados (en SELECT email FROM newsletter) y no hay mucho más. Podés en caso de ser necesario usar el uso de sleep + timestamps (hay hosts que te limitan X mails cada X tiempo).

En caso de estar en un crons es lo mismo, nada más que el paginado se autollamará yendo a la página siguiente hasta que no haya más páginas que mostrar.

Espero que te oriente.

Saludos.


Edit: También fijate de aplicar algún método de "cola de envío", aunque sea simple (un campo de "enviado"), para así, si se corta en el medio, podés retomar el envío sin reenviar los emails (where enviado = 0, y cada vez que envias haces un update de enviado = 1 where id = $usuario, y al paginar y no encontrar más resultados un nuevo update de enviado = 0 a toda la tabla.

Saludos nuevamente
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #3 (permalink)  
Antiguo 04/12/2008, 07:49
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: Dividir consulta MySQL para newsletter

Gracias por contestar nicolaspar.
El programa no se encuentra en ningún cron job, es un programa que ejecuto cuando quiero enviar el newsletter, lo de la cola de envío es lo que había pensado, lo que no encontraba es como poder hacer que se divida la consulta de 100 en 100 y que una vez que se hagan los 100 primeros que pase a los segundos, luego a los terceros, y así sucesivamente sin tener que pulsar siguiente todas las veces para que pase.

Muchas Gracias
  #4 (permalink)  
Antiguo 04/12/2008, 07:58
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: Dividir consulta MySQL para newsletter

Una vez que los tenés paginada la consulta, ese "salto" lo haces con JS (location.href = 'newsletters.php?pagina=<?=$pagina+1;?>) o mismo con PHP (un header('Location...).

Y el paginado es simple, si no sabes como resolverlo avisanos.

Saludos.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
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 23:07.