我在将使用pdfkit(节点)制作的pdf附加到通过nodemailer和Sendgrid API发送的电子邮件时遇到问题。电邮工作正常。生成到磁盘的pdf很好,但附件上的pdf不断损坏且不可读。我尝试了很多不同的变体,并通过谷歌研究,但我不知道如何让这个工作。
创建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: '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直接流式传输到我的电子邮件中。除了我不知道如何做到这一点。
答案 0 :(得分:3)
我遇到了同样的问题。我注意到我的邮箱中的文件丢失了最后几行,导致文件损坏。
原因是文件系统fs
没有时间完成编写已使用Nodemailer发送邮件的pdf。
您需要等待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);
});