QPSMTPD-MailserverInterface/queue/lmtp

83 lines
2.1 KiB
Plaintext

use strict;
use warnings;
use Qpsmtpd::Constants;
use Qpsmtpd::DSN;
use Net::LMTP;
sub register {
my ($self, $qp) = (shift, shift);
$self->{lmtp_rcpt_based} = $qp->config("lmtp_rcpt_based") || 0;
$self->{lmtp_host} = $qp->config("lmtp_host");
$self->{lmtp_port} = $qp->config("lmtp_port") || 24;
$self->{qp}= $qp;
$self->{enabled} = 1;
if (!$self->{lmtp_rcpt_based} && !$self->{lmtp_host}) {
$self->{enabled} = 0;
$self->log(LOGERROR, "No LMTP host configured, disabling plugin\n");
return;
}
}
sub lmtp_transfer
{
my ($self, $transaction, $lmtp_host, $lmtp_port, $lmtp_user) = @_;
my $lmtp = Net::LMTP->new($lmtp_host, $lmtp_port);
$lmtp->hellp($self->{qp}->config("me"));
$lmtp->mail($transaction->sender->address);
$lmtp->recipient($lmtp_user);
$lmtp->data();
$lmtp->datasend($transaction->header->as_string);
$transaction->body_resetpos;
while (my $line = $transaction->body_getline) {
$lmtp->datasend($line)
or return DECLINED, "Unable to queue message ($!)";
}
$lmtp->dataend();
$lmtp->quit();
$self->log(LOGINFO, "finished queueing");
return OK;
return DECLINED;
}
sub hook_queue {
my ($self, $transaction) = @_;
return DECLINED unless $self->{enabled};
my $lmtp_host;
my $lmtp_port;
my $lmtp_user;
if ($self->{lmtp_rcpt_based})
{
my $queue = $transaction->notes("queue");
$queue =~ /^lmtp:\/\/(.*):(\d+)$/;
$lmtp_host=$1;
$lmtp_port=$2;
$lmtp_user = $transaction->notes("destination-user") || "";
}
else
{
$lmtp_host = $self->{lmtp_host};
$lmtp_port = $self->{lmtp_port};
$lmtp_user = $transaction->sender->address || "";
}
if (!$lmtp_user) {
$self->log(LOGERROR, "No sender address found for transaction.\n");
return DECLINED;
}
$self->log(LOGNOTICE,"forwarding mail to LMTP host: $lmtp_host:$lmtp_port\n");
return $self->lmtp_transfer($transaction, $lmtp_host, $lmtp_port, $lmtp_user);
}