Используйте node-imap для получения электронной почты - PullRequest
0 голосов
/ 29 декабря 2018

Здесь находится модуль retrieve_email.js, который подключается к моей учетной записи Gmail и загружает письма UNSEEN после определенной даты.Код в значительной степени скопирован с примера модуля [imap] 1 .

const Imap = require('imap');
const inspect = require('util').inspect;
const simpleParser = require('mailparser').simpleParser;

const imap = new Imap({
  user: 'mygmail@gmail.com',
  password: 'mypassword',
  host: 'imap.gmail.com',
  port: 993,
  tls: true
});

function openInbox(callback) {
    imap.openBox('INBOX', true, callback);
};

async function parse_email(body) {
  let parsed = simpleParser(body);
  ...............
};

module.exports = function() {
  imap.once('ready', function() {
    openInbox(function(err, box) {
      if (error) throw err;

      imap.search(['UNSEEN', ['SINCE', 'May 20, 2018']], function(err, results){
        if (err) throw err;
        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) {
            if (info.which === 'TEXT')
              console.log(prefix + 'Body [%s] found, %d total bytes', inspect(info.which), info.size);
              var buffer = '', count = 0;
              stream.on('data', function(chunk) {
                count += chunk.length;
                buffer += chunk.toString('utf8');
                parse_email(buffer);
                if (info.which === 'TEXT')
                  console.log(prefix + 'Body [%s] (%d/%d)', inspect(info.which), count, info.size);
              });
              stream.once('end', function() {
                if (info.which !== 'TEXT')
                  console.log(prefix + 'Parsed header: %s', inspect(Imap.parseHeader(buffer)));
                else
                  console.log(prefix + 'Body [%s] Finished', inspect(info.which));
              });
          });
          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.end();
        });

      });
    });
  });

  imap.once('error', function(err) {
    console.log(err);
  });

  imap.once('end', function() {
    console.log('Connection ended');
  });

  imap.connect();
};

Когда модуль вызывается в index.js, в отладке я вижу, что код сканируется сверху вниз, а последняя строка кода сканируется imap.connect(), а затем возвращается к следующейстрока в index.js, без подключения к учетной записи Gmail и без действий по получению электронных писем.Что не так с кодом выше?

ОБНОВЛЕНО: состояние после socket.connect() в отладке: enter image description here

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Обнаружена проблема с почтовым щитом Avast, когда посредник перехватывает трафик IMAP и вызывает сбой HTTPS.Также отладчик IDE останавливается где-то, чтобы поддерживать соединение активным, но не готовым.Вот деталь решения .

0 голосов
/ 02 января 2019

Посмотрите, это ссылка на API Gmail от Google.На этой странице есть пример того, как подключиться к нему с помощью Node.js.

https://developers.google.com/gmail/api/quickstart/nodejs

А вот пример из тех же документов, которые показывают вам, как искать и получатьсписок сообщений с использованием параметра q:

https://developers.google.com/gmail/api/v1/reference/users/messages/list

PS В моем комментарии я просто спрашивал вас, уверены ли вы, что вы выполнили все другие настройки, необходимые для доступа к вашей учетной записи Gmail с помощьюкод, означающий создание приложения, авторизацию OAuth или, как вам кажется, авторизацию менее безопасного доступа к приложению, просто взгляните на ссылки, которые вы можете обнаружить, что что-то упустили.

И действительно ли вам это нужноиспользовать пакет IMAP ???

...