Используя node-imap, как мне переместить электронные письма в другую папку?
Я пытался использовать node-imap, чтобы переместить электронные письма из папки "Входящие" в папку, которую я создал, под названием "обработано". Но всякий раз, когда я запускаю свой код, меняются случайные количества писем. Те письма, которые не были перемещены, выдают эту ошибку:
Error: Error in IMAP command MOVE: Invalid messageset (0.001 + 0.000 secs).
Когда я снова запускаю свой код, случайное количество тех писем, которые раньше не могли быть перемещены, были перемещены, а другие выдают ту же ошибку. Выполнение моего кода несколько раз после этого в конечном итоге переместило все электронные письма в мою "обработанную" папку.
Я понятия не имею, почему некоторые письма не могут быть перемещены при первом запуске и не может найти какие-либо ресурсы о "Ошибка в команде IMAP ПЕРЕМЕСТИТЬ: Неверный набор сообщений". Было много ресурсов о 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');
});
}
Любая помощь или совет приветствуется. Спасибо всем.
1 ответ
Вы обращаетесь к сообщениям с использованием порядковых номеров при изменении почтового ящика, что делает недействительными порядковые номера.
Порядковые номера меняются. 4 означает "четвертое сообщение в почтовом ящике прямо сейчас ". Если вы переместите второе сообщение в другое место, сообщение, которое раньше имело номер 4, теперь будет иметь номер 3.
У вас есть два варианта. Во-первых, вы можете использовать UID, которые будут работать, потому что UID являются уникальными идентификаторами идентификаторов. Просто удалите оба экземпляра .seq
, Во-вторых, вы можете перемещать все сообщения, используя одну команду, вместо того, чтобы зацикливать и выдавать нежелательное количество перемещений в одном сообщении. imap.move(results, …
, одна команда, или imap.seq.move(results, …
который работает, потому что тогда вы будете ссылаться только на сообщения, прежде чем модификация изменит порядковые номера.