2013-10-20 4 views
2

나는 node.js에 Gmail 용 간단한 POP3 클라이언트를 쓰려고합니다. 나는 처음에 POP3 명령을 입력 한 곳에서 서버에 보낸 다음 서버가 응답합니다. 다음 명령을 입력하기 전에 서버의 응답을 기다릴 수 있기 때문에이 작동합니다.gmail 및 node.js와 POP3 대화

하지만 자동 대화를 만들고 싶습니다. 프로그램 자체에서 명령을 보내고 응답을 기다리고 있습니다. 단순히 다음을 수행하십시오.

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

노드의 스트림 비동기 특성으로 인해 작동하지 않습니다. 다음 메시지를 보내기 전에 스트림의 'data'이벤트를 기다려야합니다. 그렇지 않으면 아무것도 일어나지 않습니다. 그래서 다음과 같이 그것을 시도 :

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만으로는 작동하지 않는 것 같아서 process.nextTick() 호출에서 write() 호출을 래핑했습니다. USER 명령이 보내졌지만 PASS 명령은 보내지지 않은 것으로 보입니다. 누군가 왜 저에게 말할 수 있습니까? 아니면 더 효과적인 방법이 있다면? 어떤 정보에 감사드립니다.

+0

를 참고하시기 바랍니다 :'길이가 두 번째 매개 변수입니다 substr'. 당신은'13' 문자 만 받았지만'14'를 비교하고 있습니다. – WiredPrairie

+0

고마워요.하지만 고친 후에도 아무 것도 보내지지 않고 있습니다. – tutiplain

+0

'USER '를 보낸 후'-ERR bad command'를 시도했습니다. – WiredPrairie

답변

1

명령의 끝을 나타내는 줄 바꿈 문자가 없어 명령을 보내고 있지만 인식되지 않습니다. 명령의 끝에 개행 문자를 추가하면 제대로 작동합니다.

또한과 같이 큐를 구현하여 명령을 단순화 할 수 있습니다 :

var tls = require('tls'); 
var commands = []; 

commands.push('USER ***********@gmail.com\n'); 
commands.push('PASS *********\n'); 

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

stream.on('data', function (data) { 
    if (data.toString().indexOf('OK') > -1 && commands.length) { 
     stream.write(commands.shift()); 
    } 
}); 
+0

이것이 작동하지 않는 것 같습니다. 나는 무슨 일이 일어나고 있는지를 알기 위해 데이터 이벤트의 시작 부분에'console.log (data.toString())'를 추가했다. 첫 번째 메시지 (+ OK Gpop 준비 됨) 만 수신 중입니다. – tutiplain

+0

@ user1043793 답변을 업데이트했습니다. – levi

+0

고마워요! 나는 네가 말했듯이 새로운 라인 캐릭터를 놓치고 있었다. 이제 효과가 있습니다. – tutiplain

0

모든 코드를 보지 않고도 대답하기가 약간 어렵습니다.

그러나 나는 당신의 첫 번째 예제에서, 당신은

stream.write ('사용자 * & @ gmail.com'을) 쓰는 것으로 나타났습니다; 그 문제의 원인이 될 수 - 앰퍼샌드 "&는"

그러나 더 앰퍼샌드가없는 두 번째 예에서와

?

+0

앰퍼샌드는 오타였습니다. 나는 그것을 실제 예에서 사용하지 않고있다. – tutiplain