Re: New plugin: smtptls-forward

[email protected] (Jason Mills)
Newsgroups perl.qpsmtpd
Message-ID <[email protected]>
I could if you like... I yanked around the internal's quite a bit on my
version of the plugin.
But it would be possible I suppose to swap which Net::SMTP class it uses
based on parameters.

On 05/11/2010 09:26 PM, Robert Spier wrote:
> Is it possible to merge this into smtp-forward and have config
> options?  Or factor out common code into a shared module?
>
> Jason Mills wrote:
>   
>> =head1 NAME
>>
>> smtptls-forward
>>
>> =head1 DESCRIPTION
>>
>> This plugin forwards the mail via SMTP TLS to a specified server, rather than
>> delivering the email locally.
>>
>> This is very similar to the smtp-forward queue plugin. In fact it is just a
>> heavily modified version smtp-forward.
>>
>> =head1 DEPENDANCIES
>>
>> Currently L<Net::SMTP::TLS> is the only non-qpstmpd dependancy.
>>
>> =head1 CONFIG
>>
>> Configuration is mostly strait forward. Simply add it into your qpsmtpd config
>> root's plugins file in the form of:
>>
>>   queue/smtptls-forward <remote smtp server address> <username> <password>
>>
>> Or alternately:
>>
>>   queue/smtptls-forward <address> <port> <username> <password>
>>   
>> The end result should look something like this:
>>
>>   queue/smtptls-forward 10.2.2.2 emailguy s3cr3t
>>
>> Or maybe this:
>>
>>   queue/smtptls-forward smtp.othermailhost.com 587 emailguy s3cr3t
>>
>> =head1 REASONING
>>
>> This plugin is mostly useful for debugging and or testing local qpsmtpd although there is nothing to stop you from using this to deliver mail to
>> external addresses from your local machine. YMMV.
>>
>> =head1 CAVEATS
>>
>> Sadly the dependant TLS transport class L<Net::SMTP::TLS> has a few bugs which
>> prevent this plugin from having as much error reporting/correction as would
>> normally be desired. As of this writing it appears that L<Net::SMTP::TLS> is
>> without a loving maintainer (please see https://rt.cpan.org/Dist/Display.html?Name=Net-SMTP-TLS) which may in the
>> future motivate this programmer to either rewrite this plugin to use a
>> different TLS transport class or consult with the PAUSE authorities that be to
>> take up the mantle of maintainer for L<Net::SMTP::TLS>
>>
>> =cut
>>
>> use Net::SMTP::TLS;
>>
>> sub init {
>>   my ($self, $qp, @args) = @_;
>>
>>   if (@args > 0) {
>>     
>>     if ($args[0] =~ /^([\.\w_-]+)$/) {
>>       $self->{_smtp_server} = $1;
>>       shift(@args);
>>     } else {
>>       die "Bad data in smtp server: $args[0]";
>>     }
>>     
>>     $self->{_smtp_port} = 25;
>>     
>>     if (@args != 0 and $args[0] =~ /^(\d+)$/) {
>>       $self->{_smtp_port} = $1;
>>       shift(@args);
>>     }
>> 		
>>     die("smtptls-forward requires username and password config")
>>       unless @args == 2;
>> 		
>>     ($self->{_smtp_user}, $self->{_smtp_pass}) = @args;
>>
>>     $self->log(LOGWARN, "WARNING: Ignoring additional arguments.") if (@args > 2);
>>   
>>   } else {
>>     
>>     die("No SMTP server specified in smtp-forward config");
>>     
>>   }
>>
>> }
>>
>> sub hook_queue {
>>   my ($self, $transaction) = @_;
>>
>>   $self->log(
>>     LOGINFO,
>>     "forwarding to $self->{_smtp_server}:$self->{_smtp_port}"
>>   );
>>   
>>   my $smtp = Net::SMTP::TLS->new(
>>     $self->{_smtp_server},
>>     Port => $self->{_smtp_port},
>>     Timeout => 60,
>>     User => $self->{_smtp_user},
>>     Password => $self->{_smtp_pass},
>>     Hello => $self->qp->config("me"),
>>   );
>>   
>>   return (
>>     DECLINED,
>>     "Unable to queue message, failed to connect to smtp-tls server ($!)"
>>   ) unless $smtp;
>>   
>>   # NOTE: Net-SMTP-TLS isn't a drop in replacement for Net::SMTP
>>   # it seems to not return correctly
>>   # so in this case we are going to simply fire it off and
>>   # check $! for errors
>>   # At some point maybe someone will take up maintainership of this package
>>   # See: https://rt.cpan.org/Dist/Display.html?Name=Net-SMTP-TLS
>>   
>>   $smtp->mail( $transaction->sender->address );
>>   return(DECLINED, "Unable to queue message: smtp-tls ($!)") if $!;
>>   
>>   $smtp->to($_->address)
>>     foreach ($transaction->recipients);
>>   
>>   return(DECLINED, "Unable to queue message: smtp-tls ($!)") if $!;
>>   
>>   my $payload = $transaction->header->as_string;
>>   $payload .= $transaction->body_as_string;
>>   
>>   $smtp->data();
>>   $smtp->datasend($payload);
>>   $smtp->dataend();
>>   
>>   return(DECLINED, "Unable to queue message: smtp-tls ($!)") if $!;
>>   
>>   $smtp->quit();
>>     
>>   return(DECLINED, "Unable to queue message: smtp-tls ($!)") if $!;
>>   
>>   $self->log(LOGINFO, "finished queueing");
>>   
>>   return (OK, "Queued!");
>> }
>>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.