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();
        }
    }
});

İlgili makaleler