仕事場のメールサーバが Office 365 に切り替わったのですが、なぜか SMTP だけ認証が効かなかったので状況を調査するための簡単なスクリプトを書いてみました。
昔は通信が平文だったので、SMTP のデバッグも telnet コマンドでイケましたが、今は TLS で暗号化されているのが標準という時代なので、openssl を使う必要が出てきます。今回は SMTP Auth の部分も必要だったので、なるべくマニュアル作業が少なくなるように Perl でスクリプトを書いてみました。
Perl はしばらく触れていなかったので、すっかり時代に取り残されてしまっている感じですが、標準のNet::SMTP ライブラリでもSMTP Auth とか、STARTSSL なんかに対応しているんですね。
smtpStartsslDebug.pl
#!/usr/bin/env perluse strict;use warnings;use utf8;use Net::SMTP 3.0;use Authen::SASL qw(Perl);my ($mailserver, $port, $user, $password) = @ARGV;my $smtp = Net::SMTP->new( $mailserver, Port => $port, Timeout => 10, Debug => 1,);die "ERROR: smtp connection failed.$!" if !defined $smtp;$smtp->starttls();$smtp->auth( $user, $password) or die "ERROR: Authentication failed.\n";$smtp->quit();
コマンドラインの引数として、サーバ名、ポート番号、ユーザー名、パスワードの4つを取ります。
実際に実行してみると、以下のような感じで接続の様子が表示されます。
# 実際のパスワード等についてはダミーに書き換えてあります。
$ perl smtpStartsslDebug.pl smtp.office365.com 587 user@example.jp 'password'Net::SMTP>>> Net::SMTP(3.11)Net::SMTP>>> Net::Cmd(3.11)Net::SMTP>>> Exporter(5.73)Net::SMTP>>> IO::Socket::IP(0.39)Net::SMTP>>> IO::Socket(1.39)Net::SMTP>>> IO::Handle(1.39)Net::SMTP=GLOB(0x2829750)<<< 220 TYAPR01CA0017.outlook.office365.com Microsoft ESMTP MAIL Service ready at Sun, 15 Jul 2018 12:41:09 +0000Net::SMTP=GLOB(0x2829750)>>> EHLO localhost.localdomainNet::SMTP=GLOB(0x2829750)<<< 250-TYAPR01CA0017.outlook.office365.com Hello [160.16.198.140]Net::SMTP=GLOB(0x2829750)<<< 250-SIZE 157286400Net::SMTP=GLOB(0x2829750)<<< 250-PIPELININGNet::SMTP=GLOB(0x2829750)<<< 250-DSNNet::SMTP=GLOB(0x2829750)<<< 250-ENHANCEDSTATUSCODESNet::SMTP=GLOB(0x2829750)<<< 250-STARTTLSNet::SMTP=GLOB(0x2829750)<<< 250-8BITMIMENet::SMTP=GLOB(0x2829750)<<< 250-BINARYMIMENet::SMTP=GLOB(0x2829750)<<< 250-CHUNKINGNet::SMTP=GLOB(0x2829750)<<< 250 SMTPUTF8Net::SMTP=GLOB(0x2829750)>>> STARTTLSNet::SMTP=GLOB(0x2829750)<<< 220 2.0.0 SMTP server readyNet::SMTP::_SSL=GLOB(0x2829750)>>> EHLO localhost.localdomainNet::SMTP::_SSL=GLOB(0x2829750)<<< 250-TYAPR01CA0017.outlook.office365.com Hello [160.16.198.140]Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-SIZE 157286400Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-PIPELININGNet::SMTP::_SSL=GLOB(0x2829750)<<< 250-DSNNet::SMTP::_SSL=GLOB(0x2829750)<<< 250-ENHANCEDSTATUSCODESNet::SMTP::_SSL=GLOB(0x2829750)<<< 250-AUTH LOGIN XOAUTH2Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-8BITMIMENet::SMTP::_SSL=GLOB(0x2829750)<<< 250-BINARYMIMENet::SMTP::_SSL=GLOB(0x2829750)<<< 250-CHUNKINGNet::SMTP::_SSL=GLOB(0x2829750)<<< 250 SMTPUTF8Net::SMTP::_SSL=GLOB(0x2829750)>>> AUTH LOGINNet::SMTP::_SSL=GLOB(0x2829750)<<< 334 VXNlcm5hbWU6Net::SMTP::_SSL=GLOB(0x2829750)<<< (decoded) Username:Net::SMTP::_SSL=GLOB(0x2829750)>>> (decoded) user@example.jpNet::SMTP::_SSL=GLOB(0x2829750)>>> ************************Net::SMTP::_SSL=GLOB(0x2829750)<<< 334 UGFzc3dvcmQ6Net::SMTP::_SSL=GLOB(0x2829750)<<< (decoded) Password:Net::SMTP::_SSL=GLOB(0x2829750)>>> (decoded) ********Net::SMTP::_SSL=GLOB(0x2829750)>>> ********************Net::SMTP::_SSL=GLOB(0x2829750)<<< 235 2.7.0 Authentication successful target host TYAPR01MB2608.jpnprd01.prod.outlook.comNet::SMTP::_SSL=GLOB(0x2829750)>>> QUITNet::SMTP::_SSL=GLOB(0x2829750)<<< 221 2.0.0 Service closing transmission channel