Foros del Web » Programando para Internet » PHP »

Envio de MUCHOS e-mails :)

Estas en el tema de Envio de MUCHOS e-mails :) en el foro de PHP en Foros del Web. Buenas a tod@s, Veréis estoy desarrollando una app web que tiene que realizar notificaciones por e-mail a una cantidad de usuarios de más de 3000... ...
  #1 (permalink)  
Antiguo 27/09/2006, 02:58
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Envio de MUCHOS e-mails :)

Buenas a tod@s,

Veréis estoy desarrollando una app web que tiene que realizar notificaciones por e-mail a una cantidad de usuarios de más de 3000...

Si la aplicación solo notificara a unos pocos el envio del e-mail lo podría hacer con PHP sin problema pero lo que se me plantea es el envio a 3000 o +...

Alguien podría indicarme como poder hacerlo? tal vez programando un servicio en linux que reciba como parámetro el contenido del e-mail y que el mismo se conecte a la bd y mande los e-mails a todos los usuarios?

A ver si me podéis echar un cable.

Gracias y un saludo.
__________________
www.pensandoenred.com
  #2 (permalink)  
Antiguo 27/09/2006, 03:48
 
Fecha de Ingreso: septiembre-2006
Mensajes: 59
Antigüedad: 17 años, 7 meses
Puntos: 0
Hola.

Efectivamente captura los email de los empleados
Código PHP:
select email from tablaempleados

while empleados <> fin

funcion mail
... 
Un saludo
  #3 (permalink)  
Antiguo 27/09/2006, 04:00
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
El problema no es como enviar e-mails a todos los empleados, el problmea es que cuando son unos cuantos... xD el server se queda frito, luego hay timeout... cosas de esas.

Quiero evitar el tener un php funcionando sin timeout, prefiero que se le de a un boton se envien a un proceso y listo. El problema es que estoy buscando la solución idónea...

Gracias por tu respuesta.
__________________
www.pensandoenred.com
  #4 (permalink)  
Antiguo 27/09/2006, 06:04
GPS
 
Fecha de Ingreso: diciembre-2003
Ubicación: Montevideo, Uruguay
Mensajes: 110
Antigüedad: 20 años, 4 meses
Puntos: 0
ME PARECE que hay un post parecido en el foro, donde la solución fue que los mails se envien dentro de una sentencia for, para que en lugar de enviarlos todos de una los mande en varias "tandas"
saludos
  #5 (permalink)  
Antiguo 27/09/2006, 10:48
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Ya tengo el problema resuelto :)

http://rfc.net/rfc2822.html
__________________
www.pensandoenred.com
  #6 (permalink)  
Antiguo 27/09/2006, 12:22
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
Podrías comentar un poco la solución que tomastes?

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 28/09/2006, 15:27
 
Fecha de Ingreso: abril-2004
Mensajes: 19
Antigüedad: 20 años
Puntos: 0
Hola MarioNunes, a mí también me interesa este tema.

¿Podrías explicar que solución has tomado?

Gracias!!
  #8 (permalink)  
Antiguo 02/10/2006, 04:52
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Segun la RFC de SMTP no hay limitación de BCC si están con un \r\n por cada uno que pongas. es decir:

$header.="Bcc: [email protected], \r\n";

De esta manera puedes poner los BCC que quieras sin limitación alguna, y así puedes enviar muchisimos mails, pero desde php solo envias uno, el resto de e-mails está gestionado por el servidor SMTP.

Lo que ocurre es que no puedes comprobar si has enviado los e-mails, por lo que he tomado la decisión de crear un fichero perl que envie los mails de 1 en 1.

Con la función exec() ejecuto el script perl enviandole como parámetro el cuerpo del mensaje y este script es el que se conecta a la BD y hace un listado de los usuarios y a posteriori envia de 1 en 1 los e-mails.

Si es necesário ya os publicaré el source del script.

Un saludo.
__________________
www.pensandoenred.com
  #9 (permalink)  
Antiguo 02/10/2006, 06:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
Con PHP también puedes enviar e-mails uno por uno con la función mail() (en un bucle tal cual lo haces en Perl).

También puedes usar envio de e-mail's directo por SMTP con classes como PHPMailer (http://phpmailer.sourceforge.net) la cual implementa métodos para añadir e-mails al BCC u otros. Enviar de este modo e-mails por SMTP directo puedes obtener algo mejor los mensajes de error en la conexión que no por mail() que no los recoge.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 02/10/2006, 07:51
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Es cierto Cluster,

Pero si tengo que enviar más de 3000mil e-mails... en un PHP es mucho más complicado.

El usuario de la aplicación tiene que esperar a que se termine el proceso de envío del PHP, el servidor tiene que tener el timeout sin limitaciones... vamos le veo pegas a este tipo de envios. Es más, en un principio lo tenía desarrollado en PHP pero al tener tal cantidad de usuarios pues como que no es muy viable...

Un cron tampoco me sería válido ya que la decisión de envío de e-mails lo hace el usuario y no el sistema...

Para quitarle rendimiento a la Web he decidido usar perl, pero vamos, lo tengo que testear con tal cantidad a ver si me vale, por ahora lo he probado con pocos usuarios y va bien.

Os mantendré informados ;)
__________________
www.pensandoenred.com
  #11 (permalink)  
Antiguo 02/10/2006, 08:43
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
PHP también lo puedes ejecutar en modo "CLI" (Comannd Line Interface) como haces con Perl.

PHP en modo CLI:
http://www.php.net/manual/en/features.commandline.php

También PHP tiene una interesante función para "registrar a otra función" y dejar ejecutando a tu script PHP lanzado por la "web" pero en "segundo plano":

register_shutdown_function()
http://www.php.net/register_shutdown_function

Esta función la uso para hacer un pequeño mailing también, .. el proceso lo lanza un usuario del sistema y le muestro la ventanita diciendo algo como "ya puede cerrar esta ventana si lo desea" .. La función mencionada no termina la ejecución del script si el cliente cancela la operación, además que lo libera al instante dejando corriendo el proceso en "segundo plano".

Por otro lado voy haciendo regitro (en una BBDD) del proceso de envio y si fuese necesario consultando esa BBDD que va "creciendo en datos" conforme envio e-mails .. podría ver como va el proceso "casi" en "tiempo real".

Con esto no esto diciendo que Perl no sea la mejor opción .. que seguro que lo es .. para este tipo de casos. Pero también expongo como PHP podría solventar ese detalle o podría hacerlo.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #12 (permalink)  
Antiguo 03/10/2006, 07:44
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Bueno,

Al final hice un script en PHP pero el problema que llegue a tener era que el script php cuando ejecutaba el perl, esperaba a que el perl terminara para continuar procesando el php...

Total:

exec("./script.pl > ficherolog &");

De esta manera el PHP no esperaba una respuesta del perl, y se quedaba ejecutando en segundo plano.

Entiendo que también podríamos haberlo hecho en PHP, ya que podríamos haber usado la siguiente sintaxis:

exec("perl fichero.php > ficherolog &");

Debería funcionar igual, ya que el fichro php sería ejecutado por el interprete de php que está en el path del sistema :)

Si alguien prueba lo del fichero PHP que nos avise, sería interesante, de esta manera no tendría porque utilizar PERL :P aunque cuando me vuelva a tocar hacer algo por el estilo lo probaré :)

Un saludo.
__________________
www.pensandoenred.com
  #13 (permalink)  
Antiguo 03/10/2006, 07:55
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
Otra solucion

Cita:
Iniciado por MarioNunes Ver Mensaje
Un cron tampoco me sería válido ya que la decisión de envío de e-mails lo hace el usuario y no el sistema...
Yo tuve mas o menos el mismo problema, y lo solucione con un cron.

Al poner a enviar los correos, lo que hacia realmente era insertar los datos del mail y los correos electronicos en una tabla de "pendientes", he hice un archivo php que buscara los mails que aun no se habian mandado con un cierto limite de registros (200), tambien hice que el cron llamara al archivo php cada cierto tiempo (30 min). De esta manera consegui que cada 30 minutos se enviaran 200 correos hasta que hubieran enviado todos.
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.

Última edición por oskarL; 03/10/2006 a las 08:02
  #14 (permalink)  
Antiguo 03/10/2006, 07:58
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Tenia pensado hacer eso, pero crei que era perder recursos, todo depende de la aplicación y si merece la pena, en mi caso el tener un cron era desperdiciar recursos de la maquina, ya que los e-mails no se enviaban entre unos plazos determinados... lo hace el usuario cuando le apetece :)

Pero gracias por tu respuesta.

Un saludo.
__________________
www.pensandoenred.com

Última edición por MarioNunes; 03/10/2006 a las 08:10
  #15 (permalink)  
Antiguo 03/10/2006, 08:49
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
Cita:
Iniciado por MarioNunes Ver Mensaje
Bueno,

Al final hice un script en PHP pero el problema que llegue a tener era que el script php cuando ejecutaba el perl, esperaba a que el perl terminara para continuar procesando el php...

Total:

exec("./script.pl > ficherolog &");

De esta manera el PHP no esperaba una respuesta del perl, y se quedaba ejecutando en segundo plano.

Entiendo que también podríamos haberlo hecho en PHP, ya que podríamos haber usado la siguiente sintaxis:

exec("perl fichero.php > ficherolog &");

Debería funcionar igual, ya que el fichro php sería ejecutado por el interprete de php que está en el path del sistema :)

Si alguien prueba lo del fichero PHP que nos avise, sería interesante, de esta manera no tendría porque utilizar PERL :P aunque cuando me vuelva a tocar hacer algo por el estilo lo probaré :)

Un saludo.
Y probastes todo lo que te mencioné en mi mensaje: #11

Ahí te menciono como ejecutar PHP en modo CLI .. y también como registrar tu proceso para que quede en "sengudo plano" (eso sí .. aunmentando con set_time_limit() el tiempo de ejecución de tu script).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #16 (permalink)  
Antiguo 03/10/2006, 09:32
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Buenas Cluster,

En este caso el aumentar el tiempo de ejecución del script de php no es viable... ya que no es nuestra máquina... aunque para ejecutar el perl... en fin, a ver como rinde esto...

Código PHP:
#!/usr/bin/perl -w
 
sub smtp {

      use 
Email::MIME::Creator;
      
my $To$FromName$FromMail$Bcc$Subject$msg_html ) = @_;

      
my @html $msg_html;

      
# mensaje multipart
      
my @parts = (
      
Email::MIME->create(
      
attributes => {
      
content_type => "text/html; charset=iso-8859-1",
      
encoding => "quoted-printable",
      },
      
body => "@html",
      ),
      );

      
# Declaramos al sender y adjuntamos los archivos a enviar
      
my $email Email::MIME->create(
      
header => [ From => "$FromName < $FromMail >" ],
      
parts => [ @parts ],
      );

      
# modificamos nuestro encabezado
      
$email->header_set"MIME-Version: 1.0\r\n" );
      
$email->header_set("Content-type: text/html; charset=iso-8859-1\r\n");
      
$email->header_set'X-PoweredBy' => 'v3.0' );
      
$email->header_setTo => "$To" );
      
$email->header_setBcc => "$Bcc" );
      
$email->header_setSubject => "$Subject" );

      
# modificaciones avanzadas, elegimos base64 o bien 7bit para aceptar multipart
      #$_->encoding_set( 'base64' ) for $email->parts;

      # Accesamos al binario de sendmail y enviamos los mensajes
      
open (MAIL"|/usr/sbin/sendmail -t") || die "No hay acceso al binario sendmail\n";
         
#open (MAIL, "|/usr/sbin/postfix") || die "No hay acceso al binario sendmail\n";
      
print MAIL $email->as_string

Para usar la función:

Código PHP:
&smtp($vTo$vFromName$vFromMail$vBcc$vSubject$vmsg_html ); 
__________________
www.pensandoenred.com
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 14:07.