コマンドラインからGmailのSMTPを使ってメールを送信する

chakemiです。引き続きネットワークのお勉強です。 本日は、コマンドラインからGmailのSMTPサーバにログインしてメールを送信してみたいと思います。

SMTP(Simple Mail Transfer Protocol)はサーバークライアント間のSMTPセッション上でコマンド・応答をやり取りする、対話型のプロトコルでネットワークのお勉強にはもってこいです。

メールサーバを立ち上げた時なんかもtelnetを使用して動作確認したりします。 本日は手頃のメールサーバが無かったため、Gmailを利用してみました。

Gmailでは、こちらにあるようにクライアント側で TLS か SSL が必要となります。

なので、今回はCentOSでOpenSSLを利用しました。 また、SMTP認証に必要なbase64でエンコードした文字列をPHPで生成しときます。

1
2
3
4
<?php
$string = ("user@gmail.com\000user@gmail.com\000password");
echo base64_encode($string);
echo ("\n");

※ユーザー名がuser@gmail.com パスワードがpassword の時

では、opensslコマンドでs_clientオプションを使ってTLSでサーバと接続します。

1
2
3
4
5
6
7
[root@localhost ~]# openssl s_client -starttls smtp -crlf -connect smtp.gmail.com:587

CONNECTED(00000003)

~~省略~~

250 ENHANCEDSTATUSCODES

250で接続成功の応答が返ってきたら セッションの開始HELOコマンドを送信ですが、このコマンドは古いため、拡張コマンドであるEHLOコマンドを使用します。

1
2
3
4
5
6
7
EHLO localhost

250-mx.google.com at your service, [xxx.xxx.xxx.xxx]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH
250 ENHANCEDSTATUSCODES

返ってきた情報から、このサーバで利用できる拡張サービスがわかります。

ここでは、認証にauth plainを使用します。

1
2
3
AUTH PLAIN 先ほど生成したbase64文字列

235 2.7.0 Accepted

認証が成功したらAcceptedが返ってきます。 base64で生成した文字列に問題があると「デコードできない」や「認証失敗」といったメッセージが返ってきますので見直してください。

ここからは、通常のtelnetで接続したときを同様

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mail from:<user@gmail.com> ←送信者

250 2.1.0 OK s10sm320554pbq.13

rcpt to:<chakemi@hoge.com> ←宛先

250 2.1.5 OK s10sm320554pbq.13

data ←入力開始

354  Go ahead s10sm320554pbq.13

subject:test mail ←件名

this is test mail ←本文

. ←終端

250 2.0.0 OK 1329968743 s10sm320554pbq.13

quit ←セッション終了

221 2.0.0 closing connection s10sm320554pbq.13

無事、メールが届いていたら成功