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!");
>> }
>>     

Reply via email to