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

QpsmtpdIpcDirqueue (last edited 2007-04-11 20:14:46 by 213-202-131-227)