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
コマンドの入力
接続できたら、あとはTELNETの SMTP プロトコルと同じ
HELO
で挨拶して
AUTH LOGIN
で認証を開始する。
ユーザー名とパスワードは base64 でエンコード
認証に必要なユーザ名とパスワードをBase64符号化したものを使って認証する。
このために、手作業でbase64 でエンコードするんだけど、base64 エンコードはちょっとコツが。
printf username | base64 # ⇐printで改行なし
ターミナルでやる場合は改行に注意する
echo username | base64 # ⇐これだと改行もエンコードされちゃう
だから、echo を使う場合はこうする
echo -n username | base64 # ⇐ echo に -n をつけて改行なしでパイプに渡す
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