рдореБрджреНрджреЗ рдФрд░ рдЙрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЙрдкрдпреБрдХреНрдд рд╣реЛ, рддреЛ рдмрдЧ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрджрдо рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред рдХреГрдкрдпрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ, рд╕реНрдХреНрд░реИрдирд╛рд╕реНрдЯ, рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред
рдореИрдВ рдЗрдирдмрд╛рдЙрдВрдб рдИрдореЗрд▓ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @ 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 'рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд' рд╣реИ
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдХрдЪреНрдЪреЗ рдИрдореЗрд▓ рдбреЗрдЯрд╛ рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рди рд╣реА рдЙрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдмрд╛рдж рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЗрдирдмрд╛рдЙрдВрдб-рдореЗрд▓-рдкрд╛рд░реНрд╕рд░ рдХреЛ рдХреИрд╕реЗ рддреНрд╡рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ
рдХреЛрдИ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдЬрд┐рд╕реЗ рдЖрдк рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЬрд╛ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЖрдк рдЗрд╕реЗ рдмрдЧ рдХреНрдпреЛрдВ рдорд╛рдирддреЗ рд╣реИрдВ? рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ?
рдирдорд╕реНрддреЗ @ рдордорд╛рд╢рд┐рди ,
рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдЧреЗ рдХреЗ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдмреИрдХрд▓реЙрдЧ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреИрд╕реЗред
рд╣рд╛рдп @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
ред
-
рд╢реНрд╡реЗрддрд╛ рднрдВрдбрд╛рд░реЗ, рдкреАрдПрдЪрдбреА | рдкреНрд░рдзрд╛рди рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдЬреАрдирд┐рдпрд░
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, рдПрдХ рдЙрджрд╛рд╣рд░рдг)ред
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'])
}
рдлрд╛рдпрд░рдмреЗрд╕ рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рди рдкрд░ рдЗрд╕реЗ рдЖрдЬрдорд╛рдпрд╛ред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдордд рдХрд░реЛред
рдХреЛрдИ рдФрд░ рдЙрдкрд╛рдп?
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рддреЛ рдЖрдкрдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред