我一直在尝试使用node-imap将电子邮件从收件箱移到我创建的名为“已处理”的文件夹中。但是,每当我运行我的代码时,就会随机发送一些电子邮件。那些未移动的电子邮件会引发此错误:
Error: Error in IMAP command MOVE: Invalid messageset (0.001 + 0.000 secs).
当我再次运行代码时,以前无法移动的那些电子邮件中有随机数被移动了,其他电子邮件则抛出了相同的错误。之后再运行我的代码几次,最终将所有电子邮件都移到了“已处理”文件夹中。
我不知道为什么某些电子邮件在第一次运行时无法移动,并且无法找到有关“ IMAP命令MOVE中的错误:无效的消息集”的任何资源。有很多有关IMAP命令FETCH的资源,但我找不到有关IMAP命令MOVE的任何信息。
我的代码如下:
function moveEmailToFolder(){
const Imap = require('imap');
const imap = new Imap({
user: config.email.user,
password: config.email.password,
host: config.email.host,
port: 993,
tls: {
secureProtocol: "TLSv1_method"
}
});
imap.connect();
imap.once('ready', function(){
imap.openBox("INBOX", false, function(err, box) {
imap.search([ 'ALL' ], function(err, results) {
let mail_no = "1:*";
var f = imap.seq.fetch(mail_no, {
bodies: "",
struct: true,
markSeen: true
});
let all_emails = [];
f.on("message", function(msg, seqno) {
let move_email_fn_calls = 0;
function move_email(uid){
imap.seq.move(uid, "processed", function(err) {
if( !err ){
console.log(uid+": move success");
} else if( err && move_email_fn_calls < 3 ){
move_email_fn_calls++;
move_email(uid);
console.log(uid+": " + err);
} else if( err && move_email_fn_calls >= 3){
console.log(uid+": Unable to move");
}
console.log(move_email_fn_calls);
});
}
move_email(seqno);
});
f.once("error", function(err) {
console.log(err);
});
f.once("end", function() {
imap.end();
});
});
});
});
imap.once('error', function(err) {
console.log(err);
});
imap.once('end', function() {
console.log('Connection ended');
});
}
任何帮助或建议,我们将不胜感激。 谢谢大家。
答案 0 :(得分:1)
您正在修改邮箱时使用序列号寻址消息,这会使序列号无效。
序列号更改。 4表示“邮箱立即中的第四条消息”。如果您将第二条消息移到其他位置,则以前具有数字4的消息现在具有数字3。
您有两个选择。首先,您可以使用UID,因为UID是 u nique id 指示符,因此可以使用。只需删除.seq
的两个实例。其次,您可以使用一个命令移动所有消息,而不是循环并发出不合要求的单消息移动次数。 imap.move(results, …
,一个命令或imap.seq.move(results, …
之所以有效,是因为您仅在修改修改序列号之前引用消息。