
=head1 NAME

postfix-queue

=head1 DESCRIPTION

This plugin passes mails on to the postfix cleanup daemon.

=head1 CONFIG

The first optional parameter is the location of the cleanup socket. If it does
not start with a ``/'', it is treated as a flag for cleanup (see below).
If set, the environment variable POSTFIXQUEUE overrides this setting.

All other parameters are flags for cleanup, no flags are enabled by default.
Known flags are:

=over 3

=item FLAG_FILTER

Set the CLEANUP_FLAG_FILTER for cleanup. This enables the use of 
I<header_filter>, I<body_filter> or I<content_filter> in postfix' main.cf.

=item FLAG_BCC_OK

Setting this flag enables (for example) the I<recipient_bcc_maps> parameter

=item FLAG_MAP_OK

This flag enables the use of other recipient mappings (e.g. 
I<virtual_alias_maps>) in postfix' cleanup.

=back

=cut

use Qpsmtpd::Postfix;

#
# postfix' cleanup flags:
use constant CLEANUP_FLAG_FILTER => (1 << 1);    # /* Enable content filter */
use constant CLEANUP_FLAG_BCC_OK => (1 << 4);    # /* Ok to add auto-BCC addresses */
use constant CLEANUP_FLAG_MAP_OK => (1 << 5);    # /* Ok to map addresses */

sub register {
    my ($self, $qp, @args) = @_;

    $self->{_queue_flags} = 0;
    if (@args > 0) {
        if ($args[0] =~ m#^/#) {
            $self->{_queue_socket} = shift @args;
        }
        else {
            $self->{_queue_socket} = "/var/spool/postfix/public/cleanup";
        }

        foreach (@args) {
            if ($_ eq 'FLAG_FILTER') {
                $self->{_queue_flags} |= CLEANUP_FLAG_FILTER;
            }
            elsif ($_ eq 'FLAG_BCC_OK') {
                $self->{_queue_flags} |= CLEANUP_FLAG_BCC_OK;
            }
            elsif ($_ eq 'FLAG_MAP_OK') {
                $self->{_queue_flags} |= CLEANUP_FLAG_MAP_OK;
            }

            else {
                $self->log(LOGWARN, "Ignoring unkown cleanup flag $_");
            }
        }
    }
    else {
        $self->{_queue_socket} = "/var/spool/postfix/public/cleanup";
    }

    $self->{_queue_socket} = $ENV{POSTFIXQUEUE} if $ENV{POSTFIXQUEUE};

}

sub hook_queue {
    my ($self, $transaction) = @_;
    $transaction->notes('postfix-queue-flags', $self->{_queue_flags});

# $self->log(LOGDEBUG, "queue-flags=".$transaction->notes('postfix-queue-flags'));
    my ($status, $qid, $reason) = Qpsmtpd::Postfix->inject_mail($transaction);
    $status and return (DECLINED, "Unable to queue message ($status, $reason)");

    my $msg_id = $transaction->header->get('Message-Id') || '';
    $msg_id =~ s/[\r\n].*//s;    # don't allow newlines in the Message-Id here
    return (OK, "Queued! $msg_id (Queue-Id: $qid)");
}

#vim: sw=2 ts=8
