You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中IMAP getMail方法控制台有输出但Postman无返回求助

问题分析与修复方案

你的代码核心问题是IMAP连接从未触发end事件,导致返回的Promise一直处于pending状态,Postman自然拿不到结果。控制台能打印是因为邮件内容确实被读取了,但读取完成后没有主动关闭连接,end事件不触发,Promise就不会resolve。

具体修复步骤:

  1. 在所有邮件读取完成后手动关闭IMAP连接,触发end事件让Promise resolve
  2. 修正buffer的赋值逻辑,避免chunk内容被覆盖
  3. 完善错误处理,确保异常能传递到Promise的reject分支

修改后的完整代码:

async getMail() {
    let email_array = [];
    var imap = new Imap({
        user: 'myuser',
        password: 'mypassword',
        host: 'myhost', // 注意原代码拼写错误,修正为myhost
        port: 143,
        tls: false,
        authTimeout: 3000
    });

    function openInbox(cb) {
        imap.openBox('INBOX', true, cb);
    }

    return new Promise((resolve, reject) => {
        imap.once('ready', function () {
            openInbox(function (err, box) {
                if (err) {
                    imap.end();
                    return reject(err);
                }
                var f = imap.seq.fetch('1:1', {
                    bodies: '1',
                    struct: true
                });
                
                f.on('message', function (msg, seqno) {
                    console.log('Message #%d', seqno);
                    let buffer = ''; // 移到message回调内部,避免变量污染
                    msg.on('body', function (stream, info) {
                        stream.on('data', function (chunk) {
                            buffer += chunk.toString('utf8'); // 累积chunk内容,而非直接覆盖
                        });
                        stream.once('end', function() {
                            email_array.push(buffer);
                            console.log("buffer", buffer);
                        });
                    });
                    msg.once('end', function () {
                        console.log('Message #%d Finished', seqno);
                    });
                });

                // 所有邮件读取完成后主动关闭连接
                f.once('end', function() {
                    console.log('All messages fetched');
                    imap.end(); // 触发end事件,让Promise resolve
                });

                f.once('error', function(err) {
                    imap.end();
                    reject(err);
                });
            });
        });

        imap.once('error', function (err) {
            reject(err);
        });

        imap.once('end', function () {
            resolve(email_array);
        });

        imap.connect();
    });
}

关键修改说明:

  • 将Promise逻辑提前,把所有IMAP事件监听纳入Promise内部,确保错误能正确传递到reject
  • 在fetch的end事件中调用imap.end(),手动触发连接关闭,让Promise正常resolve
  • 把buffer变量移到message回调内部,避免多邮件场景下的变量污染,同时用+=累积chunk内容
  • 所有错误分支都添加imap.end()和reject(err),避免连接挂起和Promise长期pending

内容的提问来源于stack exchange,提问作者paranoid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:40:43