- Dovecot quota - check mailbox free space through Dovecot api before accepting mail
- Dovecot auth - authenticate through Dovecot api
- RCPT Database - *EXAMPLE* plugin to check if recipient is in database
- Remove headers - remove headers from outgoing emails due privacy or redundancy
Dovecot quota
Download
#!perl -w =head1 NAME check_dovecot_quota - dovecot quota integration for qpsmtpd =head1 DESCRIPTION Plugin that checks if the receiver mailbox have enough free space (quota) to deliver mail. If not, it will DENYSOFT after data input. =head1 CONFIG To enable quota plugin you have to add this to your Dovecot configuration: service quota-status { executable = quota-status -p postfix inet_listener { port = 13001 } } example communication between plugin and dovecot: > request=smtpd_access_policy sender=ahoj@omg.cz recipient=sh@isecure.cz size=100000 < OK =head1 AUTHOR Copyright (c) 2015 Stanislav Humplik (stanislav@analogic.cz) http://poste.io This plugin is free software; you can distribute it and/or modify it under the terms of the General Public License v3. =cut use strict; use warnings; use Qpsmtpd::Constants; use Qpsmtpd::DSN; use DBI; use IO::Socket::INET; sub hook_data_post { my ($self, $transaction) = @_; return (DECLINED) if $self->is_immune(); # relay client or whitelist $self->log(LOGDEBUG, "starting quota status plugin"); my $username = ($transaction->recipients)[0]->address; my $sender = $transaction->sender->address; if(($transaction->recipients) > 1) { $self->log(LOGINFO, "pass, more recipients - will handle LDA"); return (DECLINED); # more recipients will handle LDA } my $socket = new IO::Socket::INET ( PeerHost => 'localhost', PeerPort => '13001', Proto => 'tcp', ); if(!$socket) { $self->log(LOGERROR, "connection error"); return (DECLINED, 'pass, quota connection error'); } my $req = "request=smtpd_access_policy\n"; $req .= "sender=" . $sender . "\n"; $req .= "recipient=" . $username . "\n"; $req .= "size=" . $transaction->data_size() . "\n"; $req .= "\n"; my $size = $socket->send($req); shutdown($socket, 1); my $line = ""; $socket->recv($line, 1024); $socket->close(); if ($line !~ /^action/) { $self->log(LOGERROR, "invalid response from quota-status: $line"); return (DECLINED); } $line =~ s/^\s+|\s+$//g; # trim if ($line =~ /OK/) { $self->log(LOGINFO, "ok, quota-status returned: $line"); return (DECLINED, 'quota ok'); } else { $self->log(LOGINFO, "quota-status returned: $line"); return (DENYSOFT, $line); } }