typescript - mailparser npm modülünü kullanarak node.js'te e-posta eklerini nasıl çözümleyebilirim?
Mailparser npm modülünü, TypeScript ve Node 14 kullanıyorum. Bir mesajı okuyorum ve eki çözümlemeye çalışıyorum. Bu e-posta mesajında bir dosya eki var ve en azından göze göre bu bir CSV dosyası.
Yani kodda aşağıdakilere sahibim:
const MailParser = require('mailparser').MailParser;
doğru e-posta mesajını işlediğim yerde, sahip olduğum
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());
}
});
Çıktı olarak gördüğüm şey şunlardır, bazı kontrol karakterlerini kısaltıyorum:
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
Yani png akışının, ekli dosya ile sona erdiğini görüyorum. Burada neler olduğunu biri açıklayabilir mi? Ve bu tampondaki csv dosyası ek içeriğini nasıl bulabilirim ki onu çözümleyebileyim?
Cevap #1
MailParser sınıfını kullanırken content bir Buffer değil, bir Stream'tir.
Bazı kod yorumları ekledim
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 dosyası ek içeriği nasıl bulunur
data.contentType öğesini, aşağıdaki gibi csv ek akışını almak için kullanabilirsiniz
// 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();
}
}
});
