Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Истории успеха
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • AI Studio
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Истории успеха
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Практические руководства
    • Все руководства
    • Сокращатель ссылок
    • Ввод данных в системы хранения
    • Хранение журналов работы приложения
    • Развертывание веб-приложения с использованием Java Servlet API
    • Разработка Slack-бота
    • Разработка Telegram-бота
    • Разработка Telegram-бота с поддержкой AI-агента
    • Разработка пользовательской интеграции в API Gateway
    • Разработка CRUD API для сервиса фильмов
    • Построение пайплайна CI/CD в GitLab
    • Настройка CI/CD между Cloud Functions и SourceCraft
    • Настройка CI/CD между Cloud Functions и GitHub
    • Работа с API-шлюзом по протоколу WebSocket
    • Создание интерактивного serverless-приложения с использованием WebSocket
    • Автоматическое копирование объектов из одного бакета Object Storage в другой
    • Визуализация логов в Grafana с помощью плагина Cloud Logging
    • Канареечный релиз функции Cloud Functions
    • Интерактивная отладка функций Cloud Functions
    • Создание функции Node.js с помощью TypeScript
    • Запуск контейнерного приложения в Serverless Containers
    • Передача событий Yandex Cloud Postbox в Data Streams и их анализ с помощью DataLens
    • Использование API Gateway для настройки синтеза речи в SpeechKit
    • Подключение к YDB из функции Cloud Functions на Python
    • Подключение к базе данных YDB из функции Cloud Functions на Node.js
    • Защита API Gateway при помощи Smart Web Security
    • Развертывание веб-приложения с JWT-авторизацией в API Gateway и аутентификацией в Firebase
    • Автоматическая загрузка данных в Yandex SpeechSense с помощью Yandex Workflows
    • Настройка реагирования в Cloud Logging и Yandex Cloud Functions
    • Настройка интеграций Workflows с Tracker, YandexGPT и Yandex Cloud Postbox
    • Разработка функций в Functions Framework и их развертывание в Yandex Serverless Containers
    • Создание адреса Yandex Cloud Postbox и проверка владения доменом с помощью Terraform
      • .NET Core
      • Go
      • JavaScript
      • Python
    • Создание AI-агента с помощью Yandex Cloud Functions
    • Настройка Postfix для отправки через Yandex Cloud Postbox

В этой статье:

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Подготовьте ресурсы
  • Настройте директорию для аутентификационных данных
  • Использование переменных окружения
  • Создайте и запустите приложение
  • Проверьте результат
  • Как удалить созданные ресурсы
  1. Бессерверные технологии
  2. Отправка писем в Yandex Cloud Postbox с помощью AWS SDK
  3. Python

Отправка писем с помощью AWS SDK для Python

Статья создана
Yandex Cloud
Обновлена 30 июля 2025 г.
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
    • Подготовьте ресурсы
  • Настройте директорию для аутентификационных данных
    • Использование переменных окружения
  • Создайте и запустите приложение
  • Проверьте результат
  • Как удалить созданные ресурсы

В этом руководстве вы научитесь отправлять электронные письма через Yandex Cloud Postbox с использованием AWS SDK для Python (Boto3).

Чтобы начать отправлять электронные письма:

  1. Подготовьте облако к работе.
  2. Настройте директорию для аутентификационных данных.
  3. Создайте и запустите приложение.
  4. Проверьте результат.

Если созданные ресурсы вам больше не нужны, удалите их.

Подготовьте облако к работеПодготовьте облако к работе

Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь.
  2. На странице Yandex Cloud Billing убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.

Подробнее об облаках и каталогах.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость поддержки инфраструктуры входят:

  • плата за использование Yandex Cloud Postbox (см. тарифы Yandex Cloud Postbox);
  • плата за публичные DNS-запросы и зоны DNS, если вы создаете ресурсную запись в Cloud DNS (см. тарифы Cloud DNS).

Подготовьте ресурсыПодготовьте ресурсы

  1. Создайте сервисный аккаунт.
  2. Назначьте сервисному аккаунту роль postbox.sender.
  3. Создайте статический ключ доступа для сервисного аккаунта. Сохраните идентификатор и секретный ключ.
  4. Создайте адрес.
  5. Пройдите проверку владения доменом.

Настройте директорию для аутентификационных данныхНастройте директорию для аутентификационных данных

  1. Создайте директорию для хранения аутентификационных данных и перейдите в нее:

    Для macOS и Linux:

    mkdir ~/.aws/
    

    Для Windows:

    mkdir C:\Users\<имя_пользователя>\.aws\
    
  2. В директории .aws создайте файл credentials и скопируйте в него аутентификационные данные, полученные при создании статического ключа доступа:

    [default]
    aws_access_key_id = <идентификатор_статического_ключа>
    aws_secret_access_key = <секретный_ключ>
    
  3. Создайте файл config с параметрами региона по умолчанию и скопируйте в него следующую информацию:

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

Использование переменных окруженияИспользование переменных окружения

AWS SDK по умолчанию использует аутентификационные данные из переменных окружения, если они заданы. Эти переменные имеют приоритет над аутентификационными данными, которые указаны в файле .aws/credentials.

Поддерживаются следующие переменные окружения:

  • AWS_ACCESS_KEY_ID — идентификатор статического ключа;
  • AWS_SECRET_ACCESS_KEY — секретный ключ.

Чтобы задать переменные окружения, выполните следующие действия в зависимости от вашей операционной системы:

Linux/macOS
Windows

В терминале выполните команду:

export AWS_ACCESS_KEY_ID=<идентификатор_статического_ключа>
export AWS_SECRET_ACCESS_KEY=<секретный_ключ>

В PowerShell выполните команду:

$Env:AWS_ACCESS_KEY_ID=<идентификатор_статического_ключа>
$Env:AWS_SECRET_ACCESS_KEY=<секретный_ключ>

Создайте и запустите приложениеСоздайте и запустите приложение

  1. Получите код приложения:

    Репозиторий
    Вручную
    1. Склонируйте репозиторий:

      git clone https://github.com/yandex-cloud-examples/yc-postbox-examples
      
    2. Перейдите в папку в склонированном репозитории /.
    3. В файле raw.py укажите данные:

      • В поле SENDER — электронную почту отправителя.

        Домен электронной почты отправителя должен совпадать с указанным в адресе Yandex Cloud Postbox, созданном при подготовке к работе. Например, если домен, на который вы подтвердили владение, — yourdomain.com, можно указать электронную почту noreply@yourdomain.com или admin@yourdomain.com, а user@mail.yourdomain.com — нельзя.

      • В поле RECIPIENT — электронную почту получателя. Например: receiver@yourdomain.com. Далее для проверки вам потребуется доступ к этой электронной почте.

    1. Создайте папку postbox-python и перейдите в нее.

    2. Создайте файл raw.py и вставьте в него код:

      import boto3
      from botocore.config import Config
      from email.mime.multipart import MIMEMultipart
      from email.mime.text import MIMEText
      from email.mime.application import MIMEApplication
      import os
      
      # Адрес отправителя должен быть подтвержден с помощью Amazon SES.
      SENDER = "<адрес_отправителя>"
      
      # Адрес получателя.
      RECIPIENT = "<адрес_получателя>"
      
      # Тема письма.
      SUBJECT = "Yandex Cloud Postbox Raw Email Test via AWS SDK for Python"
      
      # Путь к файлу, который нужно вложить в письмо.
      ATTACHMENT = "attachment.txt"
      
      # HTML-текст письма.
      HTML_BODY = """<h1>Amazon SES Raw Email Test (AWS SDK for Python)</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-python/'>AWS SDK for Python</a> with raw email format.</p>
      <p>Please see the attached file.</p>"""
      
      # Текст письма для почтовых клиентов без поддержки HTML.
      TEXT_BODY = "This email was sent with Yandex Cloud Postbox using the AWS SDK for Python with raw email format. Please see the attached file."
      
      # Кодировка символов в письме.
      CHARSET = "UTF-8"
      
      def main():
          # Создание пользовательского резолвера эндпоинта для Yandex Cloud Postbox
          endpoint_url = "https://postbox.cloud.yandex.net"
      
          # Настройка клиента SES с пользовательским эндпоинтом
          config = Config(
              region_name="ru-central1",
              # Раскомментируйте следующую строку для включения отладочного логирования
              # parameter_validation=False,
          )
      
          # Создание клиента SES
          # По умолчанию SDK использует цепочку поставщиков учетных данных по умолчанию
          # Вы можете использовать статические учетные данные, раскомментировав и изменив следующие строки:
          # session = boto3.Session(
          #     aws_access_key_id='accessKeyID',
          #     aws_secret_access_key='secretAccessKey',
          # )
          # ses_client = session.client('sesv2', config=config, endpoint_url=endpoint_url)
      
          # Использование учетных данных по умолчанию
          ses_client = boto3.client('sesv2', config=config, endpoint_url=endpoint_url)
      
          # Создание родительского контейнера multipart/mixed
          msg = MIMEMultipart('mixed')
          # Добавление строк: тема, от кого, кому
          msg['Subject'] = SUBJECT
          msg['From'] = SENDER
          msg['To'] = RECIPIENT
      
          # Создание дочернего контейнера multipart/alternative
          msg_body = MIMEMultipart('alternative')
      
          # Кодирование содержимого в текстовом и HTML-формате и установка кодировки символов
          textpart = MIMEText(TEXT_BODY.encode(CHARSET), 'plain', CHARSET)
          htmlpart = MIMEText(HTML_BODY.encode(CHARSET), 'html', CHARSET)
      
          # Добавление частей с текстовым и HTML-содержимым в дочерний контейнер
          msg_body.attach(textpart)
          msg_body.attach(htmlpart)
      
          # Определение части с вложением и кодирование с помощью MIMEApplication
          try:
              att = MIMEApplication(open(ATTACHMENT, 'rb').read())
              # Добавление заголовка, чтобы указать почтовому клиенту, что эту часть нужно рассматривать как вложение
              att.add_header('Content-Disposition', 'attachment', filename=os.path.basename(ATTACHMENT))
              # Прикрепление вложения к родительскому контейнеру
              msg.attach(att)
          except FileNotFoundError:
              print(f"Warning: Attachment file {ATTACHMENT} not found. Sending email without attachment.")
      
          # Прикрепление дочернего контейнерf multipart/alternative к родительскому контейнеру multipart/mixed
          msg.attach(msg_body)
      
          # Преобразование MIME-сообщение в строку, а затем в байты
          raw_message = str(msg)
          raw_message_bytes = bytes(raw_message, CHARSET)
      
          try:
              # Отправка письма
              response = ses_client.send_email(
                  FromEmailAddress=SENDER,
                  Destination={
                      'ToAddresses': [RECIPIENT]
                  },
                  Content={
                      'Raw': {
                          'Data': raw_message_bytes
                      }
                  }
              )
              # Вывод идентификатора письма
              print(f"Email sent! Message ID: {response['MessageId']}")
          except Exception as e:
              print(f"Error sending email: {e}")
              raise
      
      if __name__ == "__main__":
          main()
      
    3. В файле raw.py укажите данные:

      • В поле SENDER — электронную почту отправителя.

        Домен электронной почты отправителя должен совпадать с указанным в адресе Yandex Cloud Postbox, созданном при подготовке к работе. Например, если домен, на который вы подтвердили владение, — yourdomain.com, можно указать электронную почту noreply@yourdomain.com или admin@yourdomain.com, а user@mail.yourdomain.com — нельзя.

      • В поле RECIPIENT — электронную почту получателя. Например: receiver@yourdomain.com. Далее для проверки вам потребуется доступ к этой электронной почте.

    4. Создайте файл requirements.txt и вставьте в него строку: boto3.

    5. Создайте файл attachment.txt и вставьте в него любой текст.

  2. Создайте виртуальную среду и установите зависимости:

    Linux/MacOS
    Windows
    python -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
    
    python -m venv venv
    source venv\Scripts\activate
    pip install -r requirements.txt
    

    Результат:

    ...
    Successfully installed boto3-1.39.4 botocore-1.39.4 jmespath-1.0.1 python-dateutil-2.9.0.post0 s3transfer-0.13.0 six-1.17.0 urllib3-2.5.0
    
  3. Запустите приложение:

    python raw.py
    

    Результат:

    Email sent! Message ID: DB9WSLG38TUS.11PW8********@ingress2-klg
    

Проверьте результатПроверьте результат

Убедитесь, что на адрес получателя, заданный в файле raw.py в поле RECIPIENT, пришло письмо с указанными параметрами. Письмо должно содержать вложение — файл attachment.txt.

Как удалить созданные ресурсыКак удалить созданные ресурсы

Чтобы перестать платить за созданные ресурсы:

  1. Удалите адрес.
  2. Удалите зону DNS, если создавали в ней ресурсную запись.

Была ли статья полезна?

Предыдущая
JavaScript
Следующая
Создание AI-агента с помощью Yandex Cloud Functions
Проект Яндекса
© 2025 ООО «Яндекс.Облако»