Webアプリケーションのステージング環境において、本番データの移行などを行った場合、
誤って本番ユーザーにメールが飛ばないようにしたいことがあります。
そこで、完全にメールが飛ばない設定にすると、
今度、メール認証が必要なフロー(例:会員登録)が確認できなくて、不便です。
そこで、全てのメールをリレーせずにフックして、
開発用のメーリングリストに投げる簡単なSMTPサーバーを書いてみました。
一時的にこのSMTPサーバーを使うようにすれば、
本番ユーザーにメールが飛ぶことはなく、
かつメーリングリストで開発者には届くので便利です。
メールの送信にはGMailを使っています。
#!/usr/bin/perl
use Carp;
use Net::SMTP;
use Net::SMTP::SSL;
use Net::SMTP::Server;
use Net::SMTP::Server::Client;
my $to = ‘mailing_list@example.com’;
my $gmail_account = ‘username’;
my $gmail_password = ‘password’;
my $server = new Net::SMTP::Server(‘localhost’, 25) ||
croak(“Unable to handle client connection: $!\n”);
while($conn = $server->accept()) {
my $client = new Net::SMTP::Server::Client($conn) ||
croak(“Unable to handle client connection: $!\n”);
$client->process || next;
my $smtp = Net::SMTP::SSL->new(‘smtp.gmail.com’, Port => ‘465’, Debug => 1);
if($smtp->auth($gmail_account, $gmail_password)){
$smtp->mail($client->{FROM});
$smtp->to($to);
$smtp->data();
$smtp->datasend($client->{MSG});
$smtp->dataend();
$smtp->quit;
}else{
print ‘SMTP Server Authentication Error!!’;
}
}