Postbox
Введение
В этом примере мы не будем повторять инструкции по настройке адреса электронной почты в Yandex Cloud Postbox, которые вы можете найти в документации. Предполагается, что вы уже настроили адрес электронной почты и готовы отправлять сообщения через Yandex Cloud Postbox.
SDK
Для работы с Yandex Cloud Postbox в C# мы будем использовать библиотеку AWSSDK.SimpleEmailV2
.
Подробнее в документации AWS SDK.
Код
Так как Yandex Cloud Postbox является совместимым с AWS сервисом, то для отправки сообщений мы можем использовать совместимый с AWS формат ключей — в Яндекс Облаке это статические ключи доступа, которые можно создать в IAM.
Yandex Cloud Postbox также поддерживает авторизацию при помощи IAM-токенов, но здесь будет рассмотрен только первый вариант. Оба типа авторизации рассмотрены в примере на Go, который вы можете найти здесь.
AWS совместимый вариант
using Amazon.Runtime;
using Amazon.SimpleEmailV2;
using Amazon.SimpleEmailV2.Model;
using Newtonsoft.Json;
namespace Postbox;
public class Handler
{
// ReSharper disable once UnusedMember.Global
public async Task<Response> FunctionHandler(Request request)
{
var client = new AmazonSimpleEmailServiceV2Client(
new AmazonSimpleEmailServiceV2Config
{
ServiceURL = "https://postbox.cloud.yandex.net",
SignatureMethod = SigningAlgorithm.HmacSHA256,
SignatureVersion = "4",
AuthenticationRegion = "ru-central1"
});
string messageId = null;
try
{
var response = await client.SendEmailAsync(
new SendEmailRequest
{
Destination = new Destination
{
ToAddresses = ["receiver@domain.com"]
},
Content = new EmailContent
{
Simple = new Message
{
Body = new Body
{
Text = new Content
{
Charset = "UTF-8",
Data = "Hello, world!"
}
},
Subject = new Content
{
Charset = "UTF-8",
Data = "Test email"
}
}
},
FromEmailAddress = "noreply@yourdomain.com"
});
messageId = response.MessageId;
}
catch (Exception ex)
{
// Log the exception as JSON
Console.WriteLine(JsonConvert.SerializeObject(ex));
}
return new Response(
statusCode: 200,
body: messageId ?? "Failed to send email"
);
}
}
Вы можете заметить, что мы не передавали никаких ключей доступа в клиент, так как при создании этой функции, мы укажем их в переменных окружения. Клиент сам возьмет их оттуда.
Мы лишь указали эндпоинт Postbox (строка 17) и регион (20).
В остальном никаких больше особенностей по работе с Postbox в Yandex Cloud нет, и вы можете использовать
стандартные методы работы с SESv2 из AWSSDK.SimpleEmailV2
. Список поддерживаемых методов можно найти в
документации.
Развертывание
Для развертывания этой функции в Yandex Cloud вы можете воспользоваться Terraform описанным в примере.
data "archive_file" "function_files" {
output_path = "./function.zip"
source_dir = "../Postbox/Postbox"
type = "zip"
excludes = [
"bin/*",
"obj/*",
]
}
resource "yandex_function" "postbox_function" {
name = "postbox-function"
user_hash = data.archive_file.function_files.output_sha256
runtime = "dotnet8"
entrypoint = "Postbox.Handler"
memory = "128"
execution_timeout = "10"
content {
zip_filename = data.archive_file.function_files.output_path
}
environment = {
AWS_SECRET_ACCESS_KEY = yandex_iam_service_account_static_access_key.postbox_sender_key.secret_key
AWS_ACCESS_KEY_ID = yandex_iam_service_account_static_access_key.postbox_sender_key.access_key
}
}
// IAM binding for making function public
resource "yandex_function_iam_binding" "postbox_function_binding" {
function_id = yandex_function.postbox_function.id
role = "functions.functionInvoker"
members = ["system:allUsers"]
}
Для этого мы сначала определяем ресурс archive_file
для создания zip-архива с функцией.
data "archive_file" "function_files" {
output_path = "./function.zip"
source_dir = "../Postbox/Postbox"
type = "zip"
excludes = [
"bin/*",
"obj/*",
]
}
Как видно мы передаем не весь солюшен, а только проект с функцией. Чтобы уменьшить размер архива, мы исключили
папки bin
и obj
из архива.
А затем ресурс yandex_function
для создания функции в Yandex Cloud, куда передаем zip-архив с функцией.
resource "yandex_function" "postbox_function" {
name = "postbox-function"
user_hash = data.archive_file.function_files.output_sha256
runtime = "dotnet8"
entrypoint = "Postbox.Handler"
memory = "128"
execution_timeout = "10"
content {
zip_filename = data.archive_file.function_files.output_path
}
environment = {
AWS_SECRET_ACCESS_KEY = yandex_iam_service_account_static_access_key.postbox_sender_key.secret_key
AWS_ACCESS_KEY_ID = yandex_iam_service_account_static_access_key.postbox_sender_key.access_key
}
}
Дополнительно, мы передаем переменные окружения AWS_ACCESS_KEY_ID
и AWS_SECRET_ACCESS_KEY
для авторизации в
Yandex Cloud Postbox.
Чтобы сделать функции доступными из интернета, мы можем создать ресурс yandex_function_iam_binding
что бы разрешить доступ к функциям всем пользователям, тем самым сделав их публичными.
// IAM binding for making function public
resource "yandex_function_iam_binding" "postbox_function_binding" {
function_id = yandex_function.postbox_function.id
role = "functions.functionInvoker"
members = ["system:allUsers"]
}
Запуск
Теперь, когда функции развернуты, вы можете отправить сообщение вызвав функцию:
SEND_FUNC_ID=$(terraform -chdir=./tf output -raw function_id)
curl -XPOST \
"https://functions.yandexcloud.net/$SEND_FUNC_ID" \
-H "Content-Type: application/json"
После этого вы получите сообщение на указанный email адрес.