★ The Tsuchinoko News 2 (つちのこ通信2) ★

重要な話から、どうでもいいことまで。ほとんど役に立たないことを書き連ねています。

【PC】Android で Socketを使ったメール送信(2)

f:id:tsuchinoko118:20120920143714p:image:left:w260前回ざっとプログラムで示したように「メールを送信する」ということは、インターネットを通じて、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なら続ける、ということを繰り返して メール送信完了まで続けていく。
この続きはまた次回に・・・・