Настройка Postfix для отправки через Yandex Cloud Postbox
В этом руководстве вы научитесь отправлять электронные письма через Yandex Cloud Postbox с использованием Postfix
Чтобы начать отправлять электронные письма:
- Подготовьте облако к работе.
- Создайте ВМ для Postfix.
- Установите и настройте Postfix.
- Отправьте письмо.
- Отправьте MIME-письмо с вложением.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за постоянно запущенную ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud);
- плата за использование Yandex Cloud Postbox (см. тарифы Yandex Cloud Postbox);
- плата за публичные DNS-запросы и зоны DNS, если вы создаете ресурсную запись в Cloud DNS (см. тарифы Cloud DNS).
Подготовьте ресурсы
-
Создайте адрес.
-
Пройдите проверку владения доменом.
-
Создайте сервисный аккаунт в том же каталоге, в котором находится адрес. Если вы создадите сервисный аккаунт и адрес в разных каталогах, при попытке отправить письмо возникнет ошибка.
-
Создайте ключ для сервисного аккаунта:
- Для отправки письма по протоколу SMTP с аутентификацией по API-ключу создайте API-ключ. При создании API-ключа задайте область действия
yc.postbox.send
. Надежно сохраните полученный секретный ключ. После того как вы закроете окно, параметры секретного ключа станут недоступны. - Для отправки письма с помощью AWS CLI или по протоколу SMTP с аутентификацией по паролю создайте статический ключ доступа. Надежно сохраните идентификатор и секретный ключ. После того как вы закроете окно, параметры секретного ключа станут недоступны.
- Для отправки письма по протоколу SMTP с аутентификацией по API-ключу создайте API-ключ. При создании API-ключа задайте область действия
Создайте ВМ для Postfix
-
В консоли управления
выберите каталог, в котором будет создана ВМ. -
В списке сервисов выберите Compute Cloud.
-
На панели слева выберите
Виртуальные машины. -
Нажмите Создать виртуальную машину.
-
Выберите вариант Расширенная настройка.
-
В блоке Образ загрузочного диска выберите образ Ubuntu 24.04 LTS.
-
В блоке Расположение выберите зону доступности, в которой будет находиться ВМ.
-
В блоке Диски и файловые хранилища настройте загрузочный диск:
- Тип —
HDD
. - Размер —
20 ГБ
.
- Тип —
-
В блоке Вычислительные ресурсы перейдите на вкладку Своя конфигурация и укажите рекомендуемые параметры для сервера почты:
- Платформа —
Intel Ice Lake
. - vCPU —
2
. - Гарантированная доля vCPU —
100%
. - RAM —
2 ГБ
.
- Платформа —
-
В блоке Сетевые настройки:
-
В поле Подсеть укажите подсеть в зоне доступности создаваемой ВМ или выберите облачную сеть из списка.
-
У облачной сети должна быть как минимум одна подсеть. Если подсети нет, создайте ее, выбрав Создать подсеть.
-
Если сети нет, нажмите Создать сеть и создайте ее:
- В открывшемся окне укажите имя сети и выберите каталог, в котором она будет создана.
- Нажмите Создать сеть.
-
-
В поле Публичный IP-адрес выберите
Автоматически
, чтобы назначить виртуальной машине случайный внешний IP-адрес из пула Yandex Cloud, или выберите статический адрес из списка, если вы зарезервировали его заранее.
-
-
В блоке Доступ выберите SSH-ключ и укажите данные для доступа к ВМ:
-
В поле Логин введите имя пользователя, который будет создан на виртуальной машине, например
ubuntu
.Внимание
Не используйте логин
root
или другие имена, зарезервированные операционной системой. Для выполнения операций, требующих прав суперпользователя, используйте командуsudo
. -
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
-
Нажмите кнопку Добавить ключ.
-
Задайте имя SSH-ключа.
-
Выберите вариант:
-
Ввести вручную
— вставьте содержимое открытого SSH-ключа. Пару SSH-ключей необходимо создать самостоятельно. -
Загрузить из файла
— загрузите открытую часть SSH-ключа. Пару SSH-ключей необходимо создать самостоятельно. -
Сгенерировать ключ
— автоматическое создание пары SSH-ключей.При добавлении сгенерированного SSH-ключа будет создан и загружен архив с парой ключей. В ОС на базе Linux или macOS распакуйте архив в папку
/home/<имя_пользователя>/.ssh
. В ОС Windows распакуйте архив в папкуC:\Users\<имя_пользователя>/.ssh
. Дополнительно вводить открытый ключ в консоли управления не требуется.
-
-
Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации. Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя внутри создаваемого ресурса.
-
-
-
В блоке Общая информация задайте имя ВМ. Требования к имени:
- длина — от 2 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
Примечание
Имя виртуальной машины используется для генерации внутреннего FQDN единожды — при создании ВМ. Если для вас важен внутренний FQDN, учитывайте это и задавайте нужное имя ВМ при создании.
-
Нажмите Создать ВМ.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>
. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name
или --folder-id
.
-
Посмотрите описание команды CLI для создания виртуальной машины:
yc compute instance create --help
-
Создайте виртуальную машину в каталоге по умолчанию:
yc compute instance create \ --name postfix-server \ --zone ru-central1-b \ --platform-id standard-v3 \ --cores 2 \ --core-fraction 100 \ --memory 2 \ --create-boot-disk image-family=ubuntu-2404-lts,image-folder-id=standard-images,size=20GB,type=network-hdd \ --network-interface subnet-name=<имя_подсети>,nat-ip-version=ipv4 \ --ssh-key <путь_к_SSH-ключу>
Где:
-
--name
— имя ВМ. Требования к имени:- длина — от 2 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
Примечание
Имя виртуальной машины используется для генерации внутреннего FQDN единожды — при создании ВМ. Если для вас важен внутренний FQDN, учитывайте это и задавайте нужное имя ВМ при создании.
-
--zone
— зона доступности, которая соответствует выбранной подсети. -
--platform-id
— платформа -
--cores
— количество vCPU ВМ. -
--core-fraction
— гарантированная доля vCPU в %. -
--memory
— объем оперативной памяти ВМ. -
--create-boot-disk
— параметры загрузочного диска:size
— размер,image-id
— идентификатор используемого образа. -
--network-interface
— настройки сетевого интерфейса ВМ:subnet-name
— имя выбранной подсети.nat-ip-version=ipv4
– публичный IP-адрес. Чтобы создать ВМ без публичного IP-адреса, исключите параметр.
-
--ssh-key
— путь к файлу и имя файла с открытой частю SSH-ключа. Пару SSH-ключей необходимо создать самостоятельно.
Результат:
id: epde5biu1a4e******** folder_id: b1g681qpemb4******** created_at: "2025-08-20T11:01:11Z" name: postfix-server zone_id: ru-central1-b platform_id: standard-v3 resources: memory: "2147483648" cores: "2" core_fraction: "100" status: RUNNING metadata_options: gce_http_endpoint: ENABLED aws_v1_http_endpoint: ENABLED gce_http_token: ENABLED aws_v1_http_token: DISABLED boot_disk: mode: READ_WRITE device_name: epd1akno91gv******** auto_delete: true disk_id: epd1akno91gv******** network_interfaces: - index: "0" mac_address: d0:0d:**:**:**:** subnet_id: e2lb1da2dd9v******** primary_v4_address: address: 10.129.**.** one_to_one_nat: address: 84.201.***.*** ip_version: IPV4 serial_port_settings: ssh_authorization: OS_LOGIN gpu_settings: {} fqdn: epde5biu1a4e********.auto.internal scheduling_policy: {} network_settings: type: STANDARD placement_policy: {} hardware_generation: legacy_features: pci_topology: PCI_TOPOLOGY_V1
-
Воспользуйтесь методом REST API create для ресурса Instance или вызовом gRPC API InstanceService/Create.
Установите и настройте Postfix
-
Подключитесь к ВМ по SSH:
ssh -i <путь_к_закрытому_SSH-ключу> <имя_пользователя_ВМ>@<публичный_IP-адрес_ВМ>
-
Установите Postfix и необходимые модули:
sudo apt update sudo apt install -y postfix libsasl2-modules
-
После установки в терминале появится интерфейс настройки Postfix:
- На первом шаге выберите
Internet with smarthost
, затем с помощью клавиш TAB и Enter нажмите OK. - Нажмите OK на всех последующих шагах.
- Дождитесь завершения настройки.
- На первом шаге выберите
-
Выполните команду настройки Postfix:
sudo postconf -e \ "relayhost = postbox.cloud.yandex.net:587" \ "smtp_sasl_auth_enable = yes" \ "smtp_sasl_security_options = noanonymous" \ "smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" \ "smtp_use_tls = yes" \ "smtp_tls_security_level = secure" \ "smtp_tls_note_starttls_offer = yes"
-
Проверьте, не задана ли в конфигурации директива резервного узла доставки, и отключите ее:
-
Откройте файл
/etc/postfix/master.cf
и найдите строку:-o smtp_fallback_relay=
-
Если такая строка есть, закомментируйте ее, добавив символ
#
в начало строки. -
Сохраните файл.
-
-
Укажите учетные данные SMTP для Yandex Cloud Postbox:
-
Откройте (или создайте) файл
/etc/postfix/sasl_passwd
и добавьте в него строку:postbox.cloud.yandex.net:587 SMTP_USERNAME:SMTP_PASSWORD
-
Аутентифицируйтесь:
API-ключCтатический ключ доступаВ файле
/etc/postfix/sasl_passwd
:- Замените
SMTP_USERNAME
на идентификатор API-ключа, который вы получили при подготовке ресурсов. - Замените
SMTP_PASSWORD
на секретную часть API-ключа.
-
Создайте файл
generate.py
и вставьте в него код:#!/usr/bin/env python3 import hmac import hashlib import base64 import argparse import sys # These values are required to calculate the signature. Do not change them. DATE = "20230926" SERVICE = "postbox" MESSAGE = "SendRawEmail" REGION = "ru-central1" TERMINAL = "aws4_request" VERSION = 0x04 def sign(key, msg): return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest() def calculate_key(secret_access_key): signature = sign(("AWS4" + secret_access_key).encode("utf-8"), DATE) signature = sign(signature, REGION) signature = sign(signature, SERVICE) signature = sign(signature, TERMINAL) signature = sign(signature, MESSAGE) signature_and_version = bytes([VERSION]) + signature smtp_password = base64.b64encode(signature_and_version) return smtp_password.decode("utf-8") def main(): if sys.version_info[0] < 3: raise Exception("Must be using Python 3") parser = argparse.ArgumentParser( description="Convert a Secret Access Key to an SMTP password." ) parser.add_argument("secret", help="The Secret Access Key to convert.") args = parser.parse_args() print(calculate_key(args.secret)) if __name__ == "__main__": main()
-
Сгенерируйте пароль:
python3 generate.py <секретный_ключ>
Где
<секретный_ключ>
— секретный ключ статического ключа доступа сервисного аккаунта, который вы получили при подготовке ресурсов.Используйте Python не ниже версии 3.
-
В файле
/etc/postfix/sasl_passwd
:- Замените
SMTP_USERNAME
на идентификатор статического ключа доступа. - Замените
SMTP_PASSWORD
на сгенерированный пароль.
- Замените
- Замените
-
Сохраните файл
/etc/postfix/sasl_passwd
.
-
-
Создайте хеш-таблицу с учетными данными:
sudo postmap hash:/etc/postfix/sasl_passwd
-
(Рекомендуется) Ограничьте доступ к файлам с учетными данными:
sudo chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
-
Укажите корневой сертификат для проверки TLS-соединения:
sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt'
-
Перезапустите Postfix, чтобы применить настройки:
sudo systemctl restart postfix
Отправьте письмо
В этом примере вы отправите письмо с простым текстом без вложений.
-
Выполните команду:
sendmail -f <адрес_отправителя> <адрес_получателя>
Важно
Здесь и далее адрес отправителя должен соответствовать домену, для которого вы проходили проверку владения при подготовке ресурсов.
-
Вставьте в терминал следующий текст и нажмите Enter:
From: <адрес_отправителя> Subject: Test Yandex Cloud Postbox via Postfix This is a test message sent via Yandex Cloud Postbox (SMTP, Postfix). .
-
Проверьте почтовый ящик получателя.
Если письмо не пришло, изучите лог Postfix:
/var/log/mail.log
.
Подробности отправки сообщения
-
После запуска команды
sendmail -f ... <адрес_получателя>
терминал перейдет в интерактивный режим ввода письма. -
Сначала введите заголовки, по одному на строку. Минимум:
From:
иSubject:
.- Заголовок
From:
должен соответствовать домену, разрешенному в Yandex Cloud Postbox. - Заголовок
To:
можно добавить для наглядности, но он не обязателен — получатель уже задан в команде.
- Заголовок
-
Вставьте пустую строку, чтобы отделить заголовки от тела письма.
-
Введите текст письма. Можно несколько строк.
-
Завершите ввод, поставив одиночную точку на отдельной строке и нажав Enter. В этой строке не должно быть пробелов.
-
При успешной отправке
sendmail
завершится без вывода. Для подробного отладочного вывода используйте ключ-v
:sendmail -v -f <адрес_отправителя> <адрес_получателя>
-
Чтобы отменить ввод без отправки, нажмите
Ctrl+C
. -
Для нескольких получателей перечислите их через пробел в команде:
sendmail -f <адрес_отправителя> <адрес_получателя_1> <адрес_получателя_2>
-
Не используйте в примере не-ASCII-текст. Если требуется не-ASCII (UTF-8), кодируйте:
- Заголовки по RFC 2047 (пример для темы):
Subject: =?UTF-8?B?BASE64_ENCODED_SUBJECT?=
. - Тело письма через MIME с
charset=UTF-8
иContent-Transfer-Encoding: quoted-printable
илиbase64
.
- Заголовки по RFC 2047 (пример для темы):
-
Для адресов с международными доменами используйте Punycode
(IDNA ), например:sendmail -f user@xn--d1acpjx3f.xn--p1ai recipient@xn--e1afmkfd.xn--p1ai From: <user@xn--d1acpjx3f.xn--p1ai>
Отправьте MIME-письмо с вложением
В этом примере вы отправите письмо с текстом в формате HTML и прикрепленным файлом example.txt
.
-
Создайте файл
mime-email.txt
и вставьте в него код:From: <адрес_отправителя> Subject: Test email via Yandex Cloud Postbox MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="BOUNDARY-OUTER" --BOUNDARY-OUTER Content-Type: multipart/alternative; boundary="BOUNDARY-INNER" --BOUNDARY-INNER Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable This is the plain text part sent via Yandex Cloud Postbox SMTP. --BOUNDARY-INNER Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <html> <body> <h1>Hello!</h1> <p>This is the HTML part sent via Yandex Cloud Postbox SMTP.</p> </body> </html> --BOUNDARY-INNER-- --BOUNDARY-OUTER Content-Type: application/octet-stream MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="example.txt" U2FtcGxlIGF0dGFjaG1lbnQgY29udGVudA== --BOUNDARY-OUTER--
Где:
From:
— адрес отправителя.Subject:
— тема письма.
-
Отправьте письмо:
sendmail -f <адрес_отправителя> <адрес_получателя> < mime-email.txt
-
Проверьте почтовый ящик получателя.
Если письмо не пришло, изучите лог Postfix:
/var/log/mail.log
.
Удалите созданные ресурсы
Чтобы перестать платить за созданные ресурсы: