imap.search 时 Node.js imap 库中出现错误的协议错误
Bad Protocol Error in Node.js imap libary when imap.search
我对 node.js(版本 8.9.1)库 imap 有疑问。如果我向函数发送请求
getMails: function (req, res) {
var body = req.body
, parser = new MailParser();
if(body.encryptedSecret !== undefined) {
User.findOne({"email": req.user.email}, function (err, user) {
var mailAccount = user.mailAccounts[0]
, imap = new Imap({
user: mailAccount.imap_user,
password: mailAccount.imap_pass,
host: mailAccount.imap_host,
port: mailAccount.imap_port,
tls: true
});
getMailsFromServer(parser, imap, res)
});
} else {
response.error(res, '400', '2-7')
}
}
我收到回复
{
"message": "error",
"internalErrrorCode": "2-9",
"data": {
"type": "bad",
"source": "protocol"
}
}
我的 getMailsFromServer 函数是:
imap.once('ready', function () {
imap.openBox('INBOX', true, function (err, box) {
if (err) throw err;
imap.search([ 'UNSEEN', ['SINCE', 'May 20, 2017'] ], function(err, results) {
var f = imap.seq.fetch(results, { bodies: '' });
f.on('message', function (msg, seqno) {
msg.on('body', function (stream, info) {
stream.on('data', function (chunk) {
parser.write(chunk.toString("utf8"));
})
})
msg.once('end', function () {
parser.end();
});
})
f.once('error', function (err) {
error = true
response.error(res, 500, '2-9', err)
});
f.once('end', function () {
if (!error) {
parser.on('data', function (data) {
response.success(res, data.html)
});
console.log('Done fetching all messages!');
imap.end();
}
});
})
})
})
如果我删除 imap.search 并将 var f = imap.seq.fetch(results
设置为例如 var f = imap.seq.fetch( box.messages.total + ':*'
,则请求有效。
您可以在 GitHub
上找到我完整的工作代码
谢谢,
为了你的帮助
对于搜索,日期必须采用特定格式,RFC 3501 对此进行了详细说明:
d-MON-YYYY
d
: 是表示月份日期的一位或两位数字
MON
: 是以下三个字母缩写之一:Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov、Dec
YYYY
: 是一个四位数的年份。
示例:2017 年 1 月 3 日、1998 年 3 月 1 日、2000 年 6 月 22 日。
我不太确定这一点,因为我不了解 node.js 和这个库,但您可能还必须将 [ 'UNSEEN', ['SINCE', 'May 20, 2017'] ]
折叠成一个数组;没有必要嵌套它们。 [ 'UNSEEN', 'SINCE', 'May 20, 2017']
我对 node.js(版本 8.9.1)库 imap 有疑问。如果我向函数发送请求
getMails: function (req, res) {
var body = req.body
, parser = new MailParser();
if(body.encryptedSecret !== undefined) {
User.findOne({"email": req.user.email}, function (err, user) {
var mailAccount = user.mailAccounts[0]
, imap = new Imap({
user: mailAccount.imap_user,
password: mailAccount.imap_pass,
host: mailAccount.imap_host,
port: mailAccount.imap_port,
tls: true
});
getMailsFromServer(parser, imap, res)
});
} else {
response.error(res, '400', '2-7')
}
}
我收到回复
{
"message": "error",
"internalErrrorCode": "2-9",
"data": {
"type": "bad",
"source": "protocol"
}
}
我的 getMailsFromServer 函数是:
imap.once('ready', function () {
imap.openBox('INBOX', true, function (err, box) {
if (err) throw err;
imap.search([ 'UNSEEN', ['SINCE', 'May 20, 2017'] ], function(err, results) {
var f = imap.seq.fetch(results, { bodies: '' });
f.on('message', function (msg, seqno) {
msg.on('body', function (stream, info) {
stream.on('data', function (chunk) {
parser.write(chunk.toString("utf8"));
})
})
msg.once('end', function () {
parser.end();
});
})
f.once('error', function (err) {
error = true
response.error(res, 500, '2-9', err)
});
f.once('end', function () {
if (!error) {
parser.on('data', function (data) {
response.success(res, data.html)
});
console.log('Done fetching all messages!');
imap.end();
}
});
})
})
})
如果我删除 imap.search 并将 var f = imap.seq.fetch(results
设置为例如 var f = imap.seq.fetch( box.messages.total + ':*'
,则请求有效。
您可以在 GitHub
谢谢, 为了你的帮助
对于搜索,日期必须采用特定格式,RFC 3501 对此进行了详细说明:
d-MON-YYYY
d
: 是表示月份日期的一位或两位数字
MON
: 是以下三个字母缩写之一:Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov、Dec
YYYY
: 是一个四位数的年份。
示例:2017 年 1 月 3 日、1998 年 3 月 1 日、2000 年 6 月 22 日。
我不太确定这一点,因为我不了解 node.js 和这个库,但您可能还必须将 [ 'UNSEEN', ['SINCE', 'May 20, 2017'] ]
折叠成一个数组;没有必要嵌套它们。 [ 'UNSEEN', 'SINCE', 'May 20, 2017']