MIME::Lite->send() to send an email, which until recently was using an SMTP server slated for decommissioning Real Soon Now. It was my job to convert it to Amazon SES, and I figured it would be easier to tell MIME::Lite to use SES's SMTP interface instead of importing the web side's full Perl library tree just for one module out of it.Ha ha! SES requires SSL, and neither MIME::Lite nor Net::SMTP have any idea about that. They were both written before the days of dependency injection, so I had to go to some length to achieve it. And now, I golfed it a bit for you:
package MyApp::Monkey::SMTPS;
use warnings;
use strict;
use parent 'IO::Socket::SSL';
# Substitute us for the vanilla INET socket
require Net::SMTP;
@Net::SMTP::ISA = map {
s/IO::Socket::INET/MyApp::Monkey::SMTPS/; $_
} @Net::SMTP::ISA;
our %INET_OPTS = qw(
PeerPort smtps(465)
SSL_version TLSv1
); # and more options, probably
# Override new() to provide SSL etc. parameters
sub new {
my ($cls, %opts) = @_;
$opts{$_} = $INET_OPTS{$_} foreach keys %INET_OPTS;
$cls->SUPER::new(%opts);
}
PeerPort overrides the default of smtp(25) built in to Net::SMTP; I needed a port where the whole connection is wrapped in SSL instead of using STARTTLS, and 465 is the one suitable choice of the three that SES-SMTP supports.The main caveat about this is that it breaks Net::SMTP for anyone else in-process who wants to send mail to a server that lacks a functional port 465. But as you may have guessed, that's not a problem for my script, today.
No comments:
Post a Comment