Foros del Web » Programando para Internet » PHP »

Como deberia hacerse esto?

Estas en el tema de Como deberia hacerse esto? en el foro de PHP en Foros del Web. Supongamos que existe una base de usuarios con mas de 10.000 registros. Si uno quisiera enviar un mensaje a todos los usuarios, y, logicamente, quisiera ...
  #1 (permalink)  
Antiguo 23/11/2002, 17:34
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Como deberia hacerse esto?

Supongamos que existe una base de usuarios con mas de 10.000 registros. Si uno quisiera enviar un mensaje a todos los usuarios, y, logicamente, quisiera mandar un solo mensaje con copias ocultas, cual seria la forma correcta de buscar los mails?

O sea, esta bien hacer un bucle de 10.000 vueltas para ir recolectando los mails que luego se usaran en el mensaje? O esto que digo es impensable porque talvez el bucle dure tanto que no se termine correctamente el proceso?

Cual seria la forma correcta de obtener un dato de TODOS los registros?
  #2 (permalink)  
Antiguo 23/11/2002, 18:01
 
Fecha de Ingreso: noviembre-2002
Mensajes: 9
Antigüedad: 15 años, 1 mes
Puntos: 0
Una solución?

Bueno, en cualquier caso, un bucle para mandar mail a 10000 usuarios de una tacada me parece excesivo, pero pienso que podría hacerse si el script ejecuta unas cuantas iteraciones, y luego se llama a sí mismo para empezar el bucle desde otro punto. Como es el servidor el que cancela la ejecución del script, si éste dura mucho, pero se testa el tiempo de ejecución de cada script por separado, es posible hacer el proceso por parte:


<?

//Obten n usuarios de lista siguientes
//...

//Manda n emails
//...

header ("location:estescript.php?valor_inicio_cuenta=" . ($valor_inicio_cuenta+n));
?>

Prueba esto, a ver si te funciona. Suerte!!!

Última edición por pachi; 23/11/2002 a las 18:17
  #3 (permalink)  
Antiguo 23/11/2002, 20:41
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Tienes dos opciones:

1) usas el bucle y generas un "TO: " para cada mail con el [email protected] del campo correspodiente de tu base de datos .. Esto le llevará un buen rato lo mas probable .. asi q podria darte problemas con el tiempo de ejecución maximo que se le otorga a cada script PHP (time-out). Eso lo puedes ajustar con la función:

Código PHP:
<?
set_time_limit
(0);
?>
Esta función es probable q esté desactivada en muchos hosting de pago y probable todos los gratuitos .. A "cero" esa funcion indica que "tarde lo que tarde en ejecutarse el script" .. como veras es peligroso .. podrias llegar a consumir todos los recursos del servidor y .. esto no te dejaran hacerlo en servicios de Hosting.

2) .. Obtienes todas las direcciones de e-mail en un gigantesto string (cadena) y se lo mandas (concatenadas con una , coma ) a un BCC: (como cabecera) ...

A todo esto .. si usas el bucle y quieres "dejarle respirar" a tu servidor de mail .. puedes usar la funcion:

sleep();

Eso retarda en segundos la ejecución del script .. y si lo usas en el bucle dejaras tiempo para q mail() envie ... Esta función debes usarla en conjunto con la de set_time_limit() ...

Con el Bucle aparte de personalizar el e-mail (o posibilidad de hacerlo) .. puedes tener control total de si una dirección no responde o no se pudo enviar el mail para .. utilizarlo como "flag" (bandera, estado) en alguna base de datos (campo) y determinar que e-mail se enviaron correctametne .. en consecuencia . tal vez actualizar tu lista de e-mails quitando esos mails muertos ...

La mejor manera de salir de dudas es "Probando" ..
  #4 (permalink)  
Antiguo 24/11/2002, 02:40
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Por lo que veo nadie tiene definida una "forma" de trabajar cuando se trata de esto...
Voy a probar, aunque todo a ojo porque no es mio el server.
  #5 (permalink)  
Antiguo 24/11/2002, 02:41
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Ha! gracias.
  #6 (permalink)  
Antiguo 24/11/2002, 09:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
El problema .. es mas bien quien usa mail() de PHP para enviar 10.000 mails ...

Yo envio pocos mails de una vez (no llegan a cientos) .. así que uso el métedo de Bucle y controlo todos los mails q se envian como describí ...

(teoria)
Si tubiera que enviar 10.000 mails .. no lo haria con mail() .. tal vez usaria conexión por sockets directa al SMTP o veria la forma mas directa de enviarle todas esas direcciones de mail al servidor de mail del sistema (SMTP) (aunque en el fondo, mail() de PHP hace eso mismo .. pero lo que no tenemos control es del proceso de envio de mail .. sino solo un "true" si fue bien o un "false" si fue mal pero sin detalle del error).. Tambien veria la forma de correr el script.php que haga este proceso en modo "shell" (consola, linea de comandos) .. No ejecutarlo via web (http://tal.tal/manada_mails.php) .. (por lo menos el scritp principal que realice en envio de mails .. ) de esta forma prodria trabajar en segundo plano .. dejando al servidor HTTP libre.

Un saludo,
  #7 (permalink)  
Antiguo 24/11/2002, 15:37
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Huy, pero yo no se nada de todo eso, de sokets y consolas, ni se lo que son... habra algun lugar de donde se pueda sacar info sobre eso?
  #8 (permalink)  
Antiguo 24/11/2002, 20:01
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 16 años
Puntos: 68
Zeus, realmente la manera más eficiente de mandar emails, es la de NO utilizar la función mail() de PHP, sino abrir un socket directamente al server SMTP (como lo haría cualquier cliente de email) y enviar las cabeceras correspondientes y luego el mensaje, así tantas veces como mensajs necesites enviar.

Porque NO utilizar la función mail() ? Por ineficiente, ya que esta función lo que hace es abrir una conexion con sendmail, enviar el mail, y cerrar la conexión. Si el bucle que haces para enviar mails, es más rápido que la capacidad de Sendmail de recibir envios ( y estate seguro que así será), entonces sendmail comienza a mantener una "cola de espera" de mensajes salientes. Cuanto esta cola llegue a su tamaño máximo (depende de cada linux), entonces no solo cancelará la ejecución de tu script, sino del sendmail mismo.

Yo todas las semanas, tengo que enviar un mailing a aproximadamente unas 250.000 personas, y lo que hago es lo siguiente:

1) Utilizo la clase de Herminio para enviar mails conectandote directamente a Sendmail, un poco modificada.
2) Evito que entre mail y mail se cierre la conexion porque toma bastante tiempo cerrar y abrir la conexión permanentemente.
3) envio 1 mail a 1 persona, con otras 199 en el BCC
4) "pagino" la ejecución del Script, enviando 20 mails, y luego volviendo a llamar el script, pero con los mails siguientes

En total, no tardo más de 6 minutos en hacer todos los envíos, y ahora salvo algún problema de server, nunca cancela la ejecución del Script.

Saludos.
  #9 (permalink)  
Antiguo 24/11/2002, 22:05
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Y yo que pensaba que ya estaba termiando

Decime WebStudio esa "clase" de Herminio (lo pogo entre comillas porque JAMAS supe lo que es una clase) se puede sacar de algun lado? Y la puede usar alguien que no entiende mucho, como yo?

Y una cosita mas, en el caso de envio de mails del tipo como el que hay en estos foros, que te llega un aviso de que alguien contesto, ahi tambien es mejor no usar mail()? O el problema es solo al ser miles al mismo tiempo? Y vos que haces, aunque se pueda con mail() ya usas esa clase para todo?

Gracias.
  #10 (permalink)  
Antiguo 24/11/2002, 22:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
La clase (classe, Objeto PHP) que se refiere Webstudio del usuario Herminio es:

http://www.forosdelweb.com/showthrea...threadid=73756

Tambien tienes otros objetos/funciones que te permiten conectar directament con el SMTP q uses para enviar mail:

http://phpclasses.websapp.com/browse.html/class/2.html

Al fin y al cabo .. la classe lo hace todo .. y tu solo tienes que hacer poco mas q "instanciar" la classe y usar sus "metodos" que usen tal cual lo harias con mail() y sus parametros ..

El problema está cuando quieres usar MIME para enviar imagenes incrustadas . .o incluso HTML y otras cabeceras .. En este caso .. la funcion o classe que uses deberá soportar esas opciones.

Ten en cuenta .. que al usar esas "classes" que conectan directo a un SMTP .. deberas usar un smtp.tal.tal que use su servicio de Hosting . o por lo menos la IP del mismo la cual te será pedida en alguna parte de la configuración de la classe/funcion ...

Un saludo,
  #11 (permalink)  
Antiguo 25/11/2002, 00:19
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Estoy super desalentado, trato de entender pero nada.
Y como es eso de no cerar la conexion con sendmail? No logro ver en que parte de la clase se cierra.

Y vuelvo a preguntar, estos foros, para los mensajes habituales, que usa?
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 21:21.