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

Responder a