2013-10-04 21 views
10

Düğüm-imap ile bir gmail hesabından yeni e-posta aldım. Yeni bir e-postayı bekleyen bir düğüm işçisini nasıl tutacağım ve cron işleri yerine hemen harekete geçmeliyim?node-imap nodejs ile yeni e-posta alın

Sayfayı her birkaç minuetle vurmaya devam etmek istemiyorum, bir çeşit js.

Burada şimdiye kadar

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(); 

cevap

2

Yani, teorik bunu yapmak IMAP IDLE komutunu kullanabilirsiniz benim kod.

Ancak, bazı şeyleri belirtmeye değer:

  1. IDLE sadece yeni mesajlar gelmiş söyleyecektir, bu o mesajlar
  2. Sana gönderebilir sanmıyorum ne olduğunu söylemeyeceğim IMAP boşta iken komutlar (arama komutları gibi), böylece iletileri bir şekilde toplamak için başka bir işlem oluşturmanız gerekebilir.

Başka (belki daha iyi) yolu için ön ucunda bazı JavaScript kullanmak ya sayfayı her dakika yenileyin ya da öylesine, veya öylesine bir AJAX isteği her dakika yapmak veya ve mesaj listesi kısmını yenilemek olacaktır sayfa. ("Daha iyisi" ile basitleştiriciyim. Daha önce IMAP IDLE uygulamalarını yaptım ve bu kodu sildiğim için bu kodu sildim.)

Bu yoklama, istemci tarafı veya sunucu tarafı için giderseniz, muhtemelen setInterval'a bakmak istiyorum. (Bu, genel olarak bir Javascript olayı olduğundan, müşteriye veya Düğüm spesifik değil, her yerde çalışır).

+2

Teşekkür ederiz! Daha iyi bir çözüm buldum Mail Listener kütüphanesi https://npmjs.org/package/mail-listener2 –

+0

jack Dre @ node version 0.10.11 kullanıyorum ama mail-listener2 çalışmıyor ... – silvesterprabu

+0

@silvesterprabu hala çalışmıyorsa github ile ilgili sorun –