Patch: qpsmtpd IPC::DirQueue support
This file allows qpsmtpd to deliver to IPC::DirQueue queues. Drop it into plugins/queue/ipc-dirqueue. Note that it requires IPC::DirQueue version 0.05 at least.
=head1 NAME
queue/ipc-dirqueue
=head1 DESCRIPTION
This plugin delivers mails to an IPC::DirQueue spool.
=head1 CONFIG
It takes one required parameter, the location of the queue directory.
This plugin supports grepping a note on the transaction called 'rcpt_regexp_note', using a regexp specified in the (optional) second parameter.
Note that IPC::DirQueue version 0.05 (currently unreleased, use SVN trunk) is
required to use this.
=cut
use IPC::DirQueue;
use strict;
use warnings;
sub register {
my ($self, $qp, @args) = @_;
my $grepfile;
if (@args > 0) {
($self->{_qdir}) = ($args[0] =~ m!([/\w\.]+)!);
$self->{_grep} = $args[1];
}
unless ($self->{_qdir}) {
$self->log(1, "WARNING: IPC::DirQueue queue directory not specified");
return 0;
}
$self->{_dq} = IPC::DirQueue->new({ dir => $self->{_qdir} });
$self->register_hook("queue", "queue_handler");
}
sub queue_handler {
my ($self, $transaction) = @_;
my $note = $transaction->notes("rcpt_regexp_note");
$note ||= '';
if ($self->{_grep}) {
if ($note !~ /$self->{_grep}/) {
return (DECLINED, "grep pattern did not match");
}
}
my $state = 0;
$transaction->body_resetpos;
my $ret = $self->{_dq}->enqueue_sub(sub {
if ($state++ == 0) {
return $transaction->header->as_string();
} else {
return $transaction->body_getline;
}
});
if (!$ret) {
$self->log(LOGWARN, "could not enqueue message: $!");
return(DECLINED, "queue error (close)");
} else {
return (OK, "Queued!");
}
}
