Sendgrid-nodejs: Contoh penggunaan inbound-mail-parser untuk mengurai email masuk

Dibuat pada 13 Okt 2017  ·  35Komentar  ·  Sumber: sendgrid/sendgrid-nodejs

Ringkasan Masalah

Ringkasan masalah dan lingkungan tempat terjadinya. Jika cocok, sertakan langkah-langkah yang diperlukan untuk mereproduksi bug. Silakan memasukkan tangkapan layar, screencast, contoh kode.

Saya tidak dapat menemukan cara menggunakan paket @ sendgrid / inbound-mail-parser untuk mengurai email masuk. membutuhkan beberapa kode contoh

Langkah-langkah untuk Mereproduksi

Siapkan rute parse di sendgrid (ditautkan di sini:
https://www.dropbox.com/s/cb6lwrmon9qwjzq/Screenshot%202017-10-12%2016.03.49.png?dl=0)
berikut isi contoh email ke route di ngrok:
https://gist.github.com/machinshin/e38cf7d20ec6319edcfda63ff7aca594

Saya telah menghubungkan parseroute ke webhook saya seperti ini:

router.post('/api/email/parseroute', (req, res, next) => {
// have also tried:
router.post('/api/email/parseroute', bodyParser.raw(), (req, res, next) => {

    console.log(`-------------`)
    console.log(req.body)
    console.log(`-------------`)
    console.log(req.rawBody)
    console.log(`-------------`)

}

{}

tidak terdefinisi

Seperti yang Anda lihat, req.body kosong, dan req.rawBody adalah 'undefined'
Jadi, saya tidak mengerti tentang cara mendapatkan akses ke data email mentah, atau apa yang harus dilakukan dengan data itu setelahnya dan cara membuat contoh parser-email-masuk

Informasi lain yang ingin Anda bagikan yang relevan dengan masalah yang dilaporkan. Terutama, mengapa Anda menganggap ini sebagai bug? Apa yang Anda harapkan terjadi?

Detail teknis:

  • sendgrid-nodejs Versi: 6.1.4 (komit terbaru: 4c6d1cc)
  • Versi Node.js: 4.1.2
    "@ sendgrid / inbound-mail-parser": "^ 6.1.4",
    "@ sendgrid / mail": "^ 6.1.4",
easy help wanted docs update

Komentar yang paling membantu

Hai @ero_cho ,

Kami memang memiliki paket di sini , tetapi sayangnya tidak ada dokumentasi penggunaan yang baik. Untuk itu, Anda mungkin ingin memeriksa Python Inbound Parser .

Salam hangat,

Elmer

Jadi, Anda harus menulis dokumentasi.

Semua 35 komentar

Halo @machinin ,

Terima kasih telah meluangkan waktu untuk melaporkan ini. Saya telah menambahkan ini ke backlog kami untuk penyelidikan lebih lanjut.

Ada pembaruan tentang contoh? Saya benar-benar perlu menggunakan parser ini tetapi saya tidak tahu caranya.

Hai @ero_cho ,

Kami memang memiliki paket di sini , tetapi sayangnya tidak ada dokumentasi penggunaan yang baik. Untuk itu, Anda mungkin ingin memeriksa Python Inbound Parser .

Salam hangat,

Elmer

SendGrid mengirim data parse masuk JSON mereka sebagai data formulir / multi-bagian. Ini tidak akan langsung diakses oleh req.body karena body-parser tidak menangani format itu. Saya akan menggunakan multer sebagai alternatif.

@ shishido92 Bisakah Anda memperluas contoh yang baik tentang bagaimana melakukannya. Sepertinya dokumentasi untuk penguraian email masuk dengan nodejs tidak ada. Terima kasih!

@stephenfjohnson @machinshin Jika Anda menggunakan expressjs, ini mungkin membantu

app.use(express.json({limit: '10mb'}));
app.use(express.urlencoded({
  extended: true,
  type: "multipart/form-data",
  limit: '10mb'
}));
app.post('/endpoint',  function (req, res, next) {
  // req.body contains the text fields
  console.log(req.body);
  console.log('body' + req.body);
  res.status(200).json('ok');
})

Melakukan ini akan memberi Anda konten permintaan di badan permintaan.
Ini mengabaikan keterikatan.

@nathfreder Kami menggunakan reaksi jempol pada ringkasan masalah sebagai bagian dari prioritas kami. Tolong beri 👍 di bagian atas.

@ childish-sambino, @satyajeetjadhav 👍

Terlambat terlambat dari sebelumnya;)
Terima kasih atas pembaruannya, menutup masalah ini

Saya tahu ini telah ditutup tetapi saya baru saja melihat masalah ini dan saya telah mengungkapkan dengan inbound-mail-parser yang berfungsi. Hal utama yang perlu saya lakukan adalah menggunakan perpustakaan multer untuk menangani input multipart / form-data dan kemudian menggunakan metode keyValues ​​() dari pustaka @ sendgrid / inbound-mail-parser seperti di bawah ini

membutuhkan di multer dan Sendgrid:

const multer = membutuhkan ('multer');
const upload = multer ();
const mailParse = membutuhkan ('@ sendgrid / inbound-mail-parser');

pada deklarasi router saya untuk metode POST, gunakan metode upload.none () karena saya baru saja mendapatkan teks (Tanpa lampiran):

router.post ('/ mail', upload.none (), function (req, res, next)

Dalam definisi POST itu saya kemudian menggunakan metode keyValues ​​() untuk mendapatkan bagian yang relevan dari email:

coba {
const config = {kunci: ['ke', 'dari', 'subjek', 'teks',]};
const parsing = new mailParse (config, req.body);
biarkan respon = parsing.keyValues ​​();
let to = response.to;
biarkan from = response.from;
biarkan subjek = respon.subject;
biarkan messageBody = response.text
console.log ('Ini adalah subjek dari email:', subjek);
}

Harapan itu ada gunanya.

Halo semuanya, dapatkah seseorang membagikan contoh cara mengurai lampiran? saya menggunakan konfigurasi yang sama, tetapi lampiran datang dalam string yang tidak dapat dibaca


const app = express();
app.use(cors);
app.use(busboy());
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies.
app.use(bodyParser.json({limit: '5mb'}));

router.post('', upload.any(),function(req, res) {
  // console.log(req.body);
  // console.log(req.files);
  // res.send(req.body);

  const config = {keys: ['to', 'from', 'subject', 'text','attachments']};
  const parsing = new mailParse(config, req.body);
  let response = parsing.keyValues();
  let to = response.to;
  let from = response.from;
  let subject = response.subject;
  let messageBody = response.text
  console.log('This is the subject from the mail: ', response);
  res.send(200);
});

Kode yang diposting oleh @ jhorsfield-tw sangat membantu karena @sendgrid/inbound-mail-parser tidak memiliki dokumentasi, namun itu tidak cukup berhasil untuk saya. Konstruktor untuk mailParse mengambil request sebagai parameter, bukan badan permintaan.

const parsing = new mailParse(config, req);

Hai @ero_cho ,

Kami memang memiliki paket di sini , tetapi sayangnya tidak ada dokumentasi penggunaan yang baik. Untuk itu, Anda mungkin ingin memeriksa Python Inbound Parser .

Salam hangat,

Elmer

Jadi, Anda harus menulis dokumentasi.

Bagaimana ini masih belum terdokumentasi

masih tidak bisa mengetahuinya dengan nodejs express ...

Membuka kembali karena masih belum ada contoh untuk ini di dokumen.

Permintaan pull untuk menambahkan fitur ini diterima dan akan ditinjau berdasarkan prioritas, tetapi Twilio SendGrid tidak secara aktif membangun fungsionalitas baru untuk perpustakaan.

Mencoba menerima keterikatan tetapi tetap tidak berhasil dengan itu ...

Mencoba menerima keterikatan tetapi tetap tidak berhasil dengan itu ...

Gunakan RAW

const config = {
          keys: ['to', 'from', 'subject', 'text', 'attachments']
        };
        const parsedMail = new parse(config, req); // req is https.Request type

        parsedMail.getRawEmail((rawMail: any) => {
           console.log(rawMail); // returns null or {}
       }

         parsedMail.attachments((attachmentData: Attachment[]) => {
              console.log('attachments1:'); // returns [ ]
              console.log(attachmentData);
              console.log(JSON.stringify(attachmentData));
            });

Saya mencoba itu tetapi tidak berhasil ... mengembalikan objek kosong dan ketika saya melakukan .attachments() saya juga mendapatkan array kosong.

Saya menggunakan fungsi cloud firebase, saya belum berhasil menggunakan parser email masuk dan saya menantikan beberapa dokumentasi yang dapat membantu saya menggunakan pustaka ...

Tetapi menggunakan busboy (dan tidak memilih "raw" dalam pengaturan Sendgrid) cukup berhasil, kecuali untuk satu masalah yang membuat saya mencoba menggunakan mailparser ...

Sendgrid mencantumkan pengkodean yang berbeda di bidang "charsets" seperti ini:
Sebuah email dari Gmail:
{"to": "UTF-8", "html": "UTF-8", "subject": "UTF-8", "from": "UTF-8", "text": "UTF-8" }
Email dari Outlook:
{"to": "UTF-8", "html": "iso-8859-1", "subject": "UTF-8", "from": "UTF-8", "text": "iso- 8859-1 "}

Ketika email berisi karakter internasional (seperti ÆØÅ), hasilnya adalah kolom teks dan html berisi tanda tanya, bukan karakter nordik yang sebenarnya.

Jika saya mengubah defCharset di busboy ke Windows-1252, nilai teks dan html akan ditampilkan dengan benar, tetapi kolom lain akan ditampilkan dengan salah.

Apakah ini juga akan menjadi masalah pada pengurai email, atau apakah pengurai email menangani penyandiaksaraan yang berbeda di bidang tersebut?

Kode saya untuk parsing menggunakan busboy untuk siapa pun yang tertarik:
(Jika ada yang bisa memberi tahu saya bagaimana saya menyelesaikan masalah di atas menggunakan busboy, saya akan berterima kasih ..)

exports.sendgridparse = functions.https.onRequest ((req, res) => {
jalur const = membutuhkan ('jalur');
const os = membutuhkan ('os');
const fs = membutuhkan ('fs');
const Busboy = membutuhkan ('busboy');

if (req.method !== 'POST') {
    // Return a "method not allowed" error
    return res.status(405).end();
}
const busboy = new Busboy({ headers: req.headers });    
const fields = {};
busboy.on('field', function(fieldname, value, fieldnameTruncated, valTruncated, encoding, mimetype){
    console.log('Busboy fild [' + fieldname + ']: value: ' + val);
fields[fieldname] = value;
});

biarkan imageToBeUploaded = {};
biarkan imagestobeuploaded = [];
biarkan imageFileName;

busboy.on ('file', (fieldname, file, filename, encoding, mimetype) => {
console.log (nama kolom, file, nama file, encoding, mimetype);

file.on ('data', function (data) {
console.log ('File [' + fieldname + '] mendapat' + data.length + 'bytes');
});
file.on ('end', function () {
console.log ('File [' + fieldname + '] Finished');
});

const imageExtension = namafile.split ('.') [namafile.split ('.') .panjang - 1];
imageFileName = ${Math.round(Math.random() * 1000000000000).toString()}.${imageExtension} ;
const filepath = path.join (os.tmpdir (), imageFileName);
const url = https://firebasestorage.googleapis.com/v0/b/${environment.firebase.storageBucket}/o/${imageFileName}?alt=media ;
imageToBeUploaded = {jalur file, mimetype, imageFileName, imageExtension, url};
imagestobeuploaded.push (imageToBeUploaded);
file.pipe (fs.createWriteStream (filepath));
});

busboy.on ('finish', async () => {
// semua field tersedia (imagestobeuploaded dan field) dan dapat disimpan ke db
res.send (200);
});
busboy.end (req.rawBody);
});

@hhetland jadi, apakah kamu bisa mendapatkan filenya menggunakan busboy? Saya juga menggunakannya untuk mendapatkan data lain dari email, tetapi tidak bisa mendapatkan file ... Apakah mendapatkan file tersebut cocok untuk Anda?

@ matheustavaresdev - Ya, saya mendapatkan file menggunakan busboy.

Pertama, mereka disimpan ke folder tmp di busboy.on ('file'), dan kemudian menggunakan informasi dalam variabel "imagestobeuploaded" Saya menyimpannya ke keranjang penyimpanan di firebase di busboy.on ('finish').

keren terima kasih!!!!!!!!!!!!

April 2020, masih belum ada dokumen resmi, bukan?

Saya tahu ini telah ditutup tetapi saya baru saja melihat masalah ini dan saya telah mengungkapkan dengan inbound-mail-parser yang berfungsi. Hal utama yang perlu saya lakukan adalah menggunakan perpustakaan multer untuk menangani input multipart / form-data dan kemudian menggunakan metode keyValues ​​() dari pustaka @ sendgrid / inbound-mail-parser seperti di bawah ini

membutuhkan di multer dan Sendgrid:

const multer = membutuhkan ('multer');
const upload = multer ();
const mailParse = membutuhkan ('@ sendgrid / inbound-mail-parser');

pada deklarasi router saya untuk metode POST, gunakan metode upload.none () karena saya baru saja mendapatkan teks (Tanpa lampiran):

router.post ('/ mail', upload.none (), function (req, res, next)

Dalam definisi POST itu saya kemudian menggunakan metode keyValues ​​() untuk mendapatkan bagian yang relevan dari email:

coba {
const config = {kunci: ['ke', 'dari', 'subjek', 'teks',]};
const parsing = new mailParse (config, req.body);
biarkan respon = parsing.keyValues ​​();
let to = response.to;
biarkan from = response.from;
biarkan subjek = respon.subject;
biarkan messageBody = response.text
console.log ('Ini adalah subjek dari email:', subjek);
}

Harapan itu ada gunanya.

Apa yang saya temukan adalah bahwa request.body ada dalam bentuk-data dan melihat kesalahan:
[Nest] 24687 - 05/01/2020, 1:29:51 PM [ExceptionHandler] Mengurangi array kosong tanpa nilai awal
TypeError: Mengurangi larik kosong tanpa nilai awal
di Array.reduce ()

Kode:
keyValues ​​() {
kembalikan this.keys
.filter (key => this.payload [key])
.map (key => ({[key]: this.payload [key]}))
.reduce ((keyValues, keyPayload) => Object.assign (keyValues, keyPayload));
}

mengembalikan kesalahan karena this.payload bukanlah data terstruktur tetapi merupakan data formulir multi-bagian.

Saya tidak bisa melakukan ini dengan nest-js. Data webhook yang saya terima di pengontrol NestJS adalah data multi-bentuk. Saya tidak yakin bagaimana menggunakan Multer dalam kasus itu.

outer.post ('/ mail', upload.none (), function (req, res, next)

Saya mencoba melakukan ini:

export class MultiformParser implements NestMiddleware { async use(req: Request, res: Response, next: Function) { console.log("before: ", req.body) var upload = multer(); await new Promise((resolve, reject) => { upload.none()(req, res, err => { if (err) { console.log(err) reject(err) } else { resolve() console.log("request: ", req.body) } }); }); console.log("after: ", req.body) next(); } }

Namun, req.body mengembalikan:
request: [Object: null prototype] {}

Sebelum mencetak data beraneka ragam.

Berikut adalah perubahan yang harus saya lakukan agar saya bisa menggunakan multer:

app.use (express.json ())
app.use (express.urlencoded ({extended: true}));
const upload = multer ();
app.use (upload.none ());

Setelah saya melakukan ini, saya dapat menggunakan multer untuk mengurai data webhook menjadi file
kunci terstruktur, pasangan nilai.

Pada hari Minggu, 24 Mei 2020 jam 16.51 Notifikasi Mohd
menulis:

Jika Anda tidak menggunakan server (fungsi cloud google atau firebase)
ini mungkin membantu:
https://stackoverflow.com/questions/47242340/how-to-perform-an-http-file-upload-using-express-on-cloud-functions-for-firebase/48648805#48648805

Gunakan Formidable untuk mem-parsing multipart pada tanpa server:
https://github.com/DanisHack/formidable-serverless

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/sendgrid/sendgrid-nodejs/issues/482#issuecomment-633312295 ,
atau berhenti berlangganan
https://github.com/notifications/unsubscribe-auth/AB2ATHHFKBRZZDGGJ2D7SOLRTGQHNANCNFSM4D67CVZQ
.

-

Shweta Bhandare, PhD | Insinyur Perangkat Lunak Utama

[email protected]

https://hicleo.com/
hicleo.com | Linkedin https://www.linkedin.com/company/hicleo/ | Indonesia
https://twitter.com/hi_cleo/ | Instagram
https://www.instagram.com/hicleo.co/ | Facebook
https://www.facebook.com/hicleolabs

-

Pesan ini mungkin berisi rahasia, hak milik, atau dilindungiinformasi.
Jika Anda menerima pesan ini karena kesalahan,tolong beri tahu pengirim melalui email balasan dan hapus pesan ini.

Kami menghabiskan banyak waktu untuk mencoba membuatnya berfungsi di Google Cloud Functions dengan Busboy dan tidak dapat mewujudkannya, apa pun tutorial atau petunjuk yang kami ikuti.

Jadi saya akan meninggalkan ini di sini untuk orang berikutnya dalam situasi serupa di mana Anda memiliki sedikit fleksibilitas: gunakan Python Inbound Parser . Itu adalah pekerjaan salin / tempel dari kode yang mereka berikan dan membutuhkan waktu kurang dari satu jam untuk menjalankannya.

Saya tahu ini tidak menyelesaikan masalah di sini, tapi saya harap ini bisa menyelamatkan orang lain dari headbanging berjam-jam.

Saya senang saya menemukan tiket ini ... Saya menjadi gila mencoba menemukan beberapa dokumentasi tentang ini, dan entah bagaimana tidak ada .

Saya benar-benar bingung. Saya hanya berasumsi akan ada dokumentasi standar - terutama karena meskipun ini open source, ia didukung oleh SendGrid (dan akhirnya Twilio, yang memiliki dokumentasi fantastis).

Untuk sesuatu yang sederhana seperti ini, Anda akan membayangkan setidaknya ada sebuah contoh.

Meskipun demikian, bagi siapa pun yang menemukan ini ...

Saya merekomendasikan menggunakan MailParser sebagai gantinya.

Saya cukup yakin ini menggunakannya di bawah tenda, tetapi setidaknya MailParser memiliki banyak dokumentasi. Pastikan bahwa dalam pengaturan parse masuk Anda memiliki POST the raw, full MIME message diperiksa seperti yang ditunjukkan di bawah ini (_wow, contoh_).

Example

Membaca dokumen MailParser, saya mendapatkan ini dalam beberapa menit:

import { Request, Response } from "express";
import { simpleParser } from "mailparser";

export const inboundEmails = async (req: Request, res: Response) => {
  const parsedEmail = await simpleParser(req.body.email);

  console.log("subject", parsedEmail.subject);
  console.log("from", parsedEmail.from);
  console.log("to", parsedEmail.to);
  console.log("cc", parsedEmail.cc);
  console.log("bcc", parsedEmail.bcc);
  console.log("date", parsedEmail.date);
  console.log("messageId", parsedEmail.messageId);
  console.log("inReplyTo", parsedEmail.inReplyTo);
  console.log("replyTo", parsedEmail.replyTo);
  console.log("references", parsedEmail.references);
  console.log("html", parsedEmail.html);
  console.log("text", parsedEmail.text);
  console.log("textAsHtml", parsedEmail.textAsHtml);
  console.log("attachments", parsedEmail.attachments);

  res.sendStatus(200);
};

Semua data sesuai keinginan Anda.

Saya juga menggunakan middleware Multer untuk mengurai multipart / form-data yang dikirim SendGrid ke titik akhir saya.

Ini sesederhana multer().any() dalam aliran middleware Anda.

Bersulang

Saya menggunakan pesan MIME lengkap mentah dan membuatnya berfungsi dengan simpleParser, tetapi saya beralih kembali ke versi yang diproses dan menggunakan parser inbound-mail-sengrid karena simpleParser tidak mengonversi MIME menjadi teks dan html dengan baik.

Pasti membutuhkan beberapa dokumentasi.

@theweiweiway Apakah Anda keberatan memposting contoh perbedaan teks dan html antara kedua metode tersebut? Saya belum melihat adanya perbedaan dan saya penasaran.

untuk teks

Hi 123 Hi 123 Hi 123 www.hello.com

vs.

Hi 123 Hi 123 Hi 123 www. <http://www.hello.com/>hello <http://www.hello.com/>.com <http://www.hello.com/>

^ tidak tahu mengapa itu terjadi

untuk html

<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi 123<div class=""><b class="">Hi 123</b></div><div class=""><b class=""><u class="">Hi 123</u></b></div><div class=""><b class=""><u class="">www.</u>hello</b>.com</div></body></html>

vs.

<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">Hi 123</span><div class="" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);"><b class="">Hi 123</b></div><div class="" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);"><b class=""><u class="">Hi 123</u></b></div><div class="" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);"><b class=""><u class=""><a href="http://www.hello.com" class="">www.</a></u><a href="http://www.hello.com" class="">hello</a></b><a href="http://www.hello.com" class="">.com</a></div></body></html>

Saya pikir ini lebih berkaitan dengan paket simpleParser

Inilah repo express-sendgrid-inbound-parse saya menggunakan express / multer. Ini adalah aplikasi yang mudah untuk Anda mulai. Saya sarankan untuk tidak mencentang POST the raw, full MIME message karena Anda dapat mengakses lebih banyak data email.

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'])
}

mencoba ini di fungsi cloud firebase.
Tidak bekerja dengan pasti.
Ada solusi lain?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat