Не удается правильно прикрепить PDF-файл, созданный с помощью nodejs PDFKit, к электронной почте, отправленной через Nodemailer

У меня возникают проблемы с прикреплением PDF-файла, созданного с помощью pdfkit(node), к электронному письму, которое отправляется через nodemailer и API Sendgrid. Электронная почта работает нормально. PDF-файл, который создается на диске, в порядке, но PDF-файл во вложении продолжает появляться поврежденным и нечитаемым. Я пробовал много разных вариантов и исследовал Google, но я не уверен, как заставить это работать.

код, который создает PDF:

var fs = require('fs');
var PDFDocument = require('pdfkit');

doc = new PDFDocument({
    size: 'letter'
});

doc.pipe(fs.createWriteStream('./public/img/test.pdf'));

doc.text('my text')

doc.end();

мой код nodemailer:

var nodemailer = require('nodemailer');
var sgTransport = require('nodemailer-sendgrid-transport');
var options = {
    auth: {
        api_key: process.env.SENDGRID_API
    }
}
var mailer = nodemailer.createTransport(sgTransport(options));

var email = {
        to: '[email protected]',
        from: '[email protected]',
        subject: 'Please work',
        text: 'Check out this pdf',
        attachments: [{
            filename: 'test.pdf',
            path: './public/img/test.pdf',
            contentType: 'application/pdf'
        }]
    };

mailer.sendMail(email, function(err, res){
    if (err){
        console.log(err);
    }
    console.log(res);
});

Я что-то упускаю? Вместо того, чтобы записывать pdf на диск, я также читал, что есть еще один способ сделать это — отправить pdf прямо на мою электронную почту. Кроме того, я не уверен, как это сделать.


person Ren    schedule 03.03.2016    source источник


Ответы (1)


Я столкнулся с той же проблемой. Я заметил, что в файле, который я получил в своем почтовом ящике, отсутствуют последние несколько строк, что делает файл поврежденным.

Причина этого в том, что у файловой системы fs нет времени, чтобы закончить запись pdf, в котором почта уже отправлена ​​с помощью Nodemailer.

Вам нужно дождаться события "финиш" в потоке записи fs. Вот что я сделал:

  const doc = new PDFDocument();
  const fileName = 'aPdfFile.pdf';
  const writeStream = fs.createWriteStream(fileName);
  doc.pipe(writeStream);

  // do something with your pdf document ...

  doc.end();
  writeStream.on('finish', function () {
    // call the callback function or in my case resolve the Promise.
    resolve(fileName);
  });
person Kevin.    schedule 15.05.2016