The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Net::Server::Mail::ESMTP::SIZE;

use strict;
use base qw(Net::Server::Mail::ESMTP::Extension);
use vars qw($VERSION);
$VERSION     = '0.01';

sub init {
    my ($self, $parent) = @_;
    $self->{parent} = $parent;
    return $self;
}

sub reply {
    return (['DATA' =>  \&reply_mail_body], 
            ['MAIL' =>  \&reply_mail_from]);
}

sub option {
    return (['MAIL', 'SIZE' => \&option_mail_size]);
}

sub option_mail_size {
    my ($self, $command, $mail_from, $option, $value) = @_;

    if (lc($option) eq 'size'){
        if ($value <= $self->{'_size_extension'}){
            $self->{'_size_option_result'} = [ 200, 'OK' ];
	} else {
            $self->{'_size_option_result'} = [ '552', 'message size exceeds fixed maximium message size' ];
	}
    }
}

sub reply_mail_from {
    my ($self, $command, $last, $code, $message) = @_;

    if (defined ($self->{'_size_option_result'})){
        return @{ $self->{'_size_option_result'} };
    }
}

sub reply_mail_body {
    my ($self, $command, $last, $code, $message) = @_;
    if (length($self->{'_data'}) <= $self->{'_size_extension'}){
        return ($code, $message);
    } else { 
        return (552, 'Message too big!');
    }
}

sub keyword {
    return 'SIZE';
}

sub set_size {
    my ($self, $size) = @_;
    $self->{'_size_extension'} = $size;
}

*Net::Server::Mail::ESMTP::set_size  = \&set_size;

sub parameter {
    my ($self) = @_;
    return $self->{'parent'}->{'_size_extension'};
}

1;

#################### main pod documentation begin ###################

=head1 NAME

Net::Server::Mail::ESMTP::SIZE - add support for the SIZE ESMTP extension to Net::Server::Mail 

=head1 SYNOPSIS

    use Net::Server::Mail::ESMTP;

    my @local_domains = qw(example.com example.org);
    my $server = new IO::Socket::INET Listen => 1, LocalPort => 25;

    my $conn;
    while($conn = $server->accept)
    {
        my $esmtp = new Net::Server::Mail::ESMTP socket => $conn;
        # activate some extensions
        $esmtp->register('Net::Server::Mail::ESMTP::SIZE');
        $esmtp->set_size(10_000_000); #10 Milion bytes
        $esmtp->process();
        $conn->close()
    }

=head1 DESCRIPTION

Add the ESMTP SIZE extension to Net::Server::Mail::ESMTP. I stubbed this extension
when I wrote Test::SMTP and thought it would be nice to finish it off.

=head1 METHODS

=over

=item set_size($size)

Establishes the size threshold for rejecting messages.

=back

=head1 USAGE

Register the plugin in the ESMTP object, and then call set_size on the object instance

=head1 AUTHOR

    Jose Luis Martinez
    CPAN ID: JLMARTIN
    CAPSiDE
    jlmartinez@capside.com
    http://www.pplusdomain.net

=head1 COPYRIGHT

This program is free software; you can redistribute
it and/or modify it under the same terms as Perl itself.

The full text of the license can be found in the
LICENSE file included with this module.


=head1 SEE ALSO

Net::Server::Mail, Net::Server::Mail::ESMTP

=cut

#################### main pod documentation end ###################


1;