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!"); } }