Перейти к основному содержимому

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 адрес.