áá®áá±á· áá»áœááºáá±á¬áºááá¯á· áááºáá®ážááá·áº áá«áá±á«áºáá¬á Yandex áá¯ááºáá±á¬ááºáá»áẠ(ááá¬ážáááºá¡áááº
áá»áœááºá¯ááºááẠááá¯ážáá¬áá¬áá¬áá»á¬ážá ááŒáá¯ááºááẠ(ááá¯á·áá±á¬áº ááá°áááºááŸá¯áááŸááá²) ááŸáá·áº áááºážááᯠáá±á¬ááºáá¶áá°ááŒá
áºáááºá serverless (áá¬áá¬áá²á·) ááŒá±ááŸááºážáááºážáá»á¬ážááᯠáá»áœááºá¯ááºáááŒáá¯ááºáá±á¬ááŒá±á¬áá·áº (áá¬áá¬áá»á¬ážááᯠá
á®áá¶ááá·áºááœá²áááºážááᯠáá»áœááºá¯ááºááááºááááá«) ááŸáá·áº ááá¯á·áááºááẠáááºážááá¯á·ááᯠááááºáá±á¬ááºááá·áºá¡áá»áááºá¡ááœáẠáá±ážáá»á±áá«á áá±á¬ááºáá
áºáá¯á áá¯ááºáá±á¬ááºáá»ááºááœá±áá«á áá
áºá
á¯á¶áá
áºáá±á¬ááºááẠáá»áœááºá¯ááºááá«áá² áááºážááá¯á·ááᯠáááºáá±á¬ááºááŸá¯áá±ážáᬠáá¯ááºážáá±á«áºááá¯ááŸá¯á¡ááœááºáᬠáá»áœááºá¯ááºáá±ážáá±á¬ááºáá«áááºá 2019 áá¯ááŸá
Ạá¡á±á¬ááºááá¯áá¬áá¡á
ááœáẠYandex á áááºážáá¡ááŒá±á¬ááºážááᯠáááºááŒáá²á·áááºá Yandex ááááºááá¯ááºáá¯ááºáá±á¬ááºáá»ááºáá»á¬áž - áá¯ááŸá¬ážáááºááá±ážááŸááºážááœááºááááá¯á¶ážááŒá
áºáá¯á¶ááááºá serverless. á¡áá°ážáááŒáá·áº áááºážáá¬á
áá¬ááŸá¬ á¡á²áá
áºá áá»áœááºážáá»ááºááŸá¯áá»á¬ážááŒá±á¬áá·áº áááºážááá¯á·ááẠáá±áá°áá»á¡á¬ážááŒáá·áº á¡ááá²á·ááŒá
áºáááºá ááá¯á·ááŒá±á¬áá·áº áááºážááá¯á·ááẠáá»áœááºá¯ááºá á¡áá¶á¡ááŒááºá¡á¬áá¯á¶ááœáẠá¡á
ááºááŸááá±áá²á·áááºá áá«áá±ááá·áº á
ááá¯ááºááŒáá¡á±á¬ááºá
áá®áá¬ááºáááºážááᯠá
áááºáá°ážááŒáá·áºáá¡á±á¬ááºá áááºááá»áŸá±á¬ááºááœáŸá¬ (á¥ááá¬á á¡á²áá
áºááá»áœááºážáá»ááºááŸá¯
áááºááá¯á¡ááŒá±á¬ááºážááŒá±á¬áá·áºáá²á Yandex áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž áá±áá¬áá±á·á
áºááœááºááá·áºááœááºážááŸá¯áá»á¬ážááŒá¯áá¯ááºáá«á Cloud Firestore á¡á²áá«ááᯠáá»á°ááá¯áá®áááºááŸá¬ ááŒáá·áºáá¬ážááŒá®ážáá¬áž
1. SendGrid ááœáẠá¡áá±á¬áá·áºáá áºáá¯áááºáá®ážáá«á
ááœá±á¬ááá¯SendGrid ááẠá¡ááŒá±á¬ááºážá¡áá»áá¯ážáá»áá¯ážááŒá±á¬áá·áº áá»áœááºá¯ááºááŒá¯áá¯ááºáá²á·áá±á¬ áá»áœááºá¯ááºáááœá±ážáá»ááºááŸá¯áá¬ááŒá áºááŒá®ážá á¡áááá¡áá»ááºááŸá¬ áááºážááá¯á·ááœáẠNode.js á¡ááœáẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ SDK ááŸááááºá á¡ááŒá¬ážá á¬ááá¯á·áááºáá±á¬ááºááŸá¯ááᯠáááºááœá±ážáá»ááºááá¯ááºáá«áááºá
áááºááŒáá¡á±á¬ááº
áá±á¬ááºáá
áºááá·áºááœáẠáá»áœááºá¯ááºááá¯á· ááœá±ážáá»ááºáá«á Node.js:
áá±á¬ááºáá
áºáá¯á áá«ááá¯á·á¡ááœáẠáááºáá¬áááºá API ááá¯-key á¡ááẠ(áá±á¬á·áá»á¬ážá
á¬áááºážááœáẠááœááºááá¯ážááºááœááºáᬠááŒááááºááŒá
áºááŒá®ážá áá»áœááºá¯ááºááá¯á·á á¡áá¬áááºáá¯ááºááŸáá·áº áá¬ááŸáááá¯ááºáá«á áá»áœááºá¯ááºááẠááá»ááºá
á®ážááá¯ááºáá±á¬ áá¯ááºáá
áºáá¯ááŒáá·áº áá±á«áºáá¬áá«áááºá demo-api-key) ááá¯ááºááá¯ááŸáááºáá«á áá±á¬á·áááºáá®ážáá«á:
áá±á¬á·ááá¯áá¯ááºáá±ážáááºááŒá
áºááŒá®ážá áá»áœááºá¯ááºááá¯á·á áááºážááᯠáá°ážáá°ááŒá®áž á¡áááºááŸáá¯ááºážáá¯á¶ážáá¯á¶ááŒááºááŸá¯ááœáẠááááºážáááºážáá¬ážáááºááŒá
áºáááºá ááŒá®ážáá±á¬á· áá«ááá¯á·ááŸá¬ ááá¯ááºáá
áºáá¯áá«áá²á· áá»ááºááŸá¬ááŒááºáá
áºáᯠááŸááááºá áá±á«ááºážá
ááºážááŸá¯ááᯠá¡áááºááŒá¯áá«áá¡á±á¬ááºáá¯á¶áá«á¡ááá¯ááºážá áá»áœááºá¯ááºááá¯á·ááẠáááºážááᯠáááŸáááºááá±ážáá«á ááá¯á·áá±á¬áº áá¯ááºááá¯áá±ážááẠáááºááœá¬ážááŒáá«á
áá¯á·á
2. áá¯ááºáá±ážááŒááºážá
áá«áá±ááá·áº áá¯ááºááá¯ááºááá¯ááºá ááŒááºáá²á·á¡ááá¯ááºáž áááºá áá¬áá±á¬ááºážáá±á¬ááºá¡á±á¬áẠáá±ážáááºáá«ááẠ- 22 ááá¯ááºážá
áááºážáááºáá¬á
á®ááẠ#8 áá»áœááºá¯ááºáá¡á®ážáá±ážááºááẠhardcoded ááŒá
áºááẠ(ááá¯á·ááŒá±á¬áá·áº ááŸááºááœá¶á·á
áœá¬ ááŸááºáá¬ážáááº) - áá»á±ážáá°ážááŒá¯á ááá·áºá¡ááŒá±á¬ááºáž áá±á¬áºááŒáá«á áááºááœá±á·ááááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá±áᬠ(á¡áá«á¡áááº) á¡á¬ážáá¯á¶ážááᯠáááºáá¶áááŸááááºááŒá
áºáááºá á¡á®ážáá±ážááºá) á¡áá¬ááá¹áá¯á០á¡ááŒá
áºá¡áá»ááº. á¥ááá¬ááá¯áááẠáááºážáááºáž POST á¡áá¬ááá¹áá¯áá
áºáá¯ááẠáá»áœááºá¯ááºááá¯á·ááá¯ááºáá±á¬ááºáá»ááºááá¯á· áá±ážááá¯á·áááºá á¡áá¯á¶ážááŒá¯áá°ááᯠá¡ááœáẠ(á¡áááºááŒá¶ááŒá±)á á¡á®ážáá±ážááºáá€á¡ááœááºááááºááá¯ážááᯠá€áá²á·ááá¯á·áááŸáááá¯ááºáááº-
const { user } = event;
const email = user.email;
áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯á á¡á®ážáá±ážááºááááºá
á¬ááᯠáá¯ááºáá±á¬ááºáá»ááºááá¯á· áá±ážááá¯á·áá«áá GETá¥ááá¬: https://functions.yandexcloud.net/123abc?[email protected]
ááá·áºáááºáááºááá¯áž á¡á®ážáá±ážááºá áááºá€áá²á·ááá¯á·áááá¯ááºáááº-
const email = event.queryStringParameters.email;
á¡áá¬ááá¹áá¯áá áºáá¯ááœáẠáááºááá·áºá¡áá¬áá«ááŸááááºááᯠá¡ááá¡áá»ááŒáá·áºááŸá¯ááẠá¡ááŒá áºá¡áá»ááºá¡ááá¯ážááŸááºážáá¯á¶áž áááºáá®ážááá¯ááºáá«áááºá Yandex áá¯ááºáá±á¬ááºáá»áẠáá±ážááŒááºážááŸá¯áá»á¬ážááŒáá·áº ááŸáá·áºáááºáá«-
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
á€áá±áá¬ááœáẠáááºáá±á·áá»áºáá¬áá»áŸáẠááá¯á¡ááºáá«áááºá @sendgrid/áá±ážááº. ááááºá áá áºá¡ááẠá¡á®ážáá±ážááº-á¡áááºááŒá¯áá±ážáá° á¡á®ážáá±ážááºááááºá á¬ááᯠááŸááºáááºááŸá¯ ááŸááááŸá á á áºáá±ážááẠ(áá»ááºáá»ááºáž áááºááá¯á០ááŸááºážáááá¯á· áááá²á·áá«áá°áž)á áá«áá±ááá·áº á¡á²áá«ááᯠáá±áá»á¬ááẠ(áá»áœááºá¯ááºááá¯á· ááá«áá² á¡áá»áááºá¡áá±á¬áºááŒá¬ á á áºáá±ážááŒá®ážáá«ááŒá®)á á¡á²áá«ááᯠááá·áºááœááºážááá¯á· áááá¯áá«áá°ážá áá¯ááºáá«áááºá áá¯ááºááŸá¬ á á áºá áá¬áááá¯áá«áá°áž)á ááááºá áá áºá¡ááẠdotenv ááá¯ááºáá áºáá¯á០ááŸááºáááºážáá»á¬ážááᯠáááºááẠáá®ááá¯ááºážáá¯ááºáá¬ážáááºá .env runtime variable áá»á¬ážá¡ááŒá áºá áá«áá±ááá·áº Yandex áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž á€ááááºážááŸááºáá»á¬ážááᯠruntime ááẠá ááºážáá»ááºááœááºááá¯ááºááá¯ááºááá·áºááá¯ááºáááºá áááºááá¯áá²? - á¡á±á¬ááºááŸá¬ ááŒáá±ážáá«áááºá ááá¯á·ááŒá±á¬áá·áº á¡áá¯áẠdotenv áááºáááºáž áááºážááᯠááá·áºááœááºážá áááá«á .env - ááááºáá®ážáá«ááŸáá·áº áá áºáá»áááºáááºážááŸá¬ááẠáá¯ááºááẠááá¯ááºáá²ááœáẠááŸááá±áááºá index.js áááŒá±á¬ááºážáá°ážá ááá¯á·áá±á¬áº á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠá€áááºáá±á·ááºá»ááᯠááá·áºááœááºážáá¬ážáá±á¬ááŒá±á¬áá·áº ááá¯ááºáá»á¬ážááᯠáááºáá®ážáá«áááºá index.js О .env:
touch index.js
touch .env
ááá¯ááºáá²ááŸá¬ index.js á¡áá±á«áºá screenshot ááŸá¬ááŒáá¬ážáá²á· áá¯áẠ22 ááŒá±á¬ááºážááá¯áá±ážáá« (á
á¬ááŒá±á¬ááºážáá²ááŸá¬áᬠ#8 áááºáá¡á®ážáá±ážááºááá¯ááŒá±á¬ááºážáá«) ááŸáá·áºááá¯ááºááœáẠ.env - (á¡ááá¯ážá¡áá¬áž ááá¯á·ááá¯áẠáá¯ááºááŒááºáá¯ááºáááá«áá²) ááœá²-áá±á¬á·á¡áááº/áááºááá¯ážááᯠáááºááŸááºáá«á API ááá¯ááœááºááá¯ážááºááœáẠáá»áœááºá¯ááºááá¯á· áááŒá¬áá±ážáá®á áááŸááá¬ážáá±á¬ á¡áá¬áá»á¬áž SendGrid:
SENDGRID_API_KEY=your-very-secret-sendgrid-api-key
á¡áá¯ááºáááºážááá¯áá«áá repository ááá¯ááœá¬ážááŒá®áž packages áá»á¬ážááᯠinstall áá¯ááºáá«á
git clone https://github.com/stmike/ycf-sendgrid-mailer-tutorial.git
cd ycf-sendgrid-mailer-tutorial
npm i
ááá¯ááºáá²ááŸá¬ index.js, áááºážáááºáá¬á á®ááẠ#8 á¡á®ážáá±ážááºááá¯ááŒá±á¬ááºážáá«á root directory ááœááºááá¯ááºáá áºáá¯áááºáá®ážáá«á .enváááºážááœáẠáá±á¬á·áá¡áááº/áááºááá¯ážááᯠáá±á¬áºááŒáá«á API ááá¯á¡áá±á«áºááŸá¬ááŒáá¬ážáá²á·á¡ááá¯ááºážáá«á
3. áá»áá¬ážáá«á
á¡áááºážááŸáá·áºá¡áá»á¬áž ááŸááºážááŸááºážáááºážáááºážá¡áá±ážá
áááºááŸáá·áº áááºáááºáááºá Yandex.Cloud á¡á²áá®ááŸá¬ áááºááá¯áá±áá¬ááá²á Yandex áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž áá«á·áá±á¬ááºážáá«ážááœááºáá±á¬áºááŒáá¬ážáááºá
áá«ááá¯á·áááºáá®ážáááºá áá áº-archive (á¥ááá¬á á¡á²áá«ááᯠáá±á«áºáá¡á±á¬ááºá mailer.zip) ááœáẠáá»áœááºá¯ááºááá¯á·ááẠáááºážááœáŸááºááᯠááá·áºááœááºážáá¬ážáááºá node_modules ááŸáá·áºááá¯ááºáá»á¬áž .envá index.js - áá»áœááºá¯ááºááá¯á·á ááá±á¬áá»ááºáááºááá±á¬ááºá០á¡áá¬á¡á¬ážáá¯á¶áž-
áá»áœááºá¯ááºááá¯á·ááẠá¡áááºááŒáá·áº áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯ááᯠáááºáá®ážáááº... ááŸááºáááºááẠ- á
á¬ááá¯á·áááºáááºá¡ááœáŸááºážáá®áá°ážááœáẠáá»áœááºá¯ááºááá¯á·ááá·áºááœááºážáá«á á¡ááºáá®áá¬ááá¯á¡ááºáá±á¬á¡ááœááºáá»á¬ážááá¯ááŒáá·áºáá«á áááºááºááá¯á·ááŒá±á¬ááºážáá«á á
á¬ááá¯ááºááŸááºáááºáž áá»áœááºá¯ááºááá¯á·á archive ááᯠdownload áá¯ááºáá«á mailer.zip:
á€áá±áá¬ááœáẠáá±á«ááºážáá¯ááºáá¯ááºááẠááááºáá±á¬áºááŒáá¬ážáá±á¬ ááœá±ážáá»ááºááŸá¯ááŒá
áºáááºá API áá±á¬á· ááá±á¬áá»ááºááœáẠááá¯ááºáá
áºáá¯áááºáá®ážááŒááºážááẠá€áá±áá¬ááœáẠááá¯ááºááá¯áẠ.envááŸáá·áº package ááá¯ááááºáááºáá«ááŸáá·áº dotenv. áá«âáá±ááá·áºâ áá»áœááºââáá±á¬áºâááá¯á·á áá«âááœá±á¡áá¯ááºâáá¯ááºâááŒá®ážááŒá®ááá¯á· ááááºážá¡áá»ááºá¡áááºá¡ááœááºâáá² ááŒáá¬áá«á ááá¯ááá¯áááºááŸá¬á ááœá¬ážáááºáááá¯á¡ááºáá«á
ááᯠáá¬áááºá¡áá±á«áºáá±á¬áá·áºááŸá ááá¯ááºááᯠááŸáááºáá«á áá¬ážááŸááºážáááºáá®ážáá«áááŒá®ážáá»áŸáẠá
áá¹ááá·áºá¡áááºážáááºá
á±á¬áá·áºáá«á á¡á¬ážáá¯á¶ážá¡áááºááá·áºááŒá
áºáá±á¬á¡áá«á áá»áœááºá¯ááºááá¯á·ááẠááá¹áááá¯á· á¡ááá¯á¡áá»á±á¬ááºááœá¬ážáá«áááºá áá±áá¯áá»á¡ááŒááº. á¡á²áá®ááŸá¬áá»áá±á¬áºááá¯á· option ááᯠenable áá«áááá·áºáááºá á¡áá»á¬ážáá°ááŸá¬áá±á¬ááºááœááºáá»ááºáá«á០ááŒááºáááá¹áá¬áá²á· ááááœá±á·áááºáá¶ááá¯ááºááŸá¬áá«á
ááá¹áááºážáá²á· ááá·áºáá»ááºááẠá¡ááŒá¬áá±á¬áẠááá·áºááºááᯠáááºááœá±á·áááŸá¬áá«á áá±á«áºááá¯ááẠááá·áºááº? á¡á²áá«ááá¯ááŸáááºáá«á ááá¬ááá±á¬ááºáᬠáááºážááá¯ážáá
áºáᯠááœáá·áºáá¬áááº... ááá¯á·áá±á¬áº á
á±á¬áá·áºáá« - áá»áœááºá¯áẠá¡á®ážáá±ážááºáá
áºá
á±á¬áẠáááºáá¶áááŸááááº-
ááᯠáááºááẠconsole ááá¯á·ááŒááºááœá¬ážááá¯ááºáááºá SendGridááá¯ááºááá¯ááŸáááºáá«á áá±á«ááºážá
ááºážááŸá¯ááᯠá¡áááºááŒá¯áá«á. á
áá
áºááẠáááºážááá»ááºáááºáá»á¬ážááŸáá
áºááá·áº á¡áá¬á¡á¬ážáá¯á¶ážááᯠá
á
áºáá±ážáááºááŒá
áºááŒá®áž ááááºá¡áá±ááŒáá·áº áááºážááẠá€áá²á·ááá¯á·áá±á¬ á
ááááºááᯠááŒááºáá±ážáááá·áºáááº-
áá«áá²á áá±á¬ááºá»á¬ážáá±ážááœá± (ááááºážááá±ážááœá±áá±á«á·) - á¡áá¬á¡á¬ážáá¯á¶ážáᬠáááá·áºááᯠááá¯ážááŸááºážááŒá®áž á¡á¶áááºááœááºáá»áá«áá²á áá±á¬ááºááẠáá±á¬ááºážáá«ážááœá±áááºáž ááŸááááºá á€áá²á·ááá¯á·áá±á¬ á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠá
áááºáááºá
á¬ážáá°ááá¯ááºáž áááºáá»ááºáá«á áááºááœááºááá¶áá¡á±á¬áẠá
á¬áááºážááœááºážááá¯ááºáá«á
4. ááŸá°áá«ááºážááŸá¯áá»á¬áž
source: www.habr.com