2016-02-04 138 views
0

我正在使用Express在簡單的webhook上通過Mailgun發送某個事件的PDF。然而,每當我嘗試發送它,我都會得到這個錯誤:{[Error:'from'parameter is missing] statusCode:400}。我用簡單的.txt文件測試過它,它工作正常,所以我假設它與PDF附件有關。我的代碼在這裏:400嘗試通過NodeMailer發送PDF時發生錯誤Mailgun Transport

var express = require('express'); 
var app = express(); 
var bodyParser = require('body-parser'); 
var nodemailer = require('nodemailer'); 
var PDFDocument = require('pdfkit'); 
var mg = require('nodemailer-mailgun-transport'); 
var fs = require('fs'); 

app.use(bodyParser.json()); 

app.post('/', function(req, res) { 
generatePDF(req.body.line_items); 
if (req.body.line_items) { 
    sendMail(); 
    res.send('OK'); 
} 

}); 

app.listen(3030, function() { 
console.log('test app listening on port 3030'); 
}); 

function generatePDF(lineItems) { 
var doc = new PDFDocument(); 
var writeStream = fs.createWriteStream('mailer/output.pdf'); 
doc.pipe(writeStream); 
for (item in lineItems) { 
    for (key in item) { 
    doc.text(item[key]); 
    } 
} 

console.log("doc: " + doc); 
doc.end(); 
} 

function sendMail() { 
var auth = { 
    auth: { 
    api_key: 'my-key', 
    domain: 'my-domain' 
    } 
} 

var transporter = nodemailer.createTransport(mg(auth)); 
    var mailOptions = { 
    from: 'my-email', 
    to: 'their-email', 
    subject: 'test', 
    html: '<b>this is a test</b>', 
    attachments: [ 
     { 
     filename: 'output.pdf', 
     path: 'mailer/output.pdf', 
     content: 'output mailer' 
     } 
    ], 
    } 

    transporter.sendMail(mailOptions, function(error, info){ 
    console.log('mail sent'); 
    if (error) { 
     return console.error(error) 
    } 
    console.log('success!', info); 
    }) 
} 

任何幫助將不勝感激!

+0

嘗試從attachments數組中的附件對象中刪除'content'prop。只是一個猜測。 –

回答

0

忘了發佈我的解決方案,但在這裏它遲到了未來的人遇到這個問題。 writeStream在我發送之前還沒有完成,並且nodemailer變得非常困惑,所以我在發送之前插入了一個條件,即PDF(或任何文檔)完成寫入。

var express = require('express'); 
    var app = express(); 
    var bodyParser = require('body-parser'); 
    var nodemailer = require('nodemailer'); 
    var PDFDocument = require('pdfkit'); 
    var mg = require('nodemailer-mailgun-transport'); 
    var fs = require('fs'); 
    var idStorage = []; 
    app.use(bodyParser.json()); 

    app.post('/', function(req, res) { 
    var JSON = req.body; 
    console.log(idStorage); 
    if (req.body.line_items) { 
     res.sendStatus(200); 
     generatePDF(JSON); 
    } 

    }); 

    app.listen(3030, function() { 
    console.log('example app listening on port 3030'); 
    }); 




    function generatePDF(JSON) { 

     //create doc and doc variables 
     var doc = new PDFDocument(); 
     var writeStream = fs.createWriteStream('mailer/output.pdf'); 
     doc.pipe(writeStream); 
     //write whatever you want to the PDF 
     doc.save(); 
    //wait for the PDF to finish writing before you send it. 
     writeStream.on('finish', function() { 

      sendMail(JSON); 
     }); 
     } 
     doc.end(); 
    } 
    } 

function sendMail(JSON) { 
     var auth = { 
     auth: { 
      api_key: 'key', 
      domain: 'domain.com' 
     } 
     } 

     var transporter = nodemailer.createTransport(mg(auth)); 
     var mailOptions = { 
      from: 'me', 
      to: 'you', 
      subject: JSON.id, 
      html: '<b>Test</b>', 
      attachments: [ 
      { 
       filename: 'output.pdf', 
       path: 'mailer/output.pdf'  
      } 
      ], 
     } 

     transporter.sendMail(mailOptions, function(error, info){ 
      console.log('mail sent'); 
      if (error) { 
      return console.error(error) 
      } 
      console.log('success!', info); 
     }) 
     } 
} 
+0

爲什麼在完成所有工作之前發送狀態?如果發送電子郵件時發生錯誤,用戶將永遠不會知道這一點。 –

+0

@JoseHermosillaRodrigo - 我在那裏停止不斷重新發送JSON的webhook,而我正在測試 - 這不是在生產,所以幸運的是沒有用戶被搞砸了,但它肯定是更聰明的發送郵件後的回覆已發送。 – Brent

相關問題