【PC】Android で Socketを使ったメール送信(2)
前回ざっとプログラムで示したように「メールを送信する」ということは、インターネットを通じて、SMTPサーバーというメール送信専門のサーバー君と会話、お願いして、メールを送ってもらうことだ。
たとえば「 sendmail 」みたいな1つのコマンドで送信できればいいのだが、あいにくそんな命令はない(笑) Socket というクラスを使って、インターネット経由で、サーバーと Connectionを確立して、会話を行う必要がある。かなり面倒くさい(笑)
手順としては、イラストにあるように、SMTPサーバーに接続、HELO(ハロー!こんにちわ!)と行ったら、250私はこれこれこういうものです、みたいな会話を続ける。目的は「メールを送信すること」。
めざせ送信!(笑)
最初に Android から SMTPサーバーに接続する。
Socket connection = null; BufferedReader reader = null; BufferedWriter writer = null; // サーバーに接続 connection = new Socket( smtphost,smtpport ); reader = new BufferedReader( new InputStreamReader( connection.getInputStream() ) ); writer = new BufferedWriter( new OutputStreamWriter( connection.getOutputStream(),"ISO2022JP" ) );
Socket型の connectionという名前のものが接続係。会話は全部、この接続係を通じて行う。readerおよび writer はその名の通り、接続係の「口」と「耳」。データを読み書きするもので、これがつまり、接続先のサーバーとの会話になる。これを宣言して用意する。
うまく接続できると、SMTPサーバーは「 220 」と言ってくる。
うまく接続できました、という意味で、接続トラブルがあると「 220 」以外を返してくる。
220って何だ!220以外って何だ!と思われた方は 一連のRFCという取り決めを読むと良い(本当は、メール送信するのなら規格書なので読むべきだが)ここが、わりとよくまとまっていて好感をもった。
String message = reader.readLine(); if ( !message.startsWith("220") ) return false;
reader =「耳」で聞いて、220 じゃなかったら、この関数を終了する。と書いてある。
220 だったら、その続きが実行される。
// HELOの送信 sendData( writer, "EHLO " + smtphost + "\r\n" ); message = reader.readLine(); if ( !message.startsWith("250") ) return false;
うまく接続できたので、まず最初に「 HELO(ハロー!)」と挨拶をする。
writer =「口」で「EHLO」ワープロと同じで改行してあげるため「\r\n」(CRLF)を送る。
HELO と言ってるのに EHLO はスペルミスではなく、SMTPもいろいろと拡張されたため今は「 HELO 」もサポートしてるけど「 EHLO 」を使う。ハロー!じゃなくエロー!(笑)どういうセンスなのでしょう。いろいろと都合があるのです・・・
すると、先ほどの接続時と同じ感じで、今度は「250」を返してくる。
reader =「耳」で聞いて 250じゃなかったら、終了。
・・・という感じで会話を繰り返す。
writer という「口」で命令して reader という「耳」で聞く。
エラーなら終了。OKなら続ける、ということを繰り返して メール送信完了まで続けていく。
この続きはまた次回に・・・・