2012-02-15 6 views
2

電子メールを送信するためにSMTPサーバーに接続するソケットがJavaであり、BufferedReaderWriterを使用してソケットに読み書きします。私の問題は、ソケットに書き込んだ後に呼び出されるwhile()ループをいつ終えるかを知ることです。ない場合は、サーバーからBufferedReaderを読むためのラインがちょうど代わりnullを返すのハングアップとしてすべての出力を読むときにJavaソケットがハングアップする

while(bufferedreader.readLine() != null) 

を使用することはできません。

+0

いつハングしますか? "QUIT"コマンドを送信したら?これは、サーバーが切断される唯一の瞬間だからです。別のコマンドを発行し、ソケットが閉じるまで読み取りを行うと、自動的にブロックされます。 – huelbois

+0

quitコマンドの後ではなく、電子メールの送信に必要な各行を記述した後です。 – Yawn

答えて

0

ストリームからメッセージSMTPを解析して、いつ停止するかを把握する必要があります。たとえば、完了したことを示すためにQUITメッセージをサーバーに送信し、221 Byeをキャッチする必要があります。

0

SMTPClientをプロジェクトから再作成しないことを強くお勧めします。

研究/教育の仕事をしていない限り、

+0

悲しいことに、それは教育的な目的のために私はこのルートを下ることができない:( – Yawn

0

"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 
2

readLine()を使用しないでください。これはそうではないかもしれません。これは、受信ストリームが終了しても行終了がないため、無期限にreadLine()をブロックします。

関連する問題