问题描述
我正在使用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();
}
}
});