2009/10/1 Alvaro Herrera <alvhe...@alvh.no-ip.org>: > Jaime Casanova escribió: >> 2009/7/2 Alvaro Herrera <alvhe...@alvh.no-ip.org>: >> > >> > El supuesto listener.c es el responsable de enviar el email. >> >> a todo esto, aun tienes ese codigo en algun lado? > > Ese código no servía para nada (estaba incompleto y como además estaba > en C, no era muy práctico), así que escribí uno en Perl, adjunto. Si > alguien quiere convertirlo en PHP, etc, bienvenido sea ... >
no lo he pasado a PHP pero le hice unas mejoras basandome en el ejemplo de http://search.cpan.org/dist/DBD-Pg/Pg.pm#pg_notifies ahora puede escuchar varios LISTEN y reaccionar a cada uno de nanera diferenciada (al menos eso haria si le hubiera agregado el if que pregunte por $name) -- Atentamente, Jaime Casanova Soporte y capacitación de PostgreSQL Asesoría y desarrollo de sistemas Guayaquil - Ecuador Cel. +59387171157
#!/usr/bin/perl # # Programa ejemplo para un "listener" de PostgreSQL, que funciona como un # daemon que está colgado esperando recibir notificaciones desde el servidor, # y cuando las recibe, examina el estado de una tabla para enviar emails. # use warnings; use strict; use DBI; use Net::SMTP; my $dbh = DBI->connect("dbi:Pg:dbname=mails host=127.0.0.1 port=54323", '', ''); my $sth1 = $dbh->prepare('SELECT email_id, destinatario, asunto, contenido FROM emails_por_enviar'); # Antes de dormir, verifica si hay algo que hacer determina_emails_por_enviar(); # Ahora entra en el ciclo infinito que queda esperando hasta que haya # algo que hacer. $dbh->do("LISTEN envia_email"); LISTENLOOP: { while (my $notify = $dbh->pg_notifies) { my ($name, $pid, $payload) = @$notify; determina_emails_por_enviar(); } $dbh->ping() or die qq{Ping failed!}; sleep(5); redo; } # Examina la tabla de emails encolados, e invoca la rutina send_email para # cada uno de ellos. Luego, borra de la tabla los emails que fueron enviados. sub determina_emails_por_enviar { my @ids; $dbh->begin_work(); $dbh->do('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE'); $sth1->execute(); while (my $h = $sth1->fetchrow_hashref) { send_email($h); # Guarda en un array el ID de cada email enviado. push @ids, $h->{email_id}; print "mail con id ".$h->{email_id}." enviado \n"; } if ($#ids >= 0) { # Esto parece extraño, pero el join/map lo único que hace es # poner un ? por cada elemento del array @ids. my $sth2 = $dbh->prepare( 'DELETE FROM emails_por_enviar WHERE email_id IN ('. (join ",", (map { "?" } @ids)) . ')'); $sth2->execute(@ids); } $dbh->commit; } # Hace el envío de email. sub send_email { my $opts = shift; print "enviando email a " . $opts->{destinatario} . "\n"; my $smtp = Net::SMTP->new('localhost'); $smtp->mail($ENV{USER}); $smtp->to($opts->{destinatario}); $smtp->data; $smtp->datasend("Subject: " . $opts->{asunto} . "\n"); $smtp->datasend("\n"); $smtp->datasend($opts->{contenido}); $smtp->dataend; $smtp->quit; }
-- TIP 3: Si encontraste la respuesta a tu problema, publícala, otros te lo agradecerán