AG & Dev

Отправка Email-сообщений c сайта на хостинге Netlify при помощи сервиса Postmark

5 августа 2023 г.

Другие статьи

Dockerfile для Keystone CMS 6
Dockerfile и compose.yaml для развёртывания Keystone CMS 6
Аутентификация в Keystatic CMS
Настройка аутентификации в Keystatic CMS (Local mode) в проекте Next.js
Валидация формы на стороне сервера
Валидация формы на стороне сервера при помощи React-хука useActionState
Глобальное состояние в React
Глобальное состояние в React без подключения сторонних библиотек
Яндекс Карты в проекте Next.js
Подключение Яндекс Карты (API 3) к проекту Next.js (App Router)
Подключение к Headless CMS из Next.js
Пример подключения к Headless CMS (Wordpress) из приложения Next.js посредством REST API
Устранение FOUC в Next.js
Устранение FOUC-эффекта при использовании тёмной темы сайта в Next.js
Подключение Payload CMS к проекту Next.js
Как подключить Payload CMS к существующему проекту Next.js
Создание своего Rehype-плагина
Создание Rehype-плагина для корректировки HTML-кода при конвертировании из Markdown
Яндекс Метрика в проекте SvelteKit
Подключение счётчика Яндекс Метрики к проекту на SvelteKit (Svelte 5)
Анимация псевдоэлемента при помощи Anime.js
Анимация псевдоэлемента при помощи JavaScript-библиотеки Anime.js
Деплой сайта на хостинг через SFTP
Развёртывание сайта на хостинге в один клик
Липкий элемент с возможностью скроллинга
Скроллинг «липкого» элемента, превышающего высоту экрана, с помощью Svelte
Подключение FormBold с помощью Alpine.js
Подключение сервиса обработки форм FormBold с помощью фреймворка Alpine.js
Яндекс Метрика в проекте Next.js
Подключение счётчика Яндекс Метрики к проекту Next.js (App Router)
CMS для сайта на основе Google-таблиц
Использование Google-таблиц для публикации информации на сайте
Быстрый сайт на Wordpress
Быстрый сайт на Wordpress без использования темы и плагинов
Все статьи

Технологический стек

AG & Dev

Современные технологии разработки быстрых и надёжных веб-сайтов

Профиль на GitHub

Инструменты

React
Next.js
Mantine

Платформы

Node.js
Docker
Nginx

CMS

Directus
Keystone
Keystatic

Хостинг Netlify выгодно отличается от конкурентов встроенной возможностью обработки форм, размещённых на сайте, и отправкой Email-сообщений из формы на любой адрес или несколько адресов. Причём, на бесплатном тарифе можно отправлять до 100 сообщений в месяц. Но что делать, если Email-сообщения необходимо отправлять не из формы, а по другому событию? Для этого Netlify предлагает готовую интеграцию с тремя популярными сервисами отправки Email-сообщений:

  • Postmark
  • SendGrid
  • Mailgun

Далее я покажу как настроить отправку Email-сообщений с сайта, размещённого на хостинге Netlify, при помощи сервиса Postmark, который позволяет отправлять до 100 сообщений в месяц бесплатно:

1. Регистрируемся на сервисе Postmark. При этом, нужно быть готовым к следующим ограничениям:

1.1. Сервис Postmark не позволяет зарегистрироваться с использованием Email-адреса общего пользования, таким как @gmail.com, @mail.ru, @yandex.ru и т.п. Для регистрации нужно воспользоваться Email-адресом в своём или корпоративном домене.

1.2. После регистрации необходимо дождаться подтверждения аккаунта, которое, по соображениям безопасности, делается вручную сотрудниками сервиса Postmark. Ожидание подтверждения аккаунта может продлиться до 24 часов в рабочие дни или более на выходных.

2. После подтверждения аккаунта Postmark необходимо выполнить ещё некоторые настройки:

2.1. Если для отправки Email-сообщений используется личный домен или домен, для которого есть возможность редактирования DNS-записей, то желательно добавить две DNS-записи, как показано на скриншоте, чтобы можно было отправлять Email-сообщения с любого адреса в домене:

Настройка DNS

2.2. Если для отправки Email-сообщений используется корпоративный домен, для которого нет возможности редактирования DNS-записей, то оправлять Email-сообщения можно будет только с подтверждённых адресов:

Подтвержденные адреса

3. После выполнения всех необходимых настроек переходим в свойства почтового сервера и копируем «Server API Token», который понадобится для настройки интеграции с хостингом Netlify:

API Token

4. Далее переходим на хостинг Netlify и в настройках сайта включаем Email-интеграцию:

Активация Email

5. В настройках Email-интеграции выбираем поставщика Postmark и в поле «Email Provider APY Key» вставляем скопированный ранее «Server API Token». Остальные настройки Email-интеграции оставляем без изменений:

Интеграция Email

6. В настройках пользователя Netlify создаём и сохраняем в надёжном месте «Personal Access Token», который понадобится позже для загрузки сайта на хостинг из командной строки:

Access Token

7. Далее переходим в папку проекта и устанавливаем библиотеку Netlify для работы с Email-интеграцией:

terminal
npm i @netlify/emails

8. Кроме того, потребуется библиотека Netlify для работы с функциями:

terminal
npm i @netlify/functions

9. Для возможности сборки и загрузки сайта на хостинг Netlify из командной строки устанавливаем библиотеку Netlify CLI:

terminal
npm i netlify-cli

10. В корне проекта создаём файл netlify.toml:

netlify.toml
[functions];
node_bundler = "esbuild";

11. В корне проекта создаём папку emails, которая была указана в поле «Emails directory» в настройках Email-интеграции Netlify по умолчанию. В этой папке можно создать несколько шаблонов для исходящих Email-сообщений. Для каждого шаблона создаётся отдельная подпапка с файлом index.html внутри. Название подпапки является названием шаблона. В данном примере шаблон будет иметь наименование notice:

emails/notice/index.html
<html>
  <body>
    <p>Hello, {{name}}!</p>
  </body>
</html>

12. В корне проекта создаём папку netlify, а в ней подпапку functions, которая будет содержать функции Netlify. Для отправки Email-сообщений создаём файл notify.ts:

netlify/functions/notify/notify.ts
import { sendEmail } from "@netlify/emails";
import type { Handler, HandlerEvent, HandlerContext } from "@netlify/functions";
const handler: Handler = async (
  event: HandlerEvent,
  context: HandlerContext,
) => {
  await sendEmail({
    from: "name@domain.ru",
    to: "name@gmail.com",
    subject: "Subject",
    template: "notice",
    parameters: {
      name: "World",
    },
  });
  return { statusCode: 200 };
};
export { handler };

13. Собираем проект:

terminal
npm run build

14. Загружаем сайт на хостинг из командной строки:

terminal
npx netlify deploy --auth ACCESS_TOKEN --site SITE_ID --dir BUILD_DIR --prod --build

В этой команде необходимо заменить ACCESS_TOKEN, SITE_ID и BUILD_DIR на свои значения. Создание «Personal Access Token» показано в п.6 выше, «Site ID» можно найти в настройках сайта на Netlify, а название папки финальной сборки сайта зависит от используемого генератора и его настроек.

15. Если все было сделано правильно, то отправить Email-сообщение можно обратившись по адресу функции:

javascript
fetch("/.netlify/functions/notify").then((response) =>
  console.log(response.status),
);