处理Mandrill入站电子邮件

时间:2015-02-05 11:09:54

标签: node.js http meteor iron-router mandrill

我无法使用Meteorjs处理来自mandrill的入站电子邮件。在编写服务器端路由/ API路由时,我有点新手,所以我希望我不会忽略疯狂基本的东西。 这是我定义的铁路由器路由: 它获得了post调用,创建了一个消息对象并将对象输入到我的集合中。

Router.route('/api/message/insert', function () {
  // NodeJS request object
  var request = this.request;


  request = JSON.parse(request.body.mandrill_events);
  console.log(request);
  var firstEmail = request[0];


  if(firstEmail.event == "inbound"){ // == used on purpose
    var email = firstEmail.msg.from_email;
    var user = Meteor.users.findOne({"emails[0].address":email });
    var chatRoom = chatRooms.findOne({name:user_.id});
    var message = {
      content:firstEmail.msg.text,
      links:[],
      chatRoom:chatRoom._id,
      owner:user._id,
      ownerName:user.profile.name,
      ownerEmail:email,
      createdAt: new Date(),
    };
    chatMessages.insert(message);
  }
  // NodeJS  response object
  var response = this.response;


  this.response.end("chat message implemented");
}, {where: 'server'});

当我从mandrill仪表板发送测试电子邮件时,我得到了积极的回应。实际上发送电子邮件到我在mandrill注册的地址什么也没做。我很难调试这个,因为我的模数日志中没有错误代码(也是console.log什么都不做)。

我找到了这个指南 http://dev-blog.cloud-spinners.com/2014/03/sending-and-receiving-email-using.html 但我似乎无法在这里看到我所做的根本错误。我知道我需要进一步处理电子邮件正文,但这只是为了获得一个'#34; hello world"消息进入我的数据库。

1 个答案:

答案 0 :(得分:0)

iron-router不支持multipart / form-data。我在sendgrid中使用了以下代码。

var Busboy = Meteor.npmRequire("Busboy"),
    fs = Npm.require("fs"),
    os = Npm.require("os"),
    path = Npm.require("path");

Router.onBeforeAction(function (req, res, next) {
   var filenames = []; // Store filenames and then pass them to  request.
   req.body   = req.body  || {};


if (req.method === "POST") {
    var busboy = new Busboy({ headers: req.headers });
    busboy.on("file", function (fieldname, file, filename, encoding, mimetype) {
    var saveTo = path.join(os.tmpDir(), filename);
    file.pipe(fs.createWriteStream(saveTo));
    filenames.push(saveTo);
    });

    busboy.on("field", function(fieldname, value) {


    req.body[fieldname] = value;

    });

   busboy.on("finish", function () {
  // Pass filenames to request
    req.filenames = filenames;
    next();
   });
}
  // Pass request to busboy
  req.pipe(busboy);
});

然后您可以在路线中获取它:

Router.route('inbound', {
 path: '/inbound/',
 where: 'server',
 action: function () {

 var body = this.request.body;
 console.log(body);
 ...

您必须添加以下软件包才能使用npm软件包:meteor add meteorhacks:npm并将packages.json文件添加到项目的根目录并添加以下内容:

{ "busboy": "0.2.9"}