我正在尝试使用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帐户上启用“不安全的应用访问权限”。我会感谢任何人的帮助
答案 0 :(得分:0)
假设您使用的是node-imap模块,那么您的调用方式不正确。
如果在建立连接之前尝试呼叫openBox
,则会发生此错误。 (也就是说,您已连接并经过身份验证,并准备打开邮箱)。
您需要做两件事:
imap.connect()
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)