2013-10-04 157 views
10

我使用node-imap從gmail帳戶檢索到新電子郵件。我如何讓節點工作人員等待任何新郵件並立即採取行動而不是cron作業?使用node-imap nodejs獲取新電子郵件

我不想每隔幾分鐘就打一次頁面,這種打敗了節點js的目的。

這裏是我到目前爲止的代碼

var Imap = require('imap'), 
inspect = require('util').inspect; 

var imap = new Imap({ 
    user: '[email protected]', 
    password: 'xxxx', 
    host: 'imap.gmail.com', 
    port: 993, 
    tls: true, 
    tlsOptions: { rejectUnauthorized: false } 
}); 

var fs = require('fs'), fileStream; 

function openInbox(cb) { 
    imap.openBox('INBOX', false, cb); 
} 

imap.once('ready', function() { 
    openInbox(function(err, box) { 
     if (err) throw err; 
     imap.search([ 'UNSEEN', ['SINCE', 'October 2, 2013'] ], function(err, results) { 
      if (err) { 
       console.log('you are already up to date'); 
      } 
      var f = imap.fetch(results, { bodies: '' }); 
      f.on('message', function(msg, seqno) { 
       console.log('Message #%d', seqno); 
       var prefix = '(#' + seqno + ') '; 
       msg.on('body', function(stream, info) { 
        console.log(prefix + 'Body'); 
        stream.pipe(fs.createWriteStream('msg-' + seqno + '-body.txt')); 
       }); 
       msg.once('attributes', function(attrs) { 
        console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8)); 
       }); 
       msg.once('end', function() { 
        console.log(prefix + 'Finished'); 
       }); 
      }); 
      f.once('error', function(err) { 
       console.log('Fetch error: ' + err); 
      }); 
      f.once('end', function() { 
       console.log('Done fetching all messages!'); 
      }); 
     }); 
    }); 
}); 



imap.connect(); 

回答

2

所以,理論上你可以使用IMAP IDLE命令來做到這一點。

然而,值得注意的幾件事情:

  1. IDLE只會讓你的新郵件已經到達,它不會告訴你這些消息是
  2. 我不認爲你可以發送命令(如搜索命令)在IMAP閒置時,所以您可能需要創建另一個進程來以某種方式收集消息。

另一個(可能更好)的方式是使用一些JavaScript的前端要麼刷新頁面每分鐘左右,使AJAX請求每分鐘左右,並刷新的消息列表部分這一頁。 (通過「更好」我的意思是更簡單,我之前完成了IMAP IDLE實現,並且通常最終刪除了該代碼,因爲IDLE吸了我。)

如果您確實要進行此輪詢,客戶端或服務器端,可能想看看setInterval。 (因爲這是一般的Javascript事情,而不是客戶端或節點特定的,它將工作無論如何)。

+2

謝謝!我發現了一個更好的解決方案Mail Listener library https://npmjs.org/package/mail-listener2 –

+0

jack dre @我使用節點版本0.10.11,但郵件監聽器2不工作... – silvesterprabu

+0

@silvesterprabu你可以提出一個問題在github上,如果它仍然不能正常工作 –