使用imap和node获取所有未读电子邮件的列表,并记录电子邮件发件人和该电子邮件的主题

时间:2019-11-23 10:40:07

标签: javascript node.js gmail imap gmail-imap

我正在尝试使用imap和node从电子邮件中获取所有未读电子邮件,并记录电子邮件发件人和主题。我正在尝试运行以下代码:

var imap = new Imap({

    user: Email,
    password: Password,
    host: 'imap.gmail.com',
    port: 993,
    tls: true
});

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

openInbox(function(err, box) {
    if (err) throw err;
    var f = imap.seq.fetch(box.messages.total + ':*', { bodies: ['HEADER.FIELDS (FROM)','TEXT'] });
    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');
                    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();
    });
});

运行此代码时,出现以下错误:

Uncaught Error: Not authenticated
    at Connection.openBox

此错误是什么意思?我确保在要尝试访问的每个gmail帐户上启用“不安全的应用访问权限”。我会感谢任何人的帮助

1 个答案:

答案 0 :(得分:0)

假设您使用的是node-imap模块,那么您的调用方式不正确。

如果在建立连接之前尝试呼叫openBox,则会发生此错误。 (也就是说,您已连接并经过身份验证,并准备打开邮箱)。

您需要做两件事:

  1. 将顶级通话添加到imap.connect()
  2. 将您当前的大部分openInbox呼叫包装在对imap.once()的呼叫中,如下所示:
imap.once('ready', function() {
  openInbox(function(err, box) {
    ...
  });
});

我建议您在他们的文档中从the exact example开始,直到您确信它可以正确设置并可以正常工作,以便您可以将代码问题与gmail身份验证问题分开。

此外,如您所述,Gmail对于您如何使用低安全性应用程序还很善变。使用普通客户端来证明您已经启用了低安全性应用程序设置,或者已经进行了您需要做的任何解锁验证码等等,这可能是有道理的。请参见full list。特别是,您可能需要先在安全控制台中手动批准其中一种登录,然后才能开始工作。

FWIW,如果您已连接,但由于Gmail不喜欢登录而未进行身份验证时收到的错误有所不同,它看起来像这样:

{ Error: Please log in via your web browser: https://support.google.com/mail/accounts/answer/78754 (Failure)
    at Connection._resTagged (/.../lib/Connection.js:1502:11)
    at Parser.<anonymous> (/.../lib/Connection.js:194:10)
相关问题