2016-02-04 133 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

相关问题