それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

SMTP の認証プロトコルを手作業で確認する - openssl/telnet を利用

smtpサーバーにtelnet でアクセスで、ログインを確認する

220 iemsa300501.mailsv.softbank.jp ESMTP server ready Thu, 12 Mar 2015 19:05:54 +0900
HELO
250 iemsa300501.mailsv.softbank.jp
AUTH LOGIN
334 VXNlcm5hbWU6
XXXXXXX==
334 UGFzc3dvcmQ6
XXXXXXXX==
235 Authentication successful
235 2.0.0 OK Authenticated
NOOP
250 2.0.0 OK
QUIT
DONE

AUTH には数種類ある。

AUTH PALIN
AUTH LOGIN
AUTH CRAM-MD5

一般的には、 AUTH LOGIN でいいんじゃないかと思うんですね。

サーバーへのつなぎ方 / smtps

openssl の s_client を使います。 いまどき、telnet でつなぐのもムリだろうし、SSL非対応のSMTPサーバーも珍しいので、殆どの場合 openssl で ポート 465/587 につなぐ。

starttls と smtps で若干差異がある。

smtps の場合

openssl s_client -connect smtp.softbank.jp:465

smtp starttls の場合

openssl s_client  -starttls smtp -crlf  -connect example.com:587

コマンドの入力

接続できたら、あとはTELNETSMTP プロトコルと同じ

HELO 

で挨拶して

AUTH LOGIN

で認証を開始する。

ユーザー名とパスワードは base64エンコード

認証に必要なユーザ名とパスワードをBase64符号化したものを使って認証する。

このために、手作業でbase64エンコードするんだけど、base64 エンコードはちょっとコツが。

printf username | base64 # ⇐printで改行なし

ターミナルでやる場合は改行に注意する

echo username | base64 # ⇐これだと改行もエンコードされちゃう

だから、echo を使う場合はこうする

echo -n  username | base64  # ⇐ echo に -n をつけて改行なしでパイプに渡す

パスワードも同様にBase64 エンコードしたものを使う。

AUTH LOGINの例

AUTH LOGIN #⇐入力
334 VXNlcm5hbWU6
XXXXXXX==                  #<-- ユーザ名のbase64
334 UGFzc3dvcmQ6
XXXXXXXX==                #<-- パスワードのbase64
235 Authentication successful

AUTH PLAIN の例

auth plain の場合は、"USERNAME\0USERNAME\0PASSWORD" の形式になる

これをコマンド作るのはちょっとコツが要る

echo -ne 'takuya_1st\0takuya_1st\0password' | base64

AUTH PLAIN用ログインの発行

つまりは、こういうことである。 ( -w0 は改行させないために追記 )

USER=test@example.com
PASS=xxxxxxx
echo -ne "${USER}\0${USER}\0${PASS}" | base64 -w0

このように \0 の NULL文字を入れてやる。

実際の結果がこちら

220 iemsa400501.mailsv.softbank.jp ESMTP server ready Thu, 12 Mar 2015 19:18:13 +0900
HELO #⇐入力
250 iemsa400501.mailsv.softbank.jp
AUTH PLAIN #⇐入力
334
zxL/kU4E0vlXXXXXN3eVljoA==  #<-- ユーザ名NULLユーザ名NULLパスワードのbase64
235 Authentication successful
421 iemsa400501.mailsv.softbank.jp Lost connection to [112.70.114.141]
read:errno=0

伏せ字の部分がBase64エンコードされたパスワードとユーザー名のペア

接続の維持

NOOP を送信したら必ずOKが返ってくる(詳しくは wikipediaのSMTPプロトコル などを参照する )

NOOP
250 2.0.0 OK

接続の終了

終了はQUITを送信する。 DONEが返ってくる。

QUIT
DONE

参考資料

SMTP認証 - bnote