NAME

Mail::Decency::Policy::Cookbook - How to write a policy module

DESCRIPTION

This module contains a description on howto write a content filter module.

EXAMPLES

Hope this helps to understand what you can do. Have a look at the existing modules for more examples. Also look at Mail::Decency::Policy::Core for available methods.

SIMPLE EXAMPLE

package Mail::Decency::Policy::MyModule;

use Moose;
extends 'Mail::Decency::Policy::Core';

has some_key => ( is => 'rw', isa => 'Bool', default => 0 );

#
# The init method is kind of a new or BUILD method, which should
#   init all configurations from the YAML file
#
sub init {
    my ( $self ) = @_;
    
    # in YAML:
    #   ---
    #   some_key: 1
    $self->some_key( 1 )
        if $self->config->{ some_key };
}

#
# The handle method will be called by the ContentFilter server each time a new
#   mail is filtered
#

sub handle {
    my ( $self, $server, $attrs_ref ) = @_;
    
    # $attrs_ref is:
    #   {
    #       client_address    => '123.123.123.213',
    #       recipient_address => 'recipient@domain.tld',
    #       recipient_domain  => 'domain.tld',
    #       sender_address    => 'sender@domain.tld',
    #       sender_domain     => 'domain.tld',
    #   ...
    #   }
    #   see http://www.postfix.org/SMTPD_POLICY_README.html
    
    # add spam score (throws exception)
    $self->add_spam_score( -300,
        "Message for X-Decency-Detail header",
        "Reject message for SMTP REJECT"
    ) if $attrs_ref->{ client_address } eq '123.123.123.0';
    
    # go to a final state (throws exception)
    $self->go_final_state( OK => "Mail is accepted" )
        if $attrs_ref->{ recipient_domain } eq 'something.tld';
    $self->go_final_state( REJECT => "No, i dont want this" )
        if $attrs_ref->{ recipient_domain } eq 'lalala.tld';
    $self->go_final_state( 454 => "Please, try later" )
        if $attrs_ref->{ recipient_domain } eq 'yadda.tld';
    
    # access the datbaase
    my $data_ref = $self->database->get( schema => table => $search_ref );
    $data_ref->{ some_attrib } = time();
    $self->database->get( schema => table => $search_ref, $data_ref );
    
    # access the cache
    my $cached_ref = $self->cache->get( "cache-name" ) || { something => 1 };
    $cached_ref->{ something } ++;
    $self->cache->set( "cache-name" => $cached_ref );
    
    # set a flag for later evaluation (also in ContentFilter)
    $self->set_flag( 'bla' );
    $self->logger->info( "What can i say?" ) if $self->has_flag( "blub" );
    $self->del_flag( 'nada' ) if time() % 9999 = 33;
    
    # access session data
    warn "> CURRENT SPAM SCORE ". $self->session_data->spam_score. "\n";
}

INCLUDE MODULE

To include the module, simple add it in your contnet filter

YAML

In policy.yml ...

---

# ..

policy:
    - MyModule:
        some_key: 1
    - MyModule: /path/to/my-module.yml

PERL

my $policy = Mail::Decency::Policy->new(
    # ..
    policy => [
        { MyModule => { some_key => 1 } }
    ]
);

AUTHOR

Ulrich Kautz <uk@fortrabbit.de>

COPYRIGHT

Copyright (c) 2010 the "AUTHOR" as listed above

LICENCSE

This library is free software and may be distributed under the same terms as perl itself.