Яндекс-функції розсилають пошту

Яндекс-функції розсилають пошту

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

А ще я противник (але без фанатизму) традиційних серверів і прихильник т.зв. без сервера (безсерверних) рішень, оскільки не люблю (та й не вмію) адмініструвати сервери, а ще більше — платити за той час, коли вони не навантажені. Інша справа – функції. Їх хтось обслуговує без мене, а я плачу лише за виклики. На початку жовтня 2019 р. Яндекс представив свої Yandex Cloud Functions - здається перший у РФ без сервера. І що особливо приємно — для навичок Аліси вони взагалі безкоштовні, тож відтоді перебувають у полі мого периферійного зору. Але давайте вже приступимо.

Уявимо такий сценарій. Ваша програма (наприклад, навик Аліси Запам'ятай та Забудь який, до речі, також працює на Яндекс-функціях) пропонує користувачеві купити цифровий товар, наприклад, додаткові опції, і користувач робить оплату. Якась платіжна система (схожа до ступеня змішання з Яндекс гроші) обробляє платіж, і шле на надану вами адресу (а у нас це буде посилання для виклику) Яндекс-функції) HTTP-запит, що містить деталі платежу, такі як сума, ПІБ, телефон та електронна пошта платника. Ми ж хочемо ці дані якимось чином обробляти, наприклад: перевіряти суму, робити відповідні записи до бази даних, надсилати користувачам SMS и Електронна адреса з підтвердженням отримання оплати та подальшими інструкціями. Такий собі мікросервіс.

Про те, як із Яндекс-функцій робити записи до БД Хмарний камінник ми вже розглядали у туторіалі Аліса пам'ятає все (і надалі, гадаю, розглянемо приклад для іншої БД — 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 хардкодом прописано мою пошту (і тому сором'язливо прикрито) — ви вкажіть свою. У реальному ж житті ми отримуватимемо всі дані (включаючи e-mail) з об'єкта подія. Наприклад, якщо методом POST в нашу функцію надсилається об'єкт користувач з полем (властивістю) e-mail, значення цього поля можна отримати так:

const { user } = event;
const email = user.email;

А якщо адреса пошти передається у функцію методом GET, Наприклад: https://functions.yandexcloud.net/123abc?[email protected]
значення параметра e-mail можна отримати так:

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. Пакет валідатор електронної пошти перевіряє на валідність адресу пошти (як я одразу не здогадався?), але якщо ми в ній впевнені (давно вже перевірено без нас), її можна не встановлювати (і в коді, звичайно, перевірку не робити). Пакет dotenv призначений для читання записів із файлу .env як змінних середовища виконання. Але в Яндекс-функціях є можливість поміщати ці змінні у середу виконання. Як? - Я покажу це нижче. Тому пакет dotenv також можна не ставити, і файл .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, і не встановлювати пакет dotenv. Але ми все це зробили, тому показую просто для інформації. Тобто дублювати не треба!

Яндекс-функції розсилають пошту

Тепер у правому верхньому кутку натискаємо кнопку Створити версію, і чекаємо на пару секунд. Коли все буде готове, ми автоматично перейдемо до розділу Огляд. Там увімкнемо опцію Публічна функціящоб з нею можна було взаємодіяти із зовнішнього світу.

Яндекс-функції розсилають пошту

Бачіть синє посилання навпроти напису Посилання для виклику? Натисніть її. Відкриється порожнє вікно браузера ... Але зачекайте - мені надійшов лист:

Яндекс-функції розсилають пошту

Тепер можна повернутися до консолі SendGrid, і натиснути кнопку Verify Integration. Система перевірить все своїми каналами, і в результаті повинна повернути такий ось екран:

Яндекс-функції розсилають пошту

Ось так, хлопці (і дівчата, зрозуміло) все дійсно дуже просто і елегантно! Будуть ще статті. Кому читати таке цікаво — підписуйтесь, щоби не пропустити.

4. Донати

Яндекс-функції розсилають пошту

Джерело: habr.com

Додати коментар або відгук