Парсинг входящих писем от Sendgrid

Я пытаюсь анализировать входящие электронные письма из входящего веб-перехватчика Sendgrid с помощью Meteor, Picker и Body-Parser. Я получаю электронные письма, но когда я регистрирую тело запроса, я получаю пустой объект. Что мне здесь не хватает??

var bodyParser = require('body-parser');;

Picker.middleware( bodyParser.json() );

Picker.route('/incoming/', function(params, req, res, next) {
    console.log("Body: " + JSON.stringify(req.body));
}

person oskare    schedule 18.08.2016    source источник


Ответы (4)


Проблема была связана с тем, что тип содержимого был multipart/form-data. Заработало так:

var multiparty = require('multiparty');
var bodyParser = Npm.require('body-parser');

Picker.middleware(bodyParser.urlencoded({ extended: true }));
Picker.middleware(bodyParser.json());

Picker.route('/incoming/', function(params, req, res, next) {
  var form = new multiparty.Form();
  form.parse(req, function(err, fields, files) {
    console.log("Heureka: " + JSON.stringify(fields) + JSON.stringify(files));
    res.writeHead(200, {'content-type': 'text/plain'});
    res.write('received upload:\n\n');
    res.end("thanks");
  });
});
person oskare    schedule 20.08.2016

Похоже, что входящий контент из SendGrid не имеет application/json Content-Type, поэтому bodyParser.json() не может его правильно проанализировать. Попробуйте также добавить вызов bodyParser.urlencoded(), чтобы попытаться разобрать application/x-www-form-urlencoded Content-Type, чтобы посмотреть, поможет ли это. Итак, что-то вроде:

var bodyParser = require('body-parser');

Picker.middleware(bodyParser.json());
Picker.middleware(bodyParser.urlencoded({ extended: false }));

Picker.route('/incoming/', function(params, req, res, next) {
  console.log("Body: " + JSON.stringify(req.body));
}
person hwillson    schedule 19.08.2016
comment
Спасибо, но тело все еще пустое. Я попытался опубликовать тестовое письмо из Mailgun и получил точно такой же результат (большой объект json со всеми вещами, которые можно было бы ожидать, но с пустым телом). - person oskare; 19.08.2016

Вы также можете сделать это с помощью мультипликатора. Вот версия экспресс-сервера:

const express = require(“express”);
const app = express();
var multer = require(“multer”);
var upload = multer();
app.post(“/”, upload.none(), function (req, res) {
  console.log(req.body);
});
person user3552762    schedule 04.08.2020

Я знаю, что на этот вопрос уже был дан ответ, но у меня есть альтернативное решение, использующее express и multer. Я создал репозиторий express-sendgrid-inbound-parse, чтобы вы могли началось.

Я рекомендую не проверять необработанное полное сообщение MIME POST, так как вы можете получить доступ к большему количеству данных электронной почты.

console.log('dkim: ', body.dkim)
console.log('to: ', body.to)
console.log('cc: ', body.cc)
console.log('from: ', body.from)
console.log('subject: ', body.subject)
console.log('sender_ip: ', body.sender_ip)
console.log('spam_report: ', body.spam_report)
console.log('envelope: ', body.envelope)
console.log('charsets: ', body.charsets)
console.log('SPF: ', body.SPF)
console.log('spam_score: ', body.spam_score)

if (rawFullMimeMessageChecked) {
    console.log('email: ', body.email)
} else {
    console.log('headers: ', body.headers)
    console.log('html: ', body.html)
    console.log('text: ', body.text)
    console.log('attachments: ', body.attachments)
    console.log('attachment-info: ', body['attachment-info'])
    console.log('content-ids: ', body['content-ids'])
}
person shammelburg    schedule 06.12.2020