"while(bufferedreader.readLine()!= null)"は、ソケットからすべての行を読み込み、何か新しいものがポストされるまでハングアップするので、使用しないでください。
"QUIT"コマンドを除いては動作しません。これは、SMTPサーバーとのダイアログの他のフェーズでは、いくつかの行だけを読み込んでから別のコマンドなどを送る必要があります。
実行するsmtpコマンドのタイプによって、異なる回答が期待されます。基礎となるプロトコルを理解するには、SMTP RFC(2821 - http://www.ietf.org/rfc/rfc2821.txtのベース)を注意深く読まなければなりません。
基本的には、送信するコマンドのほとんどに結果コード付きの1行の回答が送られます。このコードは、何をすべきかを示します(行数を増やすか、次のコマンドにスキップします)。
例: 'HELO myserver'を送信すると、 '250 xxx'の回答が返されます(または失敗です)。
1行だけ読みます。
「EHLO myserver」を送信すると、より多くの回線が必要になります。停止条件を覚えていません。
など、など、など...
例えば、私の地元のEXIMに私は、それらの結果があります。
まず、サーバから1行を読んで、220
220 jm.localdomain ESMTP Exim 4.72 Wed, 15 Feb 2012 13:52:36 +0100
をチェック次に送信:
:
HELO localhost
は250を読んで確認してください210
250 jm.localdomain Hello me [127.0.0.1]
とreadLine()
ので、ソケットからのデータの読み取りが着信ストリームが行末を持つテキストファイルであることを前提としていたときにそう
MAIL FROM: [email protected]
250 OK
RCPT TO: [email protected]
250 Accepted
DATA
354 Enter message, ending with "." on a line by itself
Subject: how are you?
bla
bla
bla
.
250 OK id=1RxePi-00074k-Nv
QUIT
221 jm.localdomain closing connection
いつハングしますか? "QUIT"コマンドを送信したら?これは、サーバーが切断される唯一の瞬間だからです。別のコマンドを発行し、ソケットが閉じるまで読み取りを行うと、自動的にブロックされます。 – huelbois
quitコマンドの後ではなく、電子メールの送信に必要な各行を記述した後です。 – Yawn