【问题标题】:how to mark unseen email as seen with node-imap in node.js如何在 node.js 中使用 node-imap 将看不见的电子邮件标记为可见
【发布时间】:2014-08-06 04:11:27
【问题描述】:

我想接收电子邮件并将电子邮件标记为看不见的node-imap。我已经完成了接收,但我不知道如何将未查看的电子邮件标记为已查看。 API 提供了一个功能,好像用example 中的var f = imap.fetch(results, { markSeen : true }); 替换代码var f = imap.fetch(results, { bodies: '' });,但它似乎不起作用。我该怎么办?

【问题讨论】:

    标签: node.js imap


    【解决方案1】:

    哦,我有解决办法。以只读模式打开邮箱是我的错,这就是为什么我无法修改邮件的状态。imap.openBox('INBOX', false, cb); 第二个参数false 表示以非只读模式打开邮箱。

    【讨论】:

    • 这是正确工作的正确代码:client.messageFlagsAdd({uid: 116,seen: false}, ['\\Seen']);
    【解决方案2】:

    我尝试将邮件状态设置为 false imap.openBox('INBOX', false, cb),但一开始没有成功。

    但后来我更改了body 中的数据并将其设置为HEADER.FIELDS (FROM TO SUBJECT DATE) 它有效。我不知道这有什么关系,但它现在正在工作,而邮箱只读状态显然是错误的。

    非工作代码:

    imap.fetch(results, { bodies: '', markSeen: true });
    

    工作代码:

    imap.fetch(results, { bodies: 'HEADER.FIELDS (FROM TO SUBJECT DATE)', markSeen: true });
    

    【讨论】:

    • 这对我来说是最好的解决方案。
    【解决方案3】:
    imap.openBox("INBOX", false, function(err, mailBox) {
        if (err) {
            console.error(err);
            return;
        }
        imap.search(["UNSEEN"], function(err, results) {
    
            imap.setFlags(results, ['\\Seen'], function(err) {
                if (!err) {
                    console.log("marked as read");
                } else {
                    console.log(JSON.stringify(err, null, 2));
                }
            });
    
            var f = imap.fetch(results, { bodies: "" });
            f.on("message", processMessage);
            f.once("error", function(err) {
                return Promise.reject(err);
            });
            f.once("end", function() {
                console.log("Done fetching all unseen messages.");
                imap.end();
            });
        });
    });
    

    进程消息

    function processMessage(msg seqno){
         /*use mailparser*/}
    

    所以结果基本上包含 uuid

    需要显式调用 imap.setFlags([uuids], ['\Seen'], cb) 函数使其标记为已读

    【讨论】:

    • imap.fetch(results, { body: '', markSeen: true });这在大多数情况下都不起作用
    【解决方案4】:

    这是一个相同的工作示例。

    var Imap = require('imap'),
        inspect = require('util').inspect;
    
    var imap = new Imap({
        user: 'USERNAME',
        password: 'PASSWORD',
        host: 'IMAP_HOST',
        port: 993, // Default port is 993
        tls: true,
        tlsOptions: {rejectUnauthorized: false}
    });
    
    function openInbox(cb) {
        // openReadOnly = false
        imap.openBox('Inbox', false, cb);
    }
    
    imap.once('ready', function () {
        openInbox(function (err, box) {
            if (err) throw err;
    
            // Search emails having "Some Subject" in their Subject headers
            imap.search([['HEADER', 'SUBJECT', 'Some Subject']], function (err, results) {
                if (err) throw err;
    
                try {
                    var f = imap.fetch(results, {bodies: 'TEXT'});
                    f.on('message', function (msg, seqno) {
                        msg.on('body', function (stream, info) {
                            var buffer = '';
                            stream.on('data', function (chunk) {
                                buffer += chunk.toString('utf8');
                            });
                            stream.once('end', function () {
    
                                // Mark the above mails as read
                                msg.once('attributes', function (attrs) {
    
                                    let uid = attrs.uid;
                                    imap.addFlags(uid, ['\\Seen'], function (err) {
                                        if (err) {
                                            console.log(err);
                                        } else {
                                            console.log("Marked as read!")
                                        }
                                    });
    
                                });
    
                            });
                        });
                    });
                    f.once('end', function () {
                        imap.end();
                    });
                } catch (errorWhileFetching) {
                    console.log(errorWhileFetching.message);
                    imap.end();
                }
    
            });
        });
    });
    
    imap.connect();
    

    【讨论】:

      【解决方案5】:
      client.messageFlagsAdd({uid: 116,seen: false}, ['\\Seen']);
      

      【讨论】:

      • 未读到在 IMAP 流中读取 client.messageFlagsRemove({uid: 116,seen: true}, ['\\Seen']);
      • 没有最少解释的裸代码不好。请详细说明。
      猜你喜欢
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 2013-06-26
      • 1970-01-01
      • 2014-10-09
      • 2013-06-15
      • 2013-06-17
      相关资源
      最近更新 更多