Яндэкс-функцыі рассылаюць пошту

Яндэкс-функцыі рассылаюць пошту

Сёння мы створым т.зв. Яндэкс-функцыю (афіцыйная назва Yandex Cloud Functions), якая ўступіўшы ў змову з сэрвісам паштовых рассылак SendGrid будзе слаць "мыла" мірна спячым карыстальнікам (жарт - я ведаю, што ўсе мы супраць спаму).

А яшчэ я супернік (але без фанатызму) традыцыйных сервераў, і прыхільнік т.зв. бессерверной (бессерверных) рашэнняў, паколькі не кахаю (ды і толкам не ўмею) адміністраваць сервера, а яшчэ больш - плаціць за той час, калі яны не нагружаныя. Іншая справа - функцыі. Іх нехта абслугоўвае без мяне, а я плачу толькі за выклікі. У пачатку кастрычніка 2019 г. Яндэкс прадставіў свае Yandex Cloud Functions - здаецца першы ў РФ бессерверной. І што асабліва прыемна - для навыкаў Алісы яны наогул бясплатныя, таму з тых часоў знаходзяцца ў полі майго перыферыйнага зроку. Але давайце ўжо прыступім.

Уявім такі сцэнар. Ваша прыкладанне (напрыклад, навык Алісы Запомні і Забудзь які, дарэчы, таксама працуе на Яндэкс-функцыях) прапануе карыстачу купіць лічбавы тавар, напрыклад, дадатковыя опцыі, і карыстальнік робіць аплату. Нейкая плацежная сістэма (падобная да ступені змешвання з Яндэкс.Грошы) апрацоўвае плацёж, і шле на прадстаўлены вамі адрас (а ў нас гэта будзе спасылка для выкліку Яндэкс-функцыі) HTTP-запыт, які змяшчае дэталі плацяжу, такія як сума, Прозвішча, імя, тэлефон і электронная пошта плацельшчыка. Мы ж хочам гэтыя дадзеныя нейкім чынам апрацоўваць, напрыклад: правяраць суму, рабіць адпаведныя запісы ў базу дадзеных, адпраўляць карыстальнікам SMS и E-mail з пацвярджэннем атрымання аплаты і далейшымі інструкцыямі. Такі сабе мікрасэрвіс.

Аб тым, як з Яндэкс-функцый рабіць запісы ў БД Воблачны камень мы ўжо разглядалі ў тутарыяле Аліса памятае ўсё (і ў далейшым, думаю, разгледзім прыклад для іншай БД - Yandex Database). Аб тым, як адпраўляць карыстальнікам SMS і інтэграваць наша дадатак з Яндэкс.Грошамі - Разбяром у недалёкай будучыні. Цяпер зоймемся толькі адпраўкай лістоў.

1. Стварэнне акаўнта ў SendGrid

ЗаўвагаSendGrid – гэта толькі мой выбар, які я зрабіў па некаторых прычынах, і галоўная з якіх – наяўнасць у іх гатовага SDK для Node.js. Вы можаце выбраць любы іншы сэрвіс паштовых рассылак.

Пераходзім на старонку рэгістрацыі акаўнта і запаўняем тамака рэгістрацыйную форму. Затым пераходзім у прыборная панэль, у навігацыйнай панэлі выбіраемы Email API -> Integration Guide, а на галоўнай панэлі - Вэб-API і націскаем кнопку Выбіраць. Усё як на малюнку:

Яндэкс-функцыі рассылаюць пошту

На наступным кроку выбіраемы Node.js:

Яндэкс-функцыі рассылаюць пошту

Далей прыдумляем для свайго API-ключа назва (будзе адлюстроўвацца толькі ў кансолі ў спісе ключоў, і да нашага будучага кода стаўлення не мае; я вось прыдумаў нятленнае demo-api-key) і націскаем кнопку Стварыць ключ:

Яндэкс-функцыі рассылаюць пошту

Ключык згенеруецца, мы яго скапіюем і захаваем у найглыбокай таямніцы. А ў нас з'явіцца экран з кнопкай Verify Integration, як на малюнку ніжэй, але мы яе пакуль націскаць не станем, а пяройдзем да напісання кода:

Яндэкс-функцыі рассылаюць пошту

2. Напісанне кода

А самога кода, як бачыце, да смешнага мала - 22 радкі!

Яндэкс-функцыі рассылаюць пошту

У радку #8 хардкодам прапісана мая пошта (і таму сарамліва прычыненая) - вы пакажыце сваю. У рэальным жа жыцці мы будзем атрымліваць усе дадзеныя (уключаючы электронная пошта) з аб'екта падзея. Напрыклад, калі метадам POST у нашу функцыю адпраўляецца аб'ект карыстальнік з полем (уласцівасцю) электронная пошта, значэнне гэтага поля можна атрымаць так:

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

Тут абавязковым з'яўляецца толькі пакет @sendgrid/mail. Пакет email-validator правярае на валіднасць адрас пошты (як я адразу не здагадаўся?), але калі мы ў ім упэўненыя (даўно ўжо праверана без нас), яго можна не ўсталёўваць (і ў кодзе, натуральна, праверку не рабіць). Пакет датэнв прызначаны для чытання запісаў з файла .env як зменных асяроддзя выканання. Але ў Яндэкс-функцыях ёсць магчымасць змяшчаць гэтыя зменныя непасрэдна ў сераду выкананне. Як? - я пакажу гэта ніжэй. Таму пакет датэнв таксама можна не ставіць, і файл .env - не ствараць, і пры гэтым код у файле index.js не мяняць. Але тут мы гэты пакет устанавілі, таму ствараем файлы. index.js и .env:

touch index.js
touch .env

У файле index.js пішам 22 радкі кода, паказанага на скрыншоце вышэй (толькі ў радку #8 памяняйце пошту), а ў файле .env - (без якіх-небудзь двукоссяў і знакаў прыпынку) пазначце пару - імя / значэнне ключа API, які мы нядаўна атрымалі ў кансолі SendGrid:
SENDGRID_API_KEY=your-very-secret-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. Дэплой

Больш-менш выразна і падрабязна аб Яндэкс.Аблокі і пра тое, як там размяшчаць Яндэкс-функцыі расказана ў маім артыкуле Аліса ў краіне Бітрыкс - недасведчаных адсылаю ў гэтую краіну, а для ўсіх астатніх (і якія вярнуліся) - далей невялікі комікс (г.зн. серыя малюнкаў і тэксту).

Ствараем ZIP-архіў (назавём яго, напрыклад, mailer.zip), у які ўключаем каталог вузелавыя модулі і файлы .env, index.js - усё з каталога нашага праекта:

Яндэкс-функцыі рассылаюць пошту

Ствараем функцыю з назвай ... правільна - ліст, у левым навігацыйным меню ўбіраем рэдактар, запаўняем неабходныя палі, і пераключыўшыся на ўкладку ZIP-архіў загружаем наш архіў mailer.zip:

Яндэкс-функцыі рассылаюць пошту

А вось і згаданая раней магчымасць загрузіць API-key непасрэдна тут, а не ствараць у праекце файл .env, і не ўсталёўваць пакет датэнв. Але мы ўсё гэта ўжо зрабілі, таму паказваю проста для інфармацыі. Гэта значыць - дубляваць не трэба!

Яндэкс-функцыі рассылаюць пошту

Цяпер у правым верхнім куце націскаем кнопку Стварыць версію, і чакаем пару секунд. Калі ўсё будзе гатова, мы аўтаматычна пяройдзем у падзел Агляд. Там уключым опцыю Публічная функцыя, каб з ёй можна было ўзаемадзейнічаць з навакольнага свету.

Яндэкс-функцыі рассылаюць пошту

Бачыце сінюю спасылку насупраць надпісу Спасылка для выкліку? Націсніце яе. Адкрыецца пустое акно браўзэра ... Але пачакайце - мне прыйшоў ліст:

Яндэкс-функцыі рассылаюць пошту

Цяпер можна вярнуцца ў кансоль SendGrid, і націснуць кнопку Verify Integration. Сістэма праверыць усё па сваіх каналах, і ў выніку павінна вярнуць такі вось экран:

Яндэкс-функцыі рассылаюць пошту

Вось так, хлопцы (і дзяўчаты, зразумела) - усё сапраўды вельмі проста і элегантна! Будуць яшчэ артыкулы. Каму чытаць падобнае цікава - падпісвайцеся, каб не прапусціць.

4. Данаты

Яндэкс-функцыі рассылаюць пошту

Крыніца: habr.com

Дадаць каментар