Отправка писем с помощью AWS SDK для Python
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
В этом руководстве вы научитесь отправлять электронные письма через Yandex Cloud Postbox с использованием AWS SDK для Python (Boto3)
Чтобы начать отправлять электронные письма:
- Подготовьте облако к работе.
- Настройте директорию для аутентификационных данных.
- Создайте и запустите приложение.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в 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 = kz1 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
- Перейдите в папку в склонированном репозитории
/
. -
В файле
raw.py
укажите данные:-
В поле
SENDER
— электронную почту отправителя.Домен электронной почты отправителя должен совпадать с указанным в адресе Yandex Cloud Postbox, созданном при подготовке к работе. Например, если домен, на который вы подтвердили владение, —
yourdomain.com
, можно указать электронную почтуnoreply@yourdomain.com
илиadmin@yourdomain.com
, аuser@mail.yourdomain.com
— нельзя. -
В поле
RECIPIENT
— электронную почту получателя. Например:receiver@yourdomain.com
. Далее для проверки вам потребуется доступ к этой электронной почте.
-
-
Создайте папку
postbox-python
и перейдите в нее. -
Создайте файл
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="kz1", # Раскомментируйте следующую строку для включения отладочного логирования # 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()
-
В файле
raw.py
укажите данные:-
В поле
SENDER
— электронную почту отправителя.Домен электронной почты отправителя должен совпадать с указанным в адресе Yandex Cloud Postbox, созданном при подготовке к работе. Например, если домен, на который вы подтвердили владение, —
yourdomain.com
, можно указать электронную почтуnoreply@yourdomain.com
илиadmin@yourdomain.com
, аuser@mail.yourdomain.com
— нельзя. -
В поле
RECIPIENT
— электронную почту получателя. Например:receiver@yourdomain.com
. Далее для проверки вам потребуется доступ к этой электронной почте.
-
-
Создайте файл
requirements.txt
и вставьте в него строку:boto3
. -
Создайте файл
attachment.txt
и вставьте в него любой текст.
-
-
Создайте виртуальную среду и установите зависимости:
Linux/MacOSWindowspython -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
-
Запустите приложение:
python raw.py
Результат:
Email sent! Message ID: DB9WSLG38TUS.11PW8********@ingress2-klg
Проверьте результат
Убедитесь, что на адрес получателя, заданный в файле raw.py
в поле RECIPIENT
, пришло письмо с указанными параметрами. Письмо должно содержать вложение — файл attachment.txt
.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: