Настройка 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.
Удалите созданные ресурсы
Чтобы перестать платить за созданные ресурсы: