2013-10-04 7 views
10

Pobrałem nową wiadomość e-mail z konta Gmail z węzłem-imap. Jak sprawić, by pracownik węzła czekał na każdą nową wiadomość e-mail i podejmował natychmiastowe działanie zamiast zadań cron?Pobierz nową wiadomość e-mail z węzłem-imap nodejs

Nie chcę ciągle wyświetlać strony co kilka minut, w pewnym sensie pokonuję cel węzła js.

Oto mój kod tak daleko

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

Odpowiedz

2

Więc teoretycznie można użyć komendy IMAP IDLE to zrobić.

Jednak warto zauważyć kilka rzeczy:

  1. IDLE będzie po prostu powiedzieć, że nowe wiadomości dotarły, nie powie, co te wiadomości są
  2. I nie sądzę, że można wysłać polecenia (takie jak polecenia wyszukiwania), gdy IMAP pracuje na biegu jałowym, więc możesz potrzebować utworzyć inny proces, aby jakoś zebrać wiadomości.

Inną (może lepiej) sposobem byłoby użyć trochę Javascript na przednim końcu albo odśwież stronę co minutę lub tak, lub uczynić żądania AJAX co minutę lub tak i odświeżyć listę wiadomości część Strona. (Przez „lepsze” Znaczy prostszy. Robiłem IMAP IDLE implementacje przed i zwykle skończyło się na usunięcie tego kodu, ponieważ IDLE zasysane dla mnie.)

Jeśli pójdziesz do tego odpytywania, po stronie klienta lub po stronie serwera, prawdopodobnie chcesz zajrzeć do setInterval. (Ponieważ jest to ogólnie rzecz biorąc JavaScript, a nie klient lub węzeł, będzie działać wszędzie).

+2

Dziękujemy! Znalazłem lepsze rozwiązanie Mail Listener library https://npmjs.org/package/mail-listener2 –

+0

jack Dre @ używam wersji węzła 0.10.11, ale mail-listener2 nie działa ... – silvesterprabu

+0

@silvesterprabu można podnieść problem na githubie jeśli nadal nie działa –

Powiązane problemy