[Yandex Cloud documentation](../../index.md) > [Tutorials](../index.md) > [Serverless technologies](index.md) > Sending emails in Yandex Cloud Postbox using the AWS SDK > Go

# Sending emails using AWS SDK for Go

In this tutorial, you will learn how to send emails via Yandex Cloud Postbox using the [AWS SDK for Go](https://docs.aws.amazon.com/sdk-for-go/v2/developer-guide/getting-started).

To start sending emails:

1. [Get your cloud ready](#before-begin).
1. [Configure a directory for authentication data](#auth).
1. [Create and run the application](#app).
1. [Check the result](#check-result).

If you no longer need the resources you created, [delete them](#clear-out).


## Get your cloud ready {#before-begin}

Sign up for Yandex Cloud and create a [billing account](../../billing/concepts/billing-account.md):
1. Navigate to the [management console](https://console.yandex.cloud) and log in to Yandex Cloud or create a new account.
1. On the **[Yandex Cloud Billing](https://center.yandex.cloud/billing/accounts)** page, make sure you have a billing account linked and it has the `ACTIVE` or `TRIAL_ACTIVE` [status](../../billing/concepts/billing-account-statuses.md). If you do not have a billing account, [create one](../../billing/quickstart/index.md) and [link](../../billing/operations/pin-cloud.md) a cloud to it.

If you have an active billing account, you can create or select a [folder](../../resource-manager/concepts/resources-hierarchy.md#folder) for your infrastructure on the [cloud page](https://console.yandex.cloud/cloud).

[Learn more about clouds and folders here](../../resource-manager/concepts/resources-hierarchy.md).


### Required paid resources {#paid-resources}

The infrastructure support costs include:

* Fee for using Yandex Cloud Postbox (see [Yandex Cloud Postbox pricing](../../postbox/pricing.md)).
* Fee for public DNS queries and [DNS zones](../../dns/concepts/dns-zone.md), if you are creating a resource record in Cloud DNS (see [Cloud DNS pricing](../../dns/pricing.md)).


### Set up resources {#infrastructure}

1. [Create](../../iam/operations/sa/create.md) a service account.
1. [Assign](../../iam/operations/sa/assign-role-for-sa.md) the `postbox.sender` [role](../../postbox/security/index.md#postbox-sender) to the service account.
1. [Create](../../iam/operations/authentication/manage-access-keys.md) a static access key for the service account. Save the ID and secret key.
1. Create an [address](../../postbox/operations/create-address.md).
1. [Pass](../../postbox/operations/check-domain.md) a domain ownership check.


## Configure a directory for authentication data {#auth}

1. Create a directory to store the authentication data in and navigate to it: 

    For macOS and Linux:

    ```bash
    mkdir ~/.aws/
    ```

    For Windows:

    ```bash
    mkdir C:\Users\<user_name>\.aws\
    ```

1. In the `.aws` directory, create a file named `credentials`, copy the credentials you got when [creating a static access key](#infrastructure), and paste them into it:

    ```text
    [default]
    aws_access_key_id = <static_key_ID>
    aws_secret_access_key = <secret_key>
    ```

1. Create a file named `config` with the default region settings and copy the following information to it:

    ```text
    [default]
    region = ru-central1
    endpoint_url = https://postbox.cloud.yandex.net
    ```


### Using environment variables {#variables}

By default, the AWS SDK uses authentication data from environment variables if they are set. These variables have priority over authentication data from the `.aws/credentials` file.

The following environment variables are supported:

* `AWS_ACCESS_KEY_ID`: Static key ID.
* `AWS_SECRET_ACCESS_KEY`: Secret key.

To set environment variables, depending on your operating system, follow these steps:

{% list tabs group=operating_system %}

- Linux/macOS

    In the terminal, run this command:

    ```bash
    export AWS_ACCESS_KEY_ID=<static_key_ID>
    export AWS_SECRET_ACCESS_KEY=<secret_key>
    ```

- Windows

    In PowerShell, run:

    ```powershell
    $Env:AWS_ACCESS_KEY_ID=<static_key_ID>
    $Env:AWS_SECRET_ACCESS_KEY=<secret_key>
    ```

{% endlist %}


## Create and run the application {#app}

1. Get the application code:

    {% list tabs %}

    - Repository

      1. Clone the repository:
         
         ```bash
         git clone https://github.com/yandex-cloud-examples/yc-postbox-examples
         ```
      1. Navigate to the folder in the cloned `go/simple/` repository.
      1. In the `main.go` file, specify the following:
         
         * Sender's email address in the `Sender` field.
         
             The sender's email domain must match the one specified in the Yandex Cloud Postbox address you created when [getting started](#infrastructure). For example, if your verified domain is `yourdomain.com`, you can use addresses like `noreply@yourdomain.com` or `admin@yourdomain.com` but not `user@mail.yourdomain.com`.
         
         * Recipient's email address in the `Recipient` field, e.g., `receiver@domain.com`. You will need access to this email address for the next step.
      1. Go to the `go/` directory.

    - Manually

      1. Create a directory named `postbox-go` and open it.
      1. Create a file named `main.go` and paste this code into it:

          ```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 (
            // The sender's address must be verified using Amazon SES.
            Sender = "<sender_address>"

            // Recipient's address.
            Recipient = "<recipient_address>"

            // Email subject.
            Subject = "Yandex Cloud Postbox Test via AWS SDK for Go"

            // HTML text of the email.
            HtmlBody = "<h1>Amazon SES Test Email (AWS SDK for Go)</h1><p>This email was sent with " +
              "<a href='https://yandex.cloud/en/docs/postbox/quickstart'>Yandex Cloud Postbox</a> using the " +
              "<a href='https://aws.amazon.com/sdk-for-go/'>AWS SDK for Go</a>.</p>"

            // Email text for email clients without HTML support.
            TextBody = "This email was sent with Yandex Cloud Postbox using the AWS SDK for Go."

            // Character encoding in the email.
            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,
            })

            // Building the email.
            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),
            }

            // Sending the email.
            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
          }
          ```

      1. In the `main.go` file, specify the following:
         
         * Sender's email address in the `Sender` field.
         
             The sender's email domain must match the one specified in the Yandex Cloud Postbox address you created when [getting started](#infrastructure). For example, if your verified domain is `yourdomain.com`, you can use addresses like `noreply@yourdomain.com` or `admin@yourdomain.com` but not `user@mail.yourdomain.com`.
         
         * Recipient's email address in the `Recipient` field, e.g., `receiver@domain.com`. You will need access to this email address for the next step.
      1. Create a file named `go.mod` and paste this code into it:

          ```goalng
          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
          )
          ```

    {% endlist %}

1. Install the dependencies:

    ```bash
    go mod tidy
    ```

    Result:

    ```text
    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
    ```

1. Run the application:

    ```bash
    go run main.go
    ```

    Result:

    ```text
    DAEBWI6L7WN5.1RLCK********@ingress2-sas
    ```


## Check the result {#check-result}

Make sure the recipient specified in the file named `main.go` in the `Recipient` field has received an email with the specified parameters.


## How to delete the resources you created {#clear-out}

To stop paying for the resources you created:

1. Delete the [address](../../postbox/concepts/glossary.md#adress).
1. [Delete](../../dns/operations/zone-delete.md) the DNS zone if you created a resource record in it.