javascript - 如何将 RFC822 消息体 body 存储为 String?

标签 javascript node.js npm inbox

var inbox = require("inbox");

var client = inbox.createConnection(false, "imap.gmail.com", {
    secureConnection: true,
    auth:{
        user: "myemail@gmail.com",
        pass: "mypass"
    }
});

client.connect();

client.on("connect", function(){
    client.openMailbox("INBOX", function(error, info){
        if(error) throw error;

        client.listMessages(-10, function(err, messages){
          var datas = [];
          var data;
            messages.forEach(function(message){
                data = message.UID + ": " + message.title;
                datas.push(data);
            });
            var messageStream = client.createMessageStream(22048);
            console.log(messageStream);
            client.close();
        });

    });
});

以上代码返回

Stream {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined }

但是通过替换

var messageStream = client.createMessageStream(22048);
console.log(messageStream);

client.createMessageStream(123).pipe(process.stdout, {end: false});

我在终端中获得了整个 RFC822 消息正文 如何将 RFC822 消息体 body 存储为 String? 我尽力去做,但每次它都返回相同的 我该怎么做?

最佳答案

由于它是一个可读流,您可以使用 NodeJS - Class: stream.Readable

您可以使用 data 事件从流中获取消息,并使用 end 事件知道何时没有更多数据

Event: 'data'

const readable = getReadableStreamSomehow();
readable.on('data', (chunk) => {
  console.log(`Received ${chunk.length} bytes of data.`);
});

Event: 'end'

const readable = getReadableStreamSomehow();
readable.on('data', (chunk) => {
  console.log(`Received ${chunk.length} bytes of data.`);
});
readable.on('end', () => {
  console.log('There will be no more data.');
});

附言createMessageStream 接受消息 UID 作为参数。

在你的情况下,你可能必须用一些 promise 的基本函数来包装它

示例

var inbox = require("inbox");

var client = inbox.createConnection(false, "imap.gmail.com", {
    secureConnection: true,
    auth: {
        user: "myemail@gmail.com",
        pass: "mypass"
    }
});

client.connect();

client.on("connect", function() {

    client.openMailbox("INBOX", function(error, info) {
        if (error) throw error;

        var emails = [];

        var promises = [];

        new Promise(function(resolve, reject) {

            client.listMessages(-10, function(err, messages) {

                if (err) {
                    reject(err)
                    return;
                };

                messages.forEach(function(message) {

                    var promise = new Promise(function(resolve, reject) {

                        var email = {
                            UID: messages.UID,
                            title: message.title,
                            body: ""
                        }

                        client.createMessageStream(message.UID)
                            .on('data', (chunk) => {
                                email.body += chunk.toString();
                            }).on('end', () => {
                                //return the email object
                                resolve(email);

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

                    promises.push(promise);

                });

                resolve();

            });

        }).then(() => {

            return Promise.all(promises).then(function(emails) {
                console.log(emails);
                console.log("closing");
                client.close();
            })
        })

    });
});

关于javascript - 如何将 RFC822 消息体 body 存储为 String?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47920234/

相关文章:

javascript - Redux表格: Conditional form validations with multiple submit buttons

javascript - 如何使用循环变量在循环内定义事件处理程序?

node.js - 带有某些包的 Node "No such file or directory"

javascript - Jquery Datepicker - 防止在不可用日期范围内选择

javascript - $scope.$watch 数组内的特定对象 - Angular JS Controller

javascript - Node、Bluebird Promises、MySQL 以及喝一杯烈性酒的必要性

php - 自动化修复损坏的 Web 链接

node.js - 具有多个条件的聚合和基于计数键的总和匹配

Laravel 9 为 vue 2.6.12 安装 vue 路由器

NPM,package.json - 如何添加名称为 "@"的依赖项