Unicode‑адреса в email — это не «будущее когда‑нибудь», а вполне рабочая технология из набора стандартов EAI (Email Address Internationalization) и расширения SMTPUTF8. Практически это означает возможность получать и отправлять письма на адреса вроде тест@пример.рф, где и локальная часть, и домен могут быть в Unicode. В этой инструкции разберём, как включить поддержку SMTPUTF8 в Postfix и довести доставку до ящиков Dovecot, не разрушив совместимость и доставляемость.
Коротко: что такое EAI и SMTPUTF8
EAI — набор RFC, позволяющий использовать UTF‑8 в email‑адресах: в локальной части и доменном имени. SMTPUTF8 — соответствующее расширение протокола SMTP/LMTP, при котором участники цепочки явно договариваются, что в конверте и заголовках могут быть не‑ASCII символы.
Важно различать EAI и IDN:
- IDN (Internationalized Domain Names) — домены в Unicode. Для DNS они преобразуются в Punycode (A‑label), например пример.рф → xn--e1afmkfd.xn--p1ai.
- EAI/SMTPUTF8 — дополнительно разрешает UTF‑8 в локальной части адреса, то есть в части до «@». Для таких адресов ASCII‑эквивалента может не существовать вовсе.
Даже если DNS уже работает с IDN, без SMTPUTF8 письмо на юникодный локал‑парт будет некорректным — сервер обязан отклонить или попытаться понизить формат, а понижение стандартизовано не для всех случаев.
Если вы планируете адреса на родном языке, заранее позаботьтесь о домене: регистрируйте IDN через регистрацию доменов, чтобы иметь читабельный адрес и корректную Punycode‑зону в DNS.
Предпосылки и версии ПО
Что проверить перед включением:
- Postfix 3.0+ (рекомендуется 3.6/3.7+). Поддержка SMTPUTF8 есть давно; корректная работа с IDNA2008 зависит от системной библиотеки idn2.
- Dovecot 2.2+ (лучше 2.3+). LMTP‑сервер Dovecot умеет SMTPUTF8, IMAP — расширение UTF8=ACCEPT для имён папок и интернационализации.
- Фильтры/milter/антивирусы не должны ломать UTF‑8 в заголовках и конверте.
- Системная локаль и конфиги — в UTF‑8. Не смешивайте кодировки в картах Postfix и базах пользователей.
План безопасного включения
- Соберите инвентарь: версии Postfix/Dovecot, как устроена доставка (local vs LMTP), какие фильтры используются, какие клиенты подключаются.
- Подготовьте бэкапы main.cf/master.cf (Postfix) и dovecot.conf (или conf.d).
- Включите SMTPUTF8 на стенде/тестовом домене, прогоните тесты, проверьте логи.
- Переключите прод по расписанию с возможностью быстрого отката.

Включаем SMTPUTF8 в Postfix
Проверьте, собрана ли поддержка и текущее значение:
postconf -n | grep -i smtputf8
postconf -d | grep -i smtputf8
Если параметр не задан явно, добавьте в main.cf:
# /etc/postfix/main.cf
smtputf8_enable = yes
# Рекомендуется зафиксировать уровень современных дефолтов
compatibility_level = 2
Перезагрузите Postfix и проверьте, что SMTP‑сервер объявляет поддержку:
postfix reload
# Проверка EHLO
openssl s_client -starttls smtp -crlf -connect 127.0.0.1:587
EHLO localhost
QUIT
В ответе на EHLO ожидайте строку:
250-SMTPUTF8
Это значит, что ваш Postfix как сервер готов принимать письма с UTF‑8 в адресах и заголовках. Как клиент он также использует SMTPUTF8 при исходящих соединениях, если удалённая сторона объявит расширение. Не забудьте про STARTTLS и валидный сертификат — при необходимости оформите или продлите SSL-сертификаты.
Доставка на LMTP (Dovecot)
Если доставка из Postfix в ящики идёт через Dovecot LMTP, Postfix автоматически будет использовать «SMTPUTF8» и в LMTP‑диалоге. Обычно дополнительных настроек в Postfix не требуется — достаточно рабочего LMTP‑транспорта.
# /etc/postfix/main.cf (фрагмент связки с Dovecot LMTP)
virtual_transport = lmtp:unix:private/dovecot-lmtp
Убедитесь, что сокет LMTP существует по указанному пути и обслуживается Dovecot.
Готовим Dovecot к EAI
В Dovecot включаем LMTP и проверяем IMAP‑возможности. Базовый скелет может выглядеть так:
# /etc/dovecot/dovecot.conf (или conf.d)
protocols = imap pop3 lmtp
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
# Имена папок в IMAP хранятся в UTF-8 по умолчанию в современных Dovecot
namespace inbox {
inbox = yes
}
После перезапуска Dovecot проверьте, что LMTP приветствие содержит поддержку SMTPUTF8 (Dovecot объявляет её автоматически):
systemctl reload dovecot
# Быстрый тест LMTP-диалога через UNIX-сокет
socat - UNIX-CONNECT:/var/spool/postfix/private/dovecot-lmtp
LHLO test
QUIT
В IMAP‑сеансе полезно увидеть в CAPABILITY флаг UTF8=ACCEPT — большинство современных Dovecot его объявляет по умолчанию:
# Примерно так должно быть видно
* CAPABILITY IMAP4rev1 LITERAL+ SASL-IR UIDPLUS ID ENABLE AUTH=PLAIN STARTTLS UTF8=ACCEPT
Пользователи и аутентификация
Технически Dovecot может хранить имена ящиков и папок в UTF‑8, но безопаснее разделять две сущности:
- Аутентификационное имя пользователя (login) — оставить в ASCII (например, user1 или alias@example.com), чтобы не ломать автоконфиги клиентов.
- Почтовые адреса для приёма — могут быть в Unicode, а на уровне Postfix вы сопоставляете их с логином через карты виртуальных алиасов.
Для сопоставления используйте обычные карты Postfix; файл храните в UTF‑8:
# /etc/postfix/virtual (пример)
тест@пример.рф user1
# Активация карт
postmap /etc/postfix/virtual
postconf -e "virtual_alias_maps = hash:/etc/postfix/virtual"
postfix reload
Тесты: входящие, исходящие, LMTP
Проверка объявления EHLO
openssl s_client -starttls smtp -crlf -connect 127.0.0.1:25
EHLO localhost
QUIT
Ожидаем в ответе строку 250-SMTPUTF8.
Тест входящей доставки на Unicode‑адрес
Удобно использовать swaks, он умеет выставлять флаг SMTPUTF8:
swaks --to "тест@пример.рф" --from "sender@example.com" --smtputf8 --server 127.0.0.1 --port 25
В логах Postfix вы увидите, что конверт прошёл и письмо ушло в LMTP доставку к Dovecot. Если какой‑то фильтр не поддерживает расширение, появится «SMTPUTF8 is required but not offered» — разбирайте цепочку по журналам.
Тест исходящей отправки
Проверьте, что Postfix как клиент запрашивает SMTPUTF8 при отправке на внешние MTA, которые его объявляют, и корректно обрабатывает отсутствие поддержки у адресата:
# Включите умеренный лог TLS на время проверки
postconf -e "smtp_tls_loglevel = 1"
postfix reload
# Отправьте письмо на внешний Unicode-адрес и мониторьте /var/log/mail.log

Совместимость: что будет, если адресат без SMTPUTF8
Реальность: часть внешних MTA по‑прежнему не поддерживает SMTPUTF8.
- Доменная часть. IDN автоматически трансформируется в Punycode для DNS‑запросов.
- Локальная часть. Стандартизованного преобразования локальной части в ASCII не существует. Если у адресата «юникодный» локал‑парт, а его сервер не поддерживает SMTPUTF8, доставка должна быть отклонена.
- Алиасы‑двойники. Практично держать пару адресов: Unicode‑вариант и ASCII‑алиас в тот же ящик.
- Маршрутизация через совместимый смарт‑хост. Для отдельных направлений отправляйте через релей, который гарантированно понимает SMTPUTF8.
В Postfix для отдельных отправителей можно настроить особую маршрутизацию:
# /etc/postfix/main.cf
sender_dependent_relayhost_maps = hash:/etc/postfix/relay_by_sender
smtp_sender_dependent_authentication = yes
# /etc/postfix/relay_by_sender
sender@example.com [smtp.relay.local]:587
postmap /etc/postfix/relay_by_sender
postfix reload
Для повышения доставляемости также проверьте SPF/PTR и базовую репутацию: пригодится руководство по настройке SPF и PTR в Postfix.
Фильтры, антиспам и заголовки
Если у вас на пути стоят milter/контент‑фильтры (антиспам, антивирус), проверьте:
- Они не ломают заголовки с UTF‑8 и корректно добавляют свои поля.
- Они не отклоняют письма лишь из‑за Unicode в адресах.
Полезно временно включить копирование входящих/исходящих в диагностический журнал с видимыми конвертом и заголовками. Для серверных правил удобно использовать Sieve — см. серверные фильтры Sieve в Dovecot.
Хранение, кодировки и бэкапы
- Пути к ящикам и имена папок — UTF‑8. Убедитесь, что резервные копии, ротация и скрипты учёта корректно работают с такими путями.
- Скрипты интеграции (экспорты в CRM и т. п.) готовы к Unicode‑адресам в заголовках From/To/Reply‑To.
- Если используете SQL/LDAP для директорий и алиасов — колонки и соединения должны быть в UTF‑8.
Диагностика и типичные ошибки
- Нет «250‑SMTPUTF8» в EHLO. Проверьте
smtputf8_enableи не отключены ли расширения черезsmtpd_discard_ehlo_keywords. - LMTP не принимает Unicode. Убедитесь, что доставка идёт в Dovecot LMTP, а не в локальный агент. Проверьте сокет и логи Dovecot.
- «SMTPUTF8 is required, but not offered». Ищите виновника по цепочке: входящий SMTP, фильтр, исходящий SMTP/LMTP.
- Клиент не создаёт папки с Unicode‑именами. Проверьте IMAP CAPABILITY на «UTF8=ACCEPT» и настройки клиента.
- Нечитаемые символы в журналах/скриптах. Где‑то не UTF‑8. Проверьте локали сервисов, кодировку файлов карт Postfix и соединений к БД.
Откат
Если после включения обнаружились критичные несовместимости, откат делается быстро:
- В Postfix установить
smtputf8_enable = no, выполнитьpostfix reload. - Сообщить пользователям, что приём Unicode‑адресов временно недоступен (опционально задать ASCII‑алиасы).
- Разобрать цепочку, где именно ломается поддержка, и возвращаться точечно.
Контрольная памятка перед продом
- Postfix 3.x и
smtputf8_enable = yes. - Рабочий LMTP к Dovecot, проверен диалог LHLO.
- Карты виртуальных алиасов и транспортов — в UTF‑8, тестовые Unicode‑адреса принимаются.
- IMAP CAPABILITY содержит UTF8=ACCEPT, клиенты создают/читают папки с Unicode‑именами.
- Фильтры/антивирусы пропускают письма с Unicode‑адресами без порчи заголовков.
- Набор тестов: входящие/исходящие, большие письма, вложения, пересылка, автоответчики.
Итоги
Включение EAI/SMTPUTF8 в связке Postfix + Dovecot — это уже рутинная задача: пара настроек в Postfix, проверка LMTP‑цепочки и внимательное отношение к кодировкам. Острые углы — совместимость с узлами без SMTPUTF8 и состояние фильтров на пути. Решаются они организационно (алиасы‑двойники, согласование с контрагентами) и технично (маршрутизация через совместимый релей, корректная валидация на входе). Сделайте это один раз методично — и ваша почтовая система безболезненно примет письма с адресов на родном языке.


