I don't maintain a database handle throughout the transaction - instead I use the connection object to make notes as the SMTP transaction is completed.
e.g.
sub hook_helo
{
my ( $self, $transaction, $host ) = @_;
#
# Make sure helo includes a domain
#
if ( $host !~ /\./ )
{
$self->log( LOGWARN, "HELO $host doesn't contain a period." );
$transaction->notes( "reject", 1 );
$transaction->notes( "reason", "invalid helo" );
}
return DECLINED;
}
Then I have a series of plugins which do different things at the last step, either forward the message or reject it, but archive a searchable copy for the recipients benefit. Here's a simplified version of the reject + archive plugin:
sub hook_queue
{
my ( $self, $transaction ) = @_;
#
# We only log mails which have been rejected.
#
if ( 0 == ( $transaction->notes("reject") || 0 ) )
{
return DECLINED;
}
# connect to DB
# archive message
# disconnect
return ( DECLINED, "Rejected this is spam: " . $transaction-Notes
+("reason" ) );
}
(Actually this is a polite fiction. I actually archive messages to local disk, if they were to be rejected, then later rsync them to a central location - and import them to MySQL there.
|