如何使用 mailparser npm 模块解析 node.js 中的电子邮件附件?

How to parse email attachments in node.js using mailparser npm module?

我正在使用 mailparser npm 模块、打字稿和节点 14。 我正在阅读一条消息并尝试解析附件。 这封电子邮件有一个文件附件,它是一个 csv 文件,至少看起来是这样。

所以在代码中,我有以下内容:

const MailParser = require('mailparser').MailParser;

在我处理正确电子邮件的地方,我有

const parser = new MailParser();

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

    parser.on('data', data => {
        if (data.type === 'attachment') {
            console.log(data.filename);
            console.log(data.contentType);
            data.content.pipe(process.stdout);
            data.content.on('end', () => data.release());
        }
    });

我看到的是下面的输出,我截断了一些控制字符:

Outlook-dxbeseix.png
image/png
�PNG

IHDR�SLs IDATx�wtW�-z�zo���[��߽?ۀ ��y���4Nc�gl�x<cόA�Ev�1��8�4��d����[�d���������A��~k�%5
....
�)IEND�B`�2020-8-24-20-4-24 (1).csv
application/vnd.ms-excel
IMEI,Result
353071093175234,UNPAID
356759089843552,UNLOCKED
358709098168945,UNLOCKED

所以我看到一个以实际附加文件结尾的 png 流。 有人可以解释这里发生了什么吗? 以及如何在此缓冲区中找到 csv 文件附件内容以便我对其进行解析?

当使用 MailParser 时 class content 不是缓冲区而是 Stream.

我添加了一些代码注释

parser.on('data', data => {
    if (data.type === 'attachment') {
        // prints the file name of the attachment
        console.log(data.filename);

        // prints the contentType of the attachment
        console.log(data.contentType);

        // Content is a stream which is piped to stdout
        data.content.pipe(process.stdout);

        // call release after attachment processing to continue
        // message processing. Message processing will be paused
        // until release is called
        data.content.on('end', () => data.release());
    }
});

how to find the csv file attachment content

您可以使用 data.contentType 获取 csv 附件流,如下所示

// RFC 7111 and MS Excel types
const csvContentTypes = ['text/csv','application/vnd.ms-excel'];

parser.on('data', data => {
    if (data.type === 'attachment') {
        if(csvContentTypes.includes(data.contentType)) {
          // stream to a file, s3 etc

          // call release
          data.content.on('end', () => data.release());
        } else {
          // skip the attachment
          data.release();
        }
    }
});