2

node.js で gmail 用の単純な POP3 クライアントを作成しようとしています。私は最初に、POP3 コマンドを入力するとサーバーに送信され、サーバーが応答するというものを書きました。次のコマンドを入力する前にサーバーの応答を待つことができるため、これは正常に機能します。

しかし、プログラム自体がコマンドを送信し、それ自体の応答を待つ自動化された会話を作成したいと考えています。単に行う:

stream.write('USER ***&@gmail.com');
stream.write('PASS *****');
stream.write('LIST');

ノード内のストリームの非同期性のため、機能しません。次のメッセージを送信する前に、ストリームの「データ」イベントを待つ必要があります。そうしないと、何も起こりません。ということで、次のようにしてみました。

var tls =require ('tls');

var stream = tls.connect(995,'pop.gmail.com', function() {
    console.log ('Conexion establecida');
});

stream.on('data', function(data)
{
    var str = data.toString();
    console.log(str.substr(0,14));
    if(str.substr(0,14)=="+OK Gpop ready")
    {
        console.log('Sending username...');
        process.nextTick(function() {
            stream.write ('USER ***********@gmail.com');
        });
    }

    if(str.substr(0,14)=="+OK send PASS")
    {
        console.log('Recieving list of email...');
        process.nextTick(function(){
            stream.write('PASS *********');
        });
    }
});

「データ」イベント リスナーは、最後に受信した応答に応じて次のコマンドの送信を処理するという考え方です。ここでも、stream.write だけを実行してもうまくいかないようだったので、write() 呼び出しを process.nextTick() 呼び出しでラップしました。USER コマンドは送信されているようですが、PASS コマンドは送信されていません。誰かが理由を教えてもらえますか? または、これを行うためのより効果的な方法がある場合は? 情報をありがとう。

4

2 に答える 2

0

すべてのコードを見ないと、答えるのは少し難しいです。

ただし、最初の例では、次のように書いていることに気付きました

stream.write('USER * &@gmail.com');

アンパサンド「&」付き

ただし、2 番目の例にはアンパサンドがありません。それが問題の原因でしょうか?

于 2013-10-20T13:01:47.143 に答える