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

问题描述

我正在使用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类时,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());
    }
});

如何找到csv文件附件内容

您可以使用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();
        }
    }
});