【问题标题】:Using node-imap, how do i move emails into another folder?使用 node-imap,我如何将电子邮件移动到另一个文件夹?
【发布时间】:2018-12-12 05:22:40
【问题描述】:

我一直在尝试使用 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');
    });
}

感谢任何帮助或建议。 谢谢大家。

【问题讨论】:

    标签: node.js imap node-imap


    【解决方案1】:

    您在修改邮箱时使用序列号寻址消息,这会使序列号无效。

    序列号改变。 4 表示“邮箱中的第四条消息现在”。如果您将第二条消息移到其他位置,则以前编号为 4 的消息现在编号为 3。

    你有两个选择。首先,您可以使用 UID,因为 UID 是 u 独特的 id 实体,所以它会起作用。只需删除.seq 的两个实例。其次,您可以使用一个命令移动所有消息,而不是循环并发出大量单消息移动。 imap.move(results, …,一个命令,或imap.seq.move(results, …,因为这样您只在修改更改序列号之前引用消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 2020-10-07
      • 2015-01-23
      相关资源
      最近更新 更多