Отправка писем с помощью AWS SDK для Go
В этом руководстве вы научитесь отправлять электронные письма через Yandex Cloud Postbox с использованием AWS SDK для Go
Чтобы начать отправлять электронные письма:
- Подготовьте облако к работе.
- Настройте директорию для аутентификационных данных.
- Создайте и запустите приложение.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за использование Yandex Cloud Postbox (см. тарифы Yandex Cloud Postbox);
- плата за публичные DNS-запросы и зоны DNS, если вы создаете ресурсную запись в Cloud DNS (см. тарифы Cloud DNS).
Подготовьте ресурсы
- Создайте сервисный аккаунт.
- Назначьте сервисному аккаунту роль
postbox.sender
. - Создайте статический ключ доступа для сервисного аккаунта. Сохраните идентификатор и секретный ключ.
- Создайте адрес.
- Пройдите проверку владения доменом.
Настройте директорию для аутентификационных данных
-
Создайте директорию для хранения аутентификационных данных и перейдите в нее:
Для macOS и Linux:
mkdir ~/.aws/
Для Windows:
mkdir C:\Users\<имя_пользователя>\.aws\
-
В директории
.aws
создайте файлcredentials
и скопируйте в него аутентификационные данные, полученные при создании статического ключа доступа:[default] aws_access_key_id = <идентификатор_статического_ключа> aws_secret_access_key = <секретный_ключ>
-
Создайте файл
config
с параметрами региона по умолчанию и скопируйте в него следующую информацию:[default] region = ru-central1 endpoint_url = https://postbox.cloud.yandex.net
Использование переменных окружения
AWS SDK по умолчанию использует аутентификационные данные из переменных окружения, если они заданы. Эти переменные имеют приоритет над аутентификационными данными, которые указаны в файле .aws/credentials
.
Поддерживаются следующие переменные окружения:
AWS_ACCESS_KEY_ID
— идентификатор статического ключа;AWS_SECRET_ACCESS_KEY
— секретный ключ.
Чтобы задать переменные окружения, выполните следующие действия в зависимости от вашей операционной системы:
В терминале выполните команду:
export AWS_ACCESS_KEY_ID=<идентификатор_статического_ключа>
export AWS_SECRET_ACCESS_KEY=<секретный_ключ>
В PowerShell выполните команду:
$Env:AWS_ACCESS_KEY_ID=<идентификатор_статического_ключа>
$Env:AWS_SECRET_ACCESS_KEY=<секретный_ключ>
Создайте и запустите приложение
-
Получите код приложения:
РепозиторийВручную-
Склонируйте репозиторий:
git clone https://github.com/yandex-cloud-examples/yc-postbox-examples
- Перейдите в папку в склонированном репозитории
go/simple/
. -
В файле
main.go
укажите данные:-
В поле
Sender
— электронную почту отправителя.Домен электронной почты отправителя должен совпадать с указанным в адресе Yandex Cloud Postbox, созданном при подготовке к работе. Например, если домен, на который вы подтвердили владение, —
yourdomain.com
, можно указать электронную почтуnoreply@yourdomain.com
илиadmin@yourdomain.com
, аuser@mail.yourdomain.com
— нельзя. -
В поле
Recipient
— электронную почту получателя. Например:receiver@domain.com
. Далее для проверки вам потребуется доступ к этой электронной почте.
-
- Перейдите в папку
go/
.
-
Создайте папку
postbox-go
и перейдите в нее. -
Создайте файл
main.go
и вставьте в него код:package main import ( "context" "fmt" "net/url" "os" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/sesv2" "github.com/aws/aws-sdk-go-v2/service/sesv2/types" transport "github.com/aws/smithy-go/endpoints" ) const ( // Адрес отправителя должен быть подтвержден с помощью Amazon SES. Sender = "<адрес_отправителя>" // Адрес получателя. Recipient = "<адрес_получателя>" // Тема письма. Subject = "Yandex Cloud Postbox Test via AWS SDK for Go" // HTML-текст письма. HtmlBody = "<h1>Amazon SES Test Email (AWS SDK for Go)</h1><p>This email was sent with " + "<a href='https://yandex.cloud/ru/docs/postbox/quickstart'>Yandex Cloud Postbox</a> using the " + "<a href='https://aws.amazon.com/sdk-for-go/'>AWS SDK for Go</a>.</p>" // Текст письма для почтовых клиентов без поддержки HTML. TextBody = "This email was sent with Yandex Cloud Postbox using the AWS SDK for Go." // Кодировка символов в письме. CharSet = "UTF-8" ) func main() { cfg, err := config.LoadDefaultConfig( context.Background(), ) if err != nil { fmt.Println("unable to load SDK config, " + err.Error()) os.Exit(1) } client := sesv2.New(sesv2.Options{ Region: "ru-central1", EndpointResolverV2: &resolverV2{}, Credentials: cfg.Credentials, }) // Сборка письма. input := &sesv2.SendEmailInput{ Destination: &types.Destination{ ToAddresses: []string{Recipient}, }, Content: &types.EmailContent{ Simple: &types.Message{ Subject: &types.Content{ Charset: aws.String(CharSet), Data: aws.String(Subject), }, Body: &types.Body{ Html: &types.Content{ Charset: aws.String(CharSet), Data: aws.String(HtmlBody), }, Text: &types.Content{ Charset: aws.String(CharSet), Data: aws.String(TextBody), }, }, }, }, FromEmailAddress: aws.String(Sender), } // Отправка письма. ctx := context.Background() res, err := client.SendEmail(ctx, input) if err != nil { panic(err) } fmt.Println(*res.MessageId) } type resolverV2 struct{} func (*resolverV2) ResolveEndpoint(_ context.Context, _ sesv2.EndpointParameters) ( transport.Endpoint, error, ) { u, err := url.Parse("https://postbox.cloud.yandex.net") if err != nil { return transport.Endpoint{}, err } return transport.Endpoint{ URI: *u, }, nil } type staticCredentialsProvider struct { accessKeyID string secretAccessKey string } func (s *staticCredentialsProvider) Retrieve(_ context.Context) (aws.Credentials, error) { return aws.Credentials{ AccessKeyID: s.accessKeyID, SecretAccessKey: s.secretAccessKey, }, nil }
-
В файле
main.go
укажите данные:-
В поле
Sender
— электронную почту отправителя.Домен электронной почты отправителя должен совпадать с указанным в адресе Yandex Cloud Postbox, созданном при подготовке к работе. Например, если домен, на который вы подтвердили владение, —
yourdomain.com
, можно указать электронную почтуnoreply@yourdomain.com
илиadmin@yourdomain.com
, аuser@mail.yourdomain.com
— нельзя. -
В поле
Recipient
— электронную почту получателя. Например:receiver@domain.com
. Далее для проверки вам потребуется доступ к этой электронной почте.
-
-
Создайте файл
go.mod
и вставьте в него код:module postbox go 1.23 require ( github.com/aws/aws-sdk-go-v2 v1.36.3 github.com/aws/aws-sdk-go-v2/config v1.29.14 github.com/aws/aws-sdk-go-v2/service/sesv2 v1.42.0 github.com/aws/smithy-go v1.22.2 github.com/emersion/go-message v0.18.2 ) require ( github.com/aws/aws-sdk-go-v2/credentials v1.17.67 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.33 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 // indirect )
-
-
Установите зависимости:
go mod tidy
Результат:
go: downloading github.com/aws/aws-sdk-go-v2 v1.36.3 go: downloading github.com/aws/aws-sdk-go-v2/service/sesv2 v1.42.0 ... go: downloading github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34
-
Запустите приложение:
go run main.go
Результат:
DAEBWI6L7WN5.1RLCK********@ingress2-sas
Проверьте результат
Убедитесь, что на адрес получателя, заданный в файле main.go
в поле Recipient
, пришло письмо с указанными параметрами.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: