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