Архитектура
| Назначение | Адрес | Примечание |
|---|---|---|
| WebAdmin | https://mailadmin.ferso.ru/admin/ | Администрирование Stalwart |
| SMTP/IMAP hostname | mx1.ferso.ru | Общий для всех почтовых доменов |
| Входящая почта | 25/tcp | Обмен между почтовыми серверами |
| SMTP SSL/TLS | 465/tcp | Рекомендуется для приложений |
| SMTP STARTTLS | 587/tcp | Альтернативный вариант |
| IMAP SSL/TLS | 993/tcp | Чтение входящих писем |
TLS готов: для
mx1.ferso.ru используется доверенный сертификат Let’s Encrypt.1. Добавление нового домена
- Откройте WebAdmin.
- Перейдите: Management → Directory → Domains → Create.
- Создайте домен example.com.
- Выберите:
DNS management: Manual,DKIM management: Automatic,Certificate management: Manual. - После сохранения откройте View DNS Zone File и скопируйте созданные Stalwart DKIM-записи.
Важно: отдельный TLS-сертификат для каждого почтового домена не нужен. Клиенты всегда подключаются к
mx1.ferso.ru.2. DNS-записи
Минимально нужны четыре группы записей: MXSPFDKIMDMARC
MX
| Тип | Имя | Приоритет | Значение |
|---|---|---|---|
| MX | @ | 10 | mx1.ferso.ru |
dig +short MX example.com @1.1.1.1SPF
| Тип | Имя | Значение |
|---|---|---|
| TXT | @ | v=spf1 mx -all |
У домена должна быть только одна SPF-запись. Существующую политику нужно объединять, а не создавать вторую TXT-запись SPF.
DKIM
Точные selector и публичные ключи копируются из View DNS Zone File. Обычно Stalwart создаёт RSA и Ed25519.
dig +short TXT v1-ed25519-YYYYMMDD._domainkey.example.com @1.1.1.1
dig +short TXT v1-rsa-YYYYMMDD._domainkey.example.com @1.1.1.1RSA-ключ может отображаться в панели DNS несколькими фрагментами, но это одна логическая TXT-запись.
DMARC
| Тип | Имя | Значение |
|---|---|---|
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:postmaster@example.com |
Сначала используйте
p=none. После успешных тестов переходите на quarantine, затем на reject.3. Аккаунты, aliases и App Password
Создание аккаунта
Откройте Management → Directory → Accounts → Create и создайте, например:
admin@example.comОбязательные aliases
postmaster@example.com → admin@example.com
abuse@example.com → admin@example.comApp Password
- Откройте личный кабинет.
- Войдите под нужным почтовым аккаунтом.
- Перейдите: Credentials → App Passwords → Create.
- Создавайте отдельный App Password для каждого приложения.
Никогда не публикуйте: основной пароль, App Password, recovery-пароль, API key или содержимое
.env.4. Настройки SMTP
Рекомендуемый вариант
| SMTP host | mx1.ferso.ru |
|---|---|
| SMTP port | 465 |
| Encryption | SSL/TLS |
| Authentication | LOGIN или PLAIN |
| Username | admin@example.com |
| Password | App Password аккаунта |
Альтернатива с STARTTLS
| Host | mx1.ferso.ru |
|---|---|
| Port | 587 |
| Encryption | STARTTLS |
Переменные окружения
SMTP_HOST=mx1.ferso.ru
SMTP_PORT=465
SMTP_SECURE=true
SMTP_USER=admin@example.com
SMTP_PASSWORD=<APP_PASSWORD>5. Настройки IMAP
| IMAP host | mx1.ferso.ru |
|---|---|
| IMAP port | 993 |
| Encryption | SSL/TLS |
| Username | admin@example.com |
| Password | App Password |
Подходят Thunderbird, Outlook, Apple Mail и другие IMAP-клиенты. Отдельный веб-клиент на сервере не установлен.
6. Проверка настройки
DNS
dig +short MX example.com @1.1.1.1
dig +short TXT example.com @1.1.1.1
dig +short TXT _dmarc.example.com @1.1.1.1SMTP AUTH через swaks
read -r -s -p "App Password: " SMTP_PASSWORD
echo
swaks \
--server mx1.ferso.ru \
--port 465 \
--tls-on-connect \
--auth LOGIN \
--auth-user admin@example.com \
--auth-password "$SMTP_PASSWORD" \
--auth-hide-password \
--quit-after AUTH
unset SMTP_PASSWORDОжидаемый ответ: 235 2.7.0 Authentication succeeded.
Проверка TLS
openssl s_client \
-connect mx1.ferso.ru:465 \
-servername mx1.ferso.ru \
-verify_return_error \
</dev/null 2>&1 \
| grep -E 'subject=|issuer=|Verify return code'Ожидается Verify return code: 0 (ok).
Проверка доставленного письма
В служебных заголовках должны быть:
spf=pass
dkim=pass
dmarc=pass7. Примеры кода
Nodemailer / TypeScript
import nodemailer from "nodemailer";
const transporter = nodemailer.createTransport({
host: "mx1.ferso.ru",
port: 465,
secure: true,
auth: {
user: "admin@example.com",
pass: process.env.SMTP_PASSWORD!,
},
});
await transporter.verify();
await transporter.sendMail({
from: "Site <admin@example.com>",
to: "recipient@example.net",
subject: "Проверка SMTP",
text: "Почтовый сервер работает.",
});Python
import os
import smtplib
from email.message import EmailMessage
message = EmailMessage()
message["From"] = "Site <admin@example.com>"
message["To"] = "recipient@example.net"
message["Subject"] = "Проверка SMTP"
message.set_content("Почтовый сервер работает.")
with smtplib.SMTP_SSL("mx1.ferso.ru", 465, timeout=30) as smtp:
smtp.login("admin@example.com", os.environ["SMTP_PASSWORD"])
smtp.send_message(message)Не используйте
rejectUnauthorized: false: сертификат mx1.ferso.ru доверенный и должен проверяться клиентом.8. Безопасность и ограничения
- Пароли и App Password хранятся только в секретах приложения или в
.env, который не публикуется. - API key не является SMTP-паролем.
STALWART_RECOVERY_ADMINиспользуется только для аварийного восстановления.- MX основного домена
ferso.ruменять нельзя: его почта обслуживается сторонним провайдером. - Желательный PTR:
109.235.187.56 → mx1.ferso.ru. PTR настраивается у провайдера сервера.
9. Чек-лист нового домена
- Добавить домен example.com в Stalwart.
- Создать почтовый аккаунт.
- Создать aliases
postmasterиabuse. - Добавить MX, SPF, оба DKIM-ключа и DMARC.
- Дождаться распространения DNS.
- Создать отдельный App Password.
- Проверить SMTP AUTH и отправить тестовое письмо.
- Проверить
spf=pass,dkim=pass,dmarc=pass. - Подключить приложение к
mx1.ferso.ru:465. - После тестов повысить DMARC до
quarantine, затем доreject.