Используя node-imap, как мне переместить электронные письма в другую папку? - PullRequest
0 голосов
/ 12 декабря 2018

Я пытался использовать 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');
    });
}

Любая помощь или совет приветствуются.Спасибо всем.

1 Ответ

0 голосов
/ 12 декабря 2018

Вы обращаетесь к сообщениям с использованием порядковых номеров при изменении почтового ящика, что делает недействительными порядковые номера.

Изменение порядковых номеров.4 означает «четвертое сообщение в почтовом ящике прямо сейчас ».Если вы переместите второе сообщение в другое место, сообщение, которое раньше имело номер 4, теперь будет иметь номер 3.

У вас есть два варианта.Во-первых, вы можете использовать UID, которые будут работать, потому что UID являются u nique id .Просто удалите оба экземпляра .seq.Во-вторых, вы можете перемещать все сообщения, используя одну команду, вместо того, чтобы зацикливать и выдавать нежелательное количество перемещений в одном сообщении.imap.move(results, …, одна команда или imap.seq.move(results, …, которая работает, потому что тогда вы будете ссылаться только на сообщения, прежде чем модификация изменит порядковые номера.

...