Sendgrid-nodejs: рдЖрдиреЗ рд╡рд╛рд▓реЗ рдИрдореЗрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирдмрд╛рдЙрдВрдб-рдореЗрд▓-рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдЙрджрд╛рд╣рд░рдг

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдЕрдХреНрддреВре░ 2017  ┬╖  35рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: sendgrid/sendgrid-nodejs

рд╕рд╛рд░рд╛рдВрд╢ рдЬрд╛рд░реА рдХрд░реЛ

рдореБрджреНрджреЗ рдФрд░ рдЙрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЙрдкрдпреБрдХреНрдд рд╣реЛ, рддреЛ рдмрдЧ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрджрдо рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред рдХреГрдкрдпрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ, рд╕реНрдХреНрд░реИрдирд╛рд╕реНрдЯ, рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рдореИрдВ рдЗрдирдмрд╛рдЙрдВрдб рдИрдореЗрд▓ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @ sendgrid / inbound-mail-parser рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдирдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдкреНрд░рдЬрдирди рдХрд░рдиреЗ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛

Sendgrid рдореЗрдВ рдПрдХ рдкрд╛рд░реНрд╕ рдорд╛рд░реНрдЧ рд╕реЗрдЯ рдХрд░реЗрдВ (рдпрд╣рд╛рдВ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
https://www.dropbox.com/s/cb6lwrmon9qwjzq/Screenshot%202017-10-12%2016.03.49.png?dl=0)
рдпрд╣ рдорд╛рд░реНрдЧ рдореЗрдВ рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдИрдореЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:
https://gist.github.com/machinshin/e38cf7d20ec6319edcfda63ffnaca9494

рдореИрдВрдиреЗ рдЕрдкрдиреЗ webhook рдореЗрдВ parseroute рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реИ:

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(`-------------`)

}

{}

рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, req.body рдЦрд╛рд▓реА рд╣реИ, рдФрд░ req.rawBody 'рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд' рд╣реИ
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдХрдЪреНрдЪреЗ рдИрдореЗрд▓ рдбреЗрдЯрд╛ рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рди рд╣реА рдЙрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдмрд╛рдж рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЗрдирдмрд╛рдЙрдВрдб-рдореЗрд▓-рдкрд╛рд░реНрд╕рд░ рдХреЛ рдХреИрд╕реЗ рддреНрд╡рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ

рдХреЛрдИ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдЬрд┐рд╕реЗ рдЖрдк рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЬрд╛ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЖрдк рдЗрд╕реЗ рдмрдЧ рдХреНрдпреЛрдВ рдорд╛рдирддреЗ рд╣реИрдВ? рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ?

рддрдХрдиреАрдХреА рдЬрд╛рдирдХрд╛рд░реА:

  • sendgrid-nodejs рд╕рдВрд╕реНрдХрд░рдг: 6.1.4 (рдирд╡реАрдирддрдо рдкреНрд░рддрд┐рдмрджреНрдз: 4c6d1cc)
  • Node.js рд╕рдВрд╕реНрдХрд░рдг: 4.1.2
    "@ рд╕реЗрдВрдЧреНрд░реЗрдбрд┐рдб / рдЗрдирдмрд╛рдЙрдВрдб-рдореЗрд▓-рдкрд╛рд░реНрд╕рд░": "^ 6.1.4",
    "@ sendgrid / mail": "^ 6.1.4",
easy help wanted docs update

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдп @ZeroCho ,

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ , рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рд╣реИред рдЙрд╕рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╛рдпрдерди рдЗрдирдмрд╛рдЙрдВрдб рдкрд╛рд░реНрд╕рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╢реБрднрдХрд╛рдордирд╛рдПрдВ,

рдПрд▓реНрдорд░

рддреЛ рдЖрдкрдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рднреА 35 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдирдорд╕реНрддреЗ @ рдордорд╛рд╢рд┐рди ,

рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдЧреЗ рдХреЗ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдмреИрдХрд▓реЙрдЧ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреИрд╕реЗред

рд╣рд╛рдп @ZeroCho ,

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ , рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рд╣реИред рдЙрд╕рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╛рдпрдерди рдЗрдирдмрд╛рдЙрдВрдб рдкрд╛рд░реНрд╕рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╢реБрднрдХрд╛рдордирд╛рдПрдВ,

рдПрд▓реНрдорд░

SendGrid рдкреНрд░рдкрддреНрд░ / рдмрд╣реБ-рднрд╛рдЧ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХреЗ JSON рдЗрдирдмрд╛рдЙрдВрдб рдкрд╛рд░реНрд╕ рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИред рдпрд╣ req.body рджреНрд╡рд╛рд░рд╛ рддреБрд░рдВрдд рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдмреЙрдбреА-рдкрд╛рд░реНрд╕рд░ рдЙрд╕ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдореБрд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

@ shishido92 рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреЛрдбрдЬ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдкрд╛рд░реНрд╕ рдЗрдирдмрд╛рдЙрдВрдб рдИрдореЗрд▓ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕рд┐рд░реНрдл рд╢реВрдиреНрдп рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

@stephenfjohnson @machinshin рдЖрдк expressjs рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдорджрдж

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

рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреА рд╕рд╛рдордЧреНрд░реА рдорд┐рд▓ рдЬрд╛рдПрдЧреАред
рдпрд╣ рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрд▓рдЧреНрдирдХ рдХреА рдЕрдирджреЗрдЦреА рдХрд░рддрд╛ рд╣реИред

@nathfreder рд╣рдо рдЕрдкрдиреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдореБрджреНрджреЗ рд╕рд╛рд░рд╛рдВрд╢ рдкрд░ рдЕрдВрдЧреВрдареЗ-рдЕрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ ЁЯСН рджреЗрдВред

@ рдмрдЪрдХрд╛рдирд╛-рд╕рд╛рдВрдмрд┐рдиреЛ, @ рд╕рддреНрдпрдЬреАрддрдЬрдзрд╡ amb

рдмрд╛рдж рдореЗрдВ рджреЗрд░ рд╕реЗ рдХрднреА рдирд╣реАрдВ;)
рдЕрджреНрдпрддрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмрдВрдж рдХрд░рдирд╛

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЗрдирдмрд╛рдЙрдВрдб рдореЗрд▓-рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдорд▓реНрдЯреАрд░рдЯ / рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рдЗрдирдкреБрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрд▓рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдереА рдХрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП @ sendgrid / inbound-mail-parser рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ keyValues тАЛтАЛ() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдкрд┐рдШрд▓рд╛рдиреЗ рдФрд░ Sendgrid рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

const multer = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('multer');
const рдЕрдкрд▓реЛрдб = multer ();
const mailParse = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('@ sendgrid / inbound-mail-parser');

POST рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд░рд╛рдЙрдЯрд░ рдШреЛрд╖рдгрд╛ рдкрд░ upload.none () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдкрд╛рда (рдХреЛрдИ рдЕрдиреБрд▓рдЧреНрдирдХ рдирд╣реАрдВ) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рдерд╛:

рд░рд╛рдКрдЯрд░.рдкреЛрд╕реНрдЯ ('/ рдореЗрд▓', upload.none (), рдлрдВрдХреНрд╢рди (req, res, next)

рдЙрд╕ POST рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рднреАрддрд░, рдореИрдВ рддрдм рдИрдореЗрд▓ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рднрд╛рдЧреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП keyValues тАЛтАЛ() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

рдкреНрд░рдпрддреНрди {
const config = {keys: ['to', 'from', 'subject', 'text',]};
const parsing = new mailParse (config, req.body);
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВ = parsing.keyValues тАЛтАЛ();
let = response.to;
рдЪрд▓реЛ рд╕реЗ = response.from;
let рд╡рд┐рд╖рдп = response.subject;
рд╕рдВрджреЗрд╢ рджреЗрдВрдмреЙрдбреА = response.text
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ('рдпрд╣ рдореЗрд▓ рд╕реЗ рд╡рд┐рд╖рдп рд╣реИ:', рд╡рд┐рд╖рдп);
}

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдХрд╛рдо рдХрд╛ рд╣реИред

рд╣рд╛рдп рд╕рдм, рдХреНрдпрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╕рдВрд▓рдЧреНрдирдХ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ? рдореИрдВ рдПрдХ рд╣реА рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдЕрдЯреВрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ


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);
});

@ Jhorsfield-tw рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб @sendgrid/inbound-mail-parser рдкрд╛рд╕ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред mailParse рд▓рд┐рдП рдирд┐рд░реНрдорд╛рддрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ request рд▓реЗрддрд╛ рд╣реИ рдЕрдиреБрд░реЛрдз рд╢рд░реАрд░ рдирд╣реАрдВред

const parsing = new mailParse(config, req);

рд╣рд╛рдп @ZeroCho ,

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ , рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рд╣реИред рдЙрд╕рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╛рдпрдерди рдЗрдирдмрд╛рдЙрдВрдб рдкрд╛рд░реНрд╕рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╢реБрднрдХрд╛рдордирд╛рдПрдВ,

рдПрд▓реНрдорд░

рддреЛ рдЖрдкрдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдЕрднреА рднреА рдХреИрд╕реЗ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ

рдЕрднреА рднреА рдиреЛрдбрдЬ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ ...

рдбреЙрдХреНрд╕ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ред

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ рдФрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдирдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдЯреНрд╡рд┐рд▓рд┐рдпреЛ рд╕реЗрдВрдбрдЧреНрд░рд┐рдб рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЕрдиреБрд▓рдЧреНрдирдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЙрд╕ рдХреЗ рд╕рд╛рде рднрд╛рдЧреНрдп рдирд╣реАрдВ ...

рдЕрдиреБрд▓рдЧреНрдирдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЙрд╕ рдХреЗ рд╕рд╛рде рднрд╛рдЧреНрдп рдирд╣реАрдВ ...

рд░реЙ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ

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));
            });

рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐рдВрддреБ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднрд╛рдЧреНрдп рдХреЗ ... рдпрд╣ рдПрдХ рдЦрд╛рд▓реА рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЬрдм рдореИрдВ .attachments() рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рднреА рдорд┐рд▓рддреА рд╣реИред

рдореИрдВ рдлрд╛рдпрд░рдмреЗрд╕ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рдЗрдирдмрд╛рдЙрдВрдб рдореЗрд▓ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдлрд▓рддрд╛ рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИ рдФрд░ рдореИрдВ рдХреБрдЫ рдкреНрд░рд▓реЗрдЦрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...

рд▓реЗрдХрд┐рди Busboy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдФрд░ Sendgrid рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ "рдХрдЪреНрдЪреЗ" рдХреЛ рдЕрдЪрдпрдирд┐рдд рдХрд░рдирд╛) рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдПрдХ рдореБрджреНрджреЗ рдХреЗ рдЬреЛ рдореБрдЭреЗ mailparser рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдХрд░рддрд╛ рд╣реИ ...

Sendgrid рдЗрд╕ рддрд░рд╣ рд╕реЗ "charsets" рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ:
рдЬреАрдореЗрд▓ рдХрд╛ рдПрдХ рдИрдореЗрд▓:
{"to": "UTF-8", "html": "UTF-8", "рд╡рд┐рд╖рдп": "UTF-8", "from": "UTF-8", "text": "UTF-8" }
рдЖрдЙрдЯрд▓реБрдХ рд╕реЗ рдПрдХ рдИрдореЗрд▓:
{"to": "UTF-8", "html": "iso-8859-1", "рд╡рд┐рд╖рдп": "UTF-8", "from": "UTF-8", "text": "iso- 8859-1 "}

рдЬрдм рдИрдореЗрд▓ рдореЗрдВ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдп рд╡рд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ ├Ж├Ш├Е) рддреЛ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рда рдФрд░ html рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреЙрд░реНрдбрд┐рдХ рд╡рд░реНрдгреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрди рд╣реЛрддреЗ рд╣реИрдВред

рдЕрдЧрд░ рдореИрдВ рдбрд┐рдлрд╝реЙрд░реНрд╕реЗрдЯ рдХреЛ рдмрд╕рдмреЙрдпрдЯ рдореЗрдВ рдмрджрд▓ рдХрд░ Windows-1252 рдореЗрдВ рдХрд░реВрдБ рддреЛ рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ HTML рд╡реИрд▓реНрдпреВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рджрд┐рдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдлреАрд▓реНрдб рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рджрд┐рдЦреЗрдВрдЧреЗред

рдХреНрдпрд╛ рдпрд╣ рдореЗрд▓ рдкрд╛рд░реНрд╕рд░ рдкрд░ рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдореЗрд▓ рдкрд╛рд░реНрд╕рд░ рдЦреЗрддреЛрдВ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдирдХреЛрдбрд┐рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ?

рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╕рдмреЙрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдХреЛрдб:
(рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреИрд╕реЗ рдмрд╕рдмреЙрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдКрдкрд░ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ ..)

Export.sendgridparse = functions.https.onRequest ((req, res) => {
const path = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('path');
const os = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('os');
const fs = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('fs');
const Busboy = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('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;
});

let рдЗрдореЗрдЬрдЯреЙрдмреАрдкрд▓реЛрдбреЗрдб = {};
рдмрддрд╛ рджреЗрдВ рдХрд┐ рдЗрдореЗрдЬрд╕реНрдЯреЛрдмреБрдкреЛрдбреЗрдб = [];
рдЖрдЬреНрдЮрд╛ рджреЗрдирд╛

Busboy.on ('рдлрд╝рд╛рдЗрд▓', (рдлрд╝реАрд▓реНрдбрдирд╛рдо, рдлрд╝рд╛рдЗрд▓, рдлрд╝рд╛рдЗрд▓ рдирд╛рдо, рдПрдиреНрдХреЛрдбрд┐рдВрдЧ, mimetype) => {
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (рдлрд╝реАрд▓реНрдбрдирд╛рдо, рдлрд╝рд╛рдЗрд▓, рдлрд╝рд╛рдЗрд▓ рдирд╛рдо, рдПрдиреНрдХреЛрдбрд┐рдВрдЧ, mimetype);

file.on ('рдбреЗрдЯрд╛', рдлрдВрдХреНрд╢рди (рдбреЗрдЯрд╛) {
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ('рдлрд╝рд╛рдЗрд▓ [' + fieldname + '] рдХреЛ' + data.length + 'рдмрд╛рдЗрдЯреНрд╕' рдорд┐рд▓рд╛;
};
file.on ('рдЕрдВрдд', рдлрд╝рдВрдХреНрд╢рди () {
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ('рдлрд╝рд╛рдЗрд▓ [' + рдлрд╝реАрд▓реНрдбрдирд╛рдо + '] рд╕рдорд╛рдкреНрдд');
};

const imageExtension = filename.split ('ред') [filename.split ('ред' ') рд▓рдВрдмрд╛рдИ - 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 = {filepath, mimetype, imageFileName, imageExtension, url};
Imagestobeuploaded.push (imageToBeUploaded);
file.pipe (fs.createWriteStream (filepath));
};

Busboy.on ('рдЦрддреНрдо', async () => {
// рд╕рднреА рдлрд╝реАрд▓реНрдб рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рдЗрдореЗрдЬрд╕реНрдЯреЛрдмреБрдкреЛрдбреНрдб рдФрд░ рдлрд╝реАрд▓реНрдб) рдФрд░ рдбреАрдмреА рдкрд░ рд╕рд╣реЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
res.send (200);
};
Busboy.end (req.rawBody);
};

@ рд╢реЗрдЯрд▓реИрдВрдб рддреЛ, рдХреНрдпрд╛ рдЖрдк

@matheustavaresdev - рд╣рд╛рдВ, рдореБрдЭреЗ

рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ Busboy.on ('рдлрд╝рд╛рдЗрд▓') рдореЗрдВ рдПрдХ tmp рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЪрд░ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "Imagestobeuploaded" рдореИрдВ рдЗрд╕реЗ busboy.on ('finish')) рдореЗрдВ рдлрд╛рдпрд░рдмреИрд╕ рдореЗрдВ рд╕реНрдЯреЛрд░реЗрдЬ рдмрд╛рд▓реНрдЯреА рдореЗрдВ рд╕реЗрд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдзрдиреНрдпрд╡рд╛рдж!!!!!!!!!!!!

рдЕрдкреНрд░реИрд▓ 2020, рдЕрднреА рднреА рдХреЛрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛?

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЗрдирдмрд╛рдЙрдВрдб рдореЗрд▓-рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдорд▓реНрдЯреАрд░рдЯ / рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рдЗрдирдкреБрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрд▓рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдереА рдХрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП @ sendgrid / inbound-mail-parser рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ keyValues тАЛтАЛ() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдкрд┐рдШрд▓рд╛рдиреЗ рдФрд░ Sendgrid рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

const multer = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('multer');
const рдЕрдкрд▓реЛрдб = multer ();
const mailParse = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('@ sendgrid / inbound-mail-parser');

POST рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд░рд╛рдЙрдЯрд░ рдШреЛрд╖рдгрд╛ рдкрд░ upload.none () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдкрд╛рда (рдХреЛрдИ рдЕрдиреБрд▓рдЧреНрдирдХ рдирд╣реАрдВ) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рдерд╛:

рд░рд╛рдКрдЯрд░.рдкреЛрд╕реНрдЯ ('/ рдореЗрд▓', upload.none (), рдлрдВрдХреНрд╢рди (req, res, next)

рдЙрд╕ POST рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рднреАрддрд░, рдореИрдВ рддрдм рдИрдореЗрд▓ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рднрд╛рдЧреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП keyValues тАЛтАЛ() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

рдкреНрд░рдпрддреНрди {
const config = {keys: ['to', 'from', 'subject', 'text',]};
const parsing = new mailParse (config, req.body);
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВ = parsing.keyValues тАЛтАЛ();
let = response.to;
рдЪрд▓реЛ рд╕реЗ = response.from;
let рд╡рд┐рд╖рдп = response.subject;
рд╕рдВрджреЗрд╢ рджреЗрдВрдмреЙрдбреА = response.text
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ('рдпрд╣ рдореЗрд▓ рд╕реЗ рд╡рд┐рд╖рдп рд╣реИ:', рд╡рд┐рд╖рдп);
}

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдХрд╛рдо рдХрд╛ рд╣реИред

рдореБрдЭреЗ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ request.body рдлрд╛рд░реНрдо-рдбреЗрдЯрд╛ рдореЗрдВ рд╣реИ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрдЦреЗрдВ:
[рдШреЛрдВрд╕рд▓рд╛] реирекрем Nest Nest - режрел/режрез/реирежреиреж, рез:реи реп .релреж рдмрдЬреЗ рдкреНрд░рдзрд╛рдирдордВрддреНрд░реА
TypeError: рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЗ рдЦрд╛рд▓реА рд╕рд░рдгреА рдХреЛ рдХрдо рдХрд░рдирд╛
Array.reduce рдкрд░ ()

рдХреЛрдб:
рдХреАрд╡рд▓реНрд╕ () {
рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ
.filter (рдХреБрдВрдЬреА => this.payload [рдХреБрдВрдЬреА])
.map (рдХреБрдВрдЬреА => ({[рдХреБрдВрдЬреА]: рдпрд╣ред рд▓реЛрдб [рдХреБрдВрдЬреА]}))
.reduce ((keyValues, keyPayload) => Object.assign (keyValues, keyPayload);
}

рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд▓реЛрдб рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБ-рднрд╛рдЧ рдкреНрд░рдкрддреНрд░ рдбреЗрдЯрд╛ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛ред рдиреЗрд╕реНрдЯрдЬреЗрдПрд╕ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдореБрдЭреЗ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╡реЗрдмрд╣реВрдХ рдбреЗрдЯрд╛ рдорд▓реНрдЯреА-рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рд╣реИред рдореИрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ рдХрд┐ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореБрд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЖрдЙрдЯрд░.рдкреЛрд╕реНрдЯ ('/ рдореЗрд▓', рдЕрдкрд▓реЛрдб.рдиреЛрди (), рдлрдВрдХреНрд╢рди (рд░реАрдХ, рд░рд┐рд╕, рдиреЗрдХреНрд╕реНрдЯ)

рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:

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(); } }

рд╣рд╛рд▓рд╛рдБрдХрд┐, req.body рд░рд┐рдЯрд░реНрди:
request: [Object: null prototype] {}

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдорд▓реНрдЯреАрдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдкреНрд░рд┐рдВрдЯ рд╣реЛ рдЬрд╛рдПред

рдпрджрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рд╣реИрдВ (Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдпрд╛ рдлрд╛рдпрд░рдмреЗрд╕)

рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ: https://stackoverflow.com/questions/47242340/how-to-perform-an-http-file-upload-use-express-on-cloud-functions-for-firebase-48648805#48648805

рдпрд╣ рдмрд╕рдмреЙрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ: https://stackoverflow.com/questions/51484307/how-to-parse-multipart-form-data-on-firebase-cloud-functions

рд╕рд░реНрд╡рд░рд╣рд┐рдд рдкрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдорд┐рдбреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: https://github.com/DanisHack/formidable-serverless

рдпрд╛ рдпрд╣: https://github.com/cristovao-trevisan/express-multipart-file-parser

рдпрд╣рд╛рдВ рдореИрдВ рдмрджрд▓рд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдореИрдВ рдореБрд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреВрдВ:

app.use (express.json ())
app.use (express.urlencoded ({рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд: рд╕рддреНрдп}));
const рдЕрдкрд▓реЛрдб = multer ();
app.use (upload.none ());

рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛, рддреЛ рдореИрдВ webhook рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП multer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛
рд╕рдВрд░рдЪрд┐рдд рдХреБрдВрдЬреА, рдореВрд▓реНрдп рдЬреЛрдбрд╝реАред

рд╕реВрд░реНрдп рдкрд░, 24 рдордИ, 2020 рдХреЛ рд╢рд╛рдо 4:51 рдмрдЬреЗ рджрд╛рдирд┐рд╢ рдореЛрд╣рдореНрдордж рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдпрджрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рд╣реИрдВ (Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдпрд╛ рдлрд╛рдпрд░рдмреЗрд╕)
рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
https://stackoverflow.com/questions/47242340/how-to-perform-an-http-file-upload-use-express-on-cloud-functions-for-firebase/48648805#48648805

рд╕рд░реНрд╡рд░рд╣рд┐рдд рдкрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдорд┐рдбреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
https://github.com/DanisHack/formidable-serverless

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/sendgrid/sendgrid-nodejs/issues/482#issuecomment-633312295
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AB2ATHHFKBRZZDGGJ2D7SOLRTGQHNANCNFSM4D67CVZQ
ред

-

рд╢реНрд╡реЗрддрд╛ рднрдВрдбрд╛рд░реЗ, рдкреАрдПрдЪрдбреА | рдкреНрд░рдзрд╛рди рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдЬреАрдирд┐рдпрд░

[email protected]

https://hicleo.com/
hicleo.com | рд▓рд┐рдВрдХреНрдбрдЗрди https://www.linkedin.com/company/hicleo/ | рдЯреНрд╡рд┐рдЯрд░
https://twitter.com/hi_cleo/ | рдЗрдВрд╕реНрдЯрд╛рдЧреНрд░рд╛рдо
https://www.instagram.com/hicleo.co/ | рдлреЗрд╕рдмреБрдХ
https://www.facebook.com/hicleolabs

-

рдЗрд╕ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЧреЛрдкрдиреАрдп, рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдпрд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВрдЬрд╛рдирдХрд╛рд░реАред
рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╣ рд╕рдВрджреЗрд╢ рдЧрд▓рддреА рд╕реЗ рдорд┐рд▓рд╛ рд╣реИ,рдХреГрдкрдпрд╛ рдкреНрд░реЗрд╖рдХ рдХреЛ рдЙрддреНрддрд░ рдИрдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред

рд╣рдордиреЗ рдмрд╕ рдХреНрд▓рд╛рдЙрдб рдХреЗ рд╕рд╛рде Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдордиреЗ рдХрд┐рд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдпрд╛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ред

рддреЛ рдореИрдВ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдРрд╕реА рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛ рдЬрд╣рд╛рдБ рдЖрдкрдХреЗ рдкрд╛рд╕ рдереЛрдбрд╝рд╛ рд▓рдЪреАрд▓рд╛рдкрди рд╣реИ: рдкрд╛рдпрдерди рдЗрдирдмрд╛рдЙрдВрдб рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреЛрдб рд╕реЗ рдХреЙрдкреА / рдкреЗрд╕реНрдЯ рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдерд╛ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдВрдЯреЗ рд╕реЗ рдХрдо рд╕рдордп рд▓рдЧрд╛ред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдШрдВрдЯреЗ рдХреЗ рд╣реЗрдбрдмреИрдВрдЧ рдХреЛ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдЯрд┐рдХрдЯ рдорд┐рд▓рд╛ ... рдореИрдВ рдЗрд╕ рдкрд░ рдХреБрдЫ рдкреНрд░рд▓реЗрдЦрди рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ ред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрдХрд┐рдд рд╣реВрдБред рдореИрдВрдиреЗ рдЕрднреА рдпрд╣ рдорд╛рдирд╛ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреНрд░рд▓реЗрдЦрди рд╣реЛрдЧрд╛ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИ, рдпрд╣ рд╕реЗрдВрдбрдЧреНрд░рд┐рдб (рдФрд░ рдЕрдВрддрддрдГ рдЯреНрд╡рд┐рд▓рд┐рдпреЛ, рдЬрд┐рд╕рдХрд╛ рд╢рд╛рдирджрд╛рд░ рдкреНрд░рд▓реЗрдЦрди рд╣реИ) рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред

рдЗрд╕ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛ред

рдмрд╣рд░рд╣рд╛рд▓, рдЬреЛ рднреА рдЗрд╕ рдкрд╛рд░ рдЖрддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП ...

рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп MailParser рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рд╣реБрдб рдХреЗ рддрд╣рдд рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо MailParser рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рднрд╛рд░ рд╣реИред рдмрд╕ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдЗрдирдмрд╛рдЙрдВрдб рдкрд╛рд░реНрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ POST the raw, full MIME message рдЬрд╛рдБрдЪ рдиреАрдЪреЗ рджрд░реНрд╢рд╛рдИ рдЧрдИ рд╣реИ (_wow, рдПрдХ рдЙрджрд╛рд╣рд░рдг)ред

Example

MailParser рдбреЙрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдирд╛, рдореБрдЭреЗ рдпрд╣ рдорд┐рдирдЯреЛрдВ рдореЗрдВ рдорд┐рд▓ рдЧрдпрд╛:

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);
};

рд╕рднреА рдбреЗрдЯрд╛ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

рдореИрдВ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ / рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рдХреЛ рд╕реЗрдВрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрд▓реНрдЯрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛

рдпрд╣ рдЖрдкрдХреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рднреАрддрд░ multer().any() рдЬрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИред

рдЪрд┐рдпрд░реНрд╕

рдореИрдВрдиреЗ рдХрдЪреНрдЪреЗ рдкреВрд░реНрдг MIME рд╕рдВрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ simpleParser рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рдкрд╕ рд╕рдВрд╕рд╛рдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ sengrid рдХреЗ рдЗрдирдмрд╛рдЙрдВрдб-рдореЗрд▓-рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ simpleParser MIME рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ html рдореЗрдВ рдЕрдЪреНрдЫреЗ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдкреНрд░рд▓реЗрдЦрди рдХреА рдЬрд░реВрд░рдд рд╣реИред

@theweiweiway рдХреНрдпрд╛ рдЖрдк рджреЛ рддрд░реАрдХреЛрдВ рдХреЗ рдмреАрдЪ рдкрд╛рда рдореЗрдВ рдЕрдВрддрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдФрд░ html рдорди? рдореИрдВрдиреЗ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВред

рдкрд╛рда рдХреЗ рд▓рд┐рдП

Hi 123 Hi 123 Hi 123 www.hello.com

рдмрдирд╛рдо

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

^ рдбрдирдиреЛ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реБрдЖ

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>

рдмрдирд╛рдо

<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>

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ simpleParser рдкреИрдХреЗрдЬ рдерд┐рдпреЛ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╣реИ

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд░реЗрдкреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╕реЗрдВрдЧреНрд░реЗрдбрд┐рдб-рдЗрдирдмрд╛рдЙрдВрдб-рдкрд╛рд░реНрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╕ / рдореБрд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди рдРрдк рд╣реИред рдореИрдВ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк POST the raw, full MIME message рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд░рд╣реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрдзрд┐рдХ рдИрдореЗрд▓ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред

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

рдлрд╛рдпрд░рдмреЗрд╕ рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рди рдкрд░ рдЗрд╕реЗ рдЖрдЬрдорд╛рдпрд╛ред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдордд рдХрд░реЛред
рдХреЛрдИ рдФрд░ рдЙрдкрд╛рдп?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕