Получайте новое письмо с помощью node -imap nodejs

Я получил новое письмо из учетной записи gmail с помощью node -imap. Как сохранить node -работник в ожидании нового письма и предпринять немедленные действия вместо заданий cron?

Я не хочу, чтобы нажимать на страницу каждые несколько минут, вид поражений цели node 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();

Ответ 1

Итак, теоретически вы можете использовать команду IMAP IDLE для этого.

Однако стоит отметить несколько вещей:

  • IDLE просто скажет вам, что появились новые сообщения, он не скажет вам, что это за сообщения
  • Я не думаю, что вы можете отправлять команды (например, команды поиска), когда IMAP работает на холостом ходу, поэтому вам может понадобиться создать другой процесс, чтобы как-то собрать сообщения.

Другим (возможно, лучшим) способом было бы использовать некоторый Javascript на лицевой стороне, чтобы обновлять страницу каждую минуту или так, или делать запрос AJAX каждую минуту или около того, и обновлять часть списка сообщений на странице. ( "Лучше" я имею в виду более простой. Я уже делал реализацию IMAP IDLE и обычно удалял этот код, потому что IDLE сосал для меня.)

Если вы заходите на этот опрос, на стороне клиента или на сервер, вы, вероятно, захотите изучить setInterval. (Так как это Javascript вообще, а не клиент или Node конкретный, он будет работать везде).