2013-10-04 7 views
10

gmailアカウントからnode-imapで新しいメールを取得しました。ノード・ワーカーが新しい電子メールを待っていて、cronジョブの代わりに即座に対応するにはどうしたらよいですか?node-imap nodejsで新しいメールを取得

私はいくつかのminuetsごとにページを打ち続けるつもりはない、種類のノード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を調べたいと思っています。 (これは一般的なJavaのものなので、クライアントやNode固有のものではないので、うまく動作します)。

+2

ありがとうございました!私はより良い解決策を見つけたメールリスナライブラリhttps://npmjs.org/package/mail-listener2 –

+0

ジャックDre @私はノードバージョン0.10.11を使用していますが、メールリスナー2は動作していません... – silvesterprabu

+0

@silvesterprabuまだ動作していない場合、githubで問題を解決してください。 –

関連する問題