Nodejs node-imap标记邮件为已读

Nodejs node-imap标记邮件为已读

想用node-imap实现对指定邮箱未读邮件的读取操作,在读取结束之后将该邮件标记为已读,现在读取未读邮件这一步已经实现了,但是对于如何标记为已读该怎么操作啊?

3 回复

当然可以!下面是一个关于如何使用 node-imap 库来读取未读邮件并将其标记为已读的详细示例。

示例代码

首先,确保你已经安装了 node-imapmailparser 库:

npm install imap mailparser

然后,你可以使用以下代码来读取未读邮件并将它们标记为已读:

const Imap = require('imap');
const MailParser = require("mailparser").MailParser;
const fs = require('fs');

// 创建IMAP连接
const imap = new Imap({
  user: 'your-email@example.com',
  password: 'your-password',
  host: 'imap.example.com',
  port: 993,
  tls: true
});

imap.once('ready', () => {
  // 选择收件箱中的未读邮件
  imap.openBox('INBOX', true, (err, box) => {
    if (err) throw err;

    const f = imap.seq.fetch('UNSEEN', {
      bodies: ['HEADER.FIELDS (FROM TO SUBJECT DATE)', 'TEXT'],
      struct: true
    });

    f.on('message', (msg, seqno) => {
      console.log(`Message #${seqno}`);

      msg.on('body', (stream, info) => {
        const mailparser = new MailParser();

        stream.pipe(mailparser);

        mailparser.on('headers', headers => {
          console.log(headers.get('subject'));
        });

        mailparser.on('data', data => {
          if (data.type === 'text') {
            console.log(data.text);
          }
        });
      });

      // 将邮件标记为已读
      imap.addFlags(seqno, '\\Seen');
    });

    f.on('error', console.error);

    f.once('end', () => {
      console.log('Done fetching all messages!');
      imap.end();
    });
  });
});

imap.once('error', console.error);

imap.once('end', () => {
  console.log('Connection ended');
});

imap.connect();

解释

  1. 创建IMAP连接

    • 使用 Imap 类创建一个IMAP连接对象,并提供必要的认证信息(如用户名、密码、主机名等)。
  2. 打开收件箱

    • 使用 openBox 方法打开收件箱(INBOX),并设置 true 参数表示需要可写权限。
  3. 读取未读邮件

    • 使用 fetch 方法从收件箱中获取未读邮件。这里我们使用 'UNSEEN' 标签来过滤未读邮件。
  4. 处理邮件数据

    • 对于每一封邮件,我们通过 pipe 方法将邮件流传递给 MailParser 进行解析。
    • MailParser 的事件处理器中,我们可以访问邮件的头部信息和正文内容。
  5. 标记为已读

    • 在处理完邮件后,使用 addFlags 方法将邮件标记为已读。这里我们使用 \\Seen 标签来表示邮件已被阅读。

希望这个示例能帮助你完成你的需求!如果你有任何其他问题或需要进一步的帮助,请随时告诉我。


找了半天找到解决办法了,在非只读模式下打开邮箱,然后按照API 给出的在 fetch 方法的第二个参数中添加 markseen:true 就行了,示例如下:

var Imap = require('imap'),
    inspect = require('util').inspect;

var imap = new Imap({ user: ‘XXXXX@gmail.com’, password: ‘XXXXX’, host: ‘imap.gmail.com’, port: 993, tls: true });

function openInbox(cb) { imap.openBox(‘INBOX’, false, cb); }

imap.once(‘ready’, function() {

openInbox(function(err, box) {
    if (err) throw err;
    imap.search([ 'UNSEEN', ['SINCE', 'May 20, 2014'] ], function(err, results) {
        console.log('unseen mail count: ' + results.length);
        if (err) throw err;
        var f = imap.fetch(results, { bodies: '', markSeen : true });

        f.on('message', function(msg, seqno) {
            console.log('Message #%d', seqno);
            var prefix = '(#' + seqno + ') ';
            msg.on('body', function(stream, info) {

                if (info.which === 'TEXT')
                    console.log(prefix + 'Body [%s] found, %d total bytes', inspect(info.which), info.size);
                var buffer = '', count = 0;
                stream.on('data', function(chunk) {
                    count += chunk.length;
                    buffer += chunk.toString('utf8');
                    if (info.which === 'TEXT')
                        console.log(prefix + 'Body [%s] (%d/%d)', inspect(info.which), count, info.size);
                });
                stream.once('end', function() {
                    console.log(buffer);
                    if (info.which !== 'TEXT')
                        console.log(prefix + 'Parsed header: %s', inspect(Imap.parseHeader(buffer)));
                    else
                        console.log(prefix + 'Body [%s] Finished', inspect(info.which));
                });


            });
            msg.once('attributes', function(attrs) {
                console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8));
            });
            msg.once('end', function() {
                console.log(prefix + 'Finished');
            });
        });



        f.once('error', function(err) {
            console.log('Fetch error: ' + err);
        });
        f.once('end', function() {
            console.log('Done fetching all messages!');
            imap.end();
        });
    });
});

});

imap.once(‘error’, function(err) { console.log(err); });

imap.once(‘end’, function() { console.log(‘Connection ended’); });

imap.connect();

要使用 node-imap 模块标记邮件为已读,您需要先打开相应的文件夹(例如 “inbox”),然后检索邮件并更新其状态。以下是一个简单的示例代码来演示如何完成这个操作。

首先确保您已经安装了 node-imap 模块:

npm install imap

接下来是示例代码:

const Imap = require('imap');
const fs = require('fs');

const mailBox = new Imap({
    user: 'your-email@example.com',
    password: 'your-password',
    host: 'imap.example.com',
    port: 993,
    tls: true
});

mailBox.connect();

mailBox.on('ready', () => {
    // 打开收件箱文件夹
    mailBox.openBox('INBOX', (err, box) => {
        if (err) throw err;

        // 搜索未读邮件
        const searchCriteria = ['UNSEEN'];
        const fetchOptions = { bodies: ['HEADER.FIELDS (FROM TO SUBJECT DATE)', 'TEXT'], markSeen: true };
        mailBox.search(searchCriteria, (err, results) => {
            if (err) throw err;

            if (results.length > 0) {
                const f = mailBox.fetch(results[0], fetchOptions);
                f.on('message', (msg, seqno) => {
                    console.log(`Message ${seqno}:`);
                    let prefix = '(#' + seqno + ') ';
                    msg.on('body', (stream, info) => {
                        let buffer = '';
                        stream.on('data', chunk => buffer += chunk.toString('utf8'));
                        stream.once('end', () => {
                            console.log(prefix + buffer);
                        });
                    });
                    msg.once('attributes', (attrs) => {
                        console.log(prefix + 'Attributes: ' + JSON.stringify(attrs, null, 2));
                    });
                    msg.once('end', () => {
                        console.log(prefix + 'Finished');
                    });
                });

                f.once('error', (err) => {
                    console.error('Fetch error: ' + err);
                });
                f.once('end', () => {
                    console.log('Done fetching all messages!');
                });
            } else {
                console.log('No unread messages found.');
            }
        });
    });
});

mailBox.on('error', (err) => {
    console.error(err);
});

在这个示例中,我们连接到IMAP服务器,打开收件箱文件夹,搜索未读邮件,并将它们标记为已读。当邮件被读取后,会自动将其标记为已读。如果想手动标记邮件为已读,可以在邮件处理完成后调用 addFlags 方法,如 addFlags('\\Seen')

请注意,你需要根据您的实际情况更改主机、用户名和密码等信息。希望这对您有所帮助!

回到顶部