use strict; use warnings; use Qpsmtpd::Constants; use Qpsmtpd::DSN; use Net::LMTP; use Minion; sub register { my ($self, $qp) = (shift, shift); # some default values $self->{database} = $qp->config("queue_mysql_database") || "mail"; $self->{host} = $qp->config("queue_mysql_host") || "localhost"; $self->{port} = $qp->config("queue_mysql_port") || "3306"; $self->{user} = $qp->config("queue_mysql_user") || "qpsmtpd"; $self->{pass} = $qp->config("queue_mysql_password"); $self->createDSN(); } sub createDSN() { my $self = shift; my $dsn = "mysql://" . $self->{user} . ":" . $self->{pass} . "@" . $self->{host} . ":" . $self->{port} . "/" . $self->{database}; $self->{dsn} = $dsn; } sub hook_connect { my ($self, $transaction) = @_; $self->{minion} = Minion->new(mysql => $self->{dsn}); } sub hook_queue { my ($self, $transaction) = @_; my @notQueued; my $queue = $transaction->notes("queue") || {}; for my $rcpt (keys %{$queue}) { my $ret = $self->queue($transaction, $queue->{$rcpt}); if (!$ret) { push(@notQueued,$rcpt); } } return OK; } sub queue { my ($self, $transaction, $rcpt) = @_; my $data = {}; $data->{destination}=$rcpt; $data->{header}=$transaction->header->as_string; $data->{body}=$transaction->body_as_string; $self->{minion}->enqueue(transmit => [$data] => { attempts => 10, expire => 60*60*24*2, queue => $rcpt->{destination} }); }