2016-03-03 60 views
1

我在使用pdfkit(節點)附加pdf到通過nodemailer和Sendgrid API發送的電子郵件時出現問題。電子郵件正常工作生成到磁盤的pdf很好,但附件上的pdf不斷出現損壞和不可讀。我已經嘗試了許多不同的變體,並通過谷歌研究,但我不知道如何得到這個工作。無法正確地將使用nodejs PDFKit製作的pdf附加到通過Nodemailer發送的電子郵件

創建的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直接傳輸到我的電子郵件。除了我不知道如何做到這一點。

回答

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); 
    }); 
相關問題