无法正确地将使用nodejs PDFKit制作的pdf附加到通过Nodemailer发送的电子邮件

将附带pdfkit(节点)的pdf附加到通过nodemailer和Sendgrid API发送的电子邮件中时遇到问题。 电子邮件工作正常 生成到磁盘的PDF是好的,但附件上的PDF不断出现损坏,无法读取。 我已经尝试了许多不同的变化,并通过谷歌研究,但我不知道如何得到这个工作。

创buildpdf的代码:

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

我的节点代码:

 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: 'XXXXXXXX@gmail.com', from: 'example@gmail.com', 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直接传到我的电子邮件里。 除了我不知道如何做到这一点。

我一直在遇到同样的问题。 我注意到,我在我的邮箱中得到的文件缺less最后几行,造成损坏的文件。

原因是文件系统fs没有时间去完成邮件已经发送到Nodemailer的pdf。

您需要等待fs writestream上的“完成”事件。 这就是我所做的:

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