рдЖрдЬ рд╣рдо рддрдерд╛рдХрдерд┐рдд рдмрдирд╛рдПрдВрдЧреЗред рдпрд╛рдВрдбреЗрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди (рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдирд╛рдо
рдореИрдВ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕рд░реНрд╡рд░реЛрдВ рдХрд╛ рд╡рд┐рд░реЛрдзреА (рд▓реЗрдХрд┐рди рдХрдЯреНрдЯрд░рддрд╛ рдХреЗ рдмрд┐рдирд╛) рдФрд░ рддрдерд╛рдХрдерд┐рдд рдХрд╛ рд╕рдорд░реНрдердХ рднреА рд╣реВрдВред serverless (рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд) рд╕рдорд╛рдзрд╛рди, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ (рдФрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ), рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ, рдЙрд╕ рд╕рдордп рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рдЬрдм рд╡реЗ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдФрд░ рдЪреАрдЬ рд╣реИ рдХрд╛рд░реНрдпред рдХреЛрдИ рдореЗрд░реЗ рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рд╕реЗрд╡рд╛рдПрдВ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдХреЗрд╡рд▓ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рддрд╛ рд╣реВрдВред рдЕрдХреНрдЯреВрдмрд░ 2019 рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, Yandex рдиреЗ рдЗрд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдпрд╛рдВрдбреЗрдХреНрд╕ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░реВрд╕реА рд╕рдВрдШ рдореЗрдВ рдкрд╣рд▓рд╛ рд╣реИ serverless. рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдРрд▓рд┐рд╕ рдХреЗ рдХреМрд╢рд▓ рдХреЗ рд▓рд┐рдП рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ рдореБрдлрд╝реНрдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рддрдм рд╕реЗ рдореЗрд░реА рдкрд░рд┐рдзреАрдп рджреГрд╖реНрдЯрд┐ рдореЗрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдЗрдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВред
рдЖрдЗрдП рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд▓рд┐рд╕ рдХрд╛ рдХреМрд╢рд▓
рдХреИрд╕реЗ рд╕реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдВрдбреЗрдХреНрд╕ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдХрд░реЗрдВ рдХреНрд▓рд╛рдЙрдб рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рд╣рдордиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рджреЗрдЦ рд▓рд┐рдпрд╛ рд╣реИ
1. рд╕реЗрдВрдбрдЧреНрд░рд┐рдб рдореЗрдВ рдПрдХ рдЦрд╛рддрд╛ рдмрдирд╛рдПрдВ
рдиреЛрдЯрд╕реЗрдВрдбрдЧреНрд░рд┐рдб рд╕рд┐рд░реНрдл рдореЗрд░реА рдкрд╕рдВрдж рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЪреБрдирд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ Node.js рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ SDK рд╣реИред рдЖрдк рдХреЛрдИ рдЕрдиреНрдп рдореЗрд▓рд┐рдВрдЧ рд╕реЗрд╡рд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ.
рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ
рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рд╣рдо рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ Node.js:
рдЖрдЧреЗ рд╣рдо рдЕрдкрдиреЗ рд▓рд┐рдП рд▓реЗрдХрд░ рдЖрддреЗ рд╣реИрдВ API-рдХреБрдВрдЬреА рдирд╛рдо (рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдХреЗрд╡рд▓ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕рдХрд╛ рд╣рдорд╛рд░реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЛрдб рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ; рдореИрдВ рдЕрднреА рдПрдХ рдЕрд╡рд┐рдирд╛рд╢реА рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реВрдВ рдбреЗрдореЛ-рдПрдкреАрдЖрдИ-рдХреБрдВрдЬреА) рдФрд░ рдмрдЯрди рджрдмрд╛рдПрдВ рдХреБрдВрдЬреА рдмрдирд╛рдПрдБ:
рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рд╣реЛ рдЬрд╛рдПрдЧреА, рд╣рдо рдЗрд╕реЗ рдХреЙрдкреА рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдЧрд╣рдирддрдо рд╡рд┐рд╢реНрд╡рд╛рд╕ рдореЗрдВ рд░рдЦреЗрдВрдЧреЗред рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрдЯрди рд╡рд╛рд▓реА рд╕реНрдХреНрд░реАрди рд╣реЛрдЧреА рдПрдХреАрдХрд░рдг рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рдЪрд┐рддреНрд░ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рдЗрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ:
2. рдХреЛрдб рд▓рд┐рдЦрдирд╛
рд▓реЗрдХрд┐рди рдХреЛрдб рд╕реНрд╡рдпрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд░реВрдк рд╕реЗ рдЫреЛрдЯрд╛ рд╣реИ - 22 рд▓рд╛рдЗрдиреЗрдВ!
рдЗрди - рд▓рд╛рдЗрди #8 рдореЗрд░рд╛ рдИрдореЗрд▓ рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рд╣реИ (рдФрд░ рдЗрд╕рд▓рд┐рдП рд╢рд░реНрдо рд╕реЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ) - рдХреГрдкрдпрд╛ рдЕрдкрдирд╛ рдИрдореЗрд▓ рдмрддрд╛рдПрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ, рд╣рдореЗрдВ рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛ (рд╕рд╣рд┐рдд) рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рдИрдореЗрд▓) рд╡рд╕реНрддреБ рд╕реЗ рдШрдЯрдирд╛. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╡рд┐рдзрд┐ рдкреЛрд╕реНрдЯ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝реАрд▓реНрдб (рд╕рдВрдкрддреНрддрд┐) рдХреЗ рд╕рд╛рде рдИрдореЗрд▓, рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
const { user } = event;
const email = user.email;
рдФрд░ рдпрджрд┐ рдИрдореЗрд▓ рдкрддрд╛ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ GET, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: https://functions.yandexcloud.net/123abc?[email protected]
рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдИрдореЗрд▓ рдЖрдк рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const email = event.queryStringParameters.email;
рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдирд┐рд╣рд┐рдд рд╣реИ, рдЗрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдирд╛ рдШрдЯрдирд╛, рдЖрдк рд╕рдмрд╕реЗ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛рдВрдбреЗрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рдореЛрдбрд╝реЗрдВ:
module.exports.handler = async function (event) {
return {
'statusCode': 200,
'body': JSON.stringify(event)
};
};
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ (рд▓реЗрдХрд┐рди рдХрдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ) рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ
рддреЛ, рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд▓рд░), рдЗрд╕ рдкрд░ рдЬрд╛рдПрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрд░рдВрдн рдХрд░реЗрдВ, рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
mkdir mailer
cd mailer
npm init -y
npm i @sendgrid/mail email-validator dotenv
рдпрд╣рд╛рдВ рд╕рд┐рд░реНрдл рдкреИрдХреЗрдЬ рдХреА рдЬрд░реВрд░рдд рд╣реИ @рд╕реЗрдВрдбрдЧреНрд░рд┐рдб/рдореЗрд▓. рдкреНрд▓рд╛рд╕реНрдЯрд┐рдХ рдмреИрдЧ рдИрдореЗрд▓-рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╡реИрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдИрдореЗрд▓ рдкрддреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ (рдореИрдВрдиреЗ рддреБрд░рдВрдд рдЕрдиреБрдорд╛рди рдХреИрд╕реЗ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛?), рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ (рдпрд╣ рд╣рдорд╛рд░реЗ рдмрд┐рдирд╛ рдкрд╣рд▓реЗ рд╣реА рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ), рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ (рдФрд░, рдмреЗрд╢рдХ, рд╣рдореЗрдВ рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рдЬрд╛рдБрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ)ред рдкреНрд▓рд╛рд╕реНрдЯрд┐рдХ рдмреИрдЧ рдбреЙрдЯрдирд╡ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ .env рд░рдирдЯрд╛рдЗрдо рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВред рд▓реЗрдХрд┐рди рдореЗрдВ рдпрд╛рдВрдбреЗрдХреНрд╕ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЗрди рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рд╕реАрдзреЗ рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд░рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИред рдХреИрд╕реЗ? - рдореИрдВ рдЗрд╕реЗ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдкреИрдХреЗрдЬ рдбреЙрдЯрдирд╡ рдЖрдк рдЗрд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдФрд░ рдлрд╝рд╛рдЗрд▓ .env - рди рдмрдирд╛рдПрдВ, рдФрд░ рд╕рд╛рде рд╣реА рдХреЛрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ index.js рдмрджрд▓реЗрдВ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдордиреЗ рдпрд╣ рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ index.js ╨╕ .env:
touch index.js
touch .env
рдлрд╛рдЗрд▓ рдореИрдВ index.js рдКрдкрд░ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдХреЛрдб рдХреА 22 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦреЗрдВ (рдХреЗрд╡рд▓ рдкрдВрдХреНрддрд┐ рдореЗрдВ)ред #8 рдЕрдкрдирд╛ рдИрдореЗрд▓ рдмрджрд▓реЗрдВ), рдФрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ .env - (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЙрджреНрдзрд░рдг рдпрд╛ рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди рдХреЗ) рдЬреЛрдбрд╝реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ - рдХреБрдВрдЬреА рдирд╛рдо/рдорд╛рди APIрдЬреЛ рд╣рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ SendGrid:
SENDGRID_API_KEY=рдЖрдкрдХреА-рдмрд╣реБрдд-рдЧреБрдкреНрдд-рд╕реЗрдВрдбрдЧреНрд░рд┐рдб-рдПрдкреАрдЖрдИ-рдХреБрдВрдЬреА
рдФрд░ рдпрджрд┐ рдЖрдк рдХрдо рдХрд╛рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ рдФрд░ рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ:
git clone https://github.com/stmike/ycf-sendgrid-mailer-tutorial.git
cd ycf-sendgrid-mailer-tutorial
npm i
рдлрд╛рдЗрд▓ рдореИрдВ index.js, рдЗрди - рд▓рд╛рдЗрди #8 рдмрджрд▓реЗ рдИ - рдореЗрд▓; рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ .env, рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдВрдЬреА рдХрд╛ рдирд╛рдо/рдорд╛рди рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ API, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
3. рддреИрдирд╛рддреА
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдореЛрдмреЗрд╢ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдпрд╛рдВрдбреЗрдХреНрд╕.рдХреНрд▓рд╛рдЙрдб рдФрд░ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдП рдпрд╛рдВрдбреЗрдХреНрд╕ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдореЗрд░реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ
рд╕реГрдЬрди рдХрд░рдирд╛ рдЬрд╝рд┐рдк-рдЖрд░реНрдХрд╛рдЗрд╡ (рдЖрдЗрдП рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд▓рд░.рдЬрд╝рд┐рдк), рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдФрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ .env, Index.js - рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреИрдЯрд▓реЙрдЧ рд╕реЗ рд╕рдм рдХреБрдЫ:
рд╣рдо...рд╕рд╣реА рдирд╛рдо рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ - рдореЗрд▓рд░, рдмрд╛рдПрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдиреВ рдореЗрдВ рд╣рдо рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рд╕рдВрдкрд╛рджрдХ, рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рднрд░реЗрдВ, рдФрд░ рдЯреИрдм рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ рдЬрд╝рд┐рдк рд╕рдВрдЧреНрд░рд╣ рд╣рдорд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдореЗрд▓рд░.рдЬрд╝рд┐рдк:
рдФрд░ рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ рдпрд╣рд╛рдВ .env, рдФрд░ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рди рдХрд░реЗрдВ рдбреЙрдЯрдирд╡. рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рд╕рдм рдкрд╣рд▓реЗ рд╣реА рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╕рд┐рд░реНрдл рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реВрдВред' рдпрд╛рдиреА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ!
рдЕрдм рдКрдкрд░реА рджрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдПрдБ, рдФрд░ рдХреБрдЫ рд╕реЗрдХрдВрдб рд░реБрдХреЗрдВред рдЬрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рддреЛ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рдПрдВрдЧреЗ ╨Ю╨▒╨╖╨╛╤А. рд╡рд╣рд╛рдВ рд╣рдо рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВрдЧреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣рддрд╛рдХрд┐ рдЖрдк рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХреЗрдВред
рдЖрдк рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдХреЗ рд╕рд╛рдордиреЗ рдиреАрд▓рд╛ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ рдХреЙрд▓ рд▓рд┐рдВрдХ? рдЗрд╕реЗ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдПрдХ рдЦрд╛рд▓реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдЦреБрд▓реЗрдЧреА... рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП - рдореБрдЭреЗ рдПрдХ рдИрдореЗрд▓ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ:
рдЕрдм рдЖрдк рдХрдВрд╕реЛрд▓ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯ рд╕рдХрддреЗ рд╣реИрдВ SendGrid, рдФрд░ рдмрдЯрди рджрдмрд╛рдПрдВ рдПрдХреАрдХрд░рдг рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ. рд╕рд┐рд╕реНрдЯрдо рдЕрдкрдиреЗ рдЪреИрдирд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд░ рдЪреАрдЬрд╝ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрд╕реЗ рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕реНрдХреНрд░реАрди рд▓реМрдЯрд╛рдиреА рдЪрд╛рд╣рд┐рдП:
рдмрд╕ рдЗрддрдирд╛ рд╣реА, рджреЛрд╕реНрддреЛрдВ (рдФрд░ рд▓рдбрд╝рдХрд┐рдпреЛрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ) - рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реИ! рдФрд░ рднреА рд▓реЗрдЦ рд╣реЛрдВрдЧреЗ. рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдРрд╕рд╛ рдХреБрдЫ рдкрдврд╝рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд╣реИ, рддреЛ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдЪреВрдХ рди рдЬрд╛рдПрдВред
4. рджрд╛рди
рд╕реНрд░реЛрдд: www.habr.com