Створення облікового запису (Mailbox)
Нам потрібно зареєструвати нову скриньку в системі docker-mailserver. Це створить необхідну структуру папок та додасть логін/пароль до бази Postfix.
docker exec -it mailserver setup email add main@your.domain
Введіть два рази пароль до скриньки.
Налаштування Catch-all (перехоплення всіх листів)
У docker-mailserver це робиться через створення спеціального аліасу (псевдоніма) з використанням зірочки *. Це вкаже поштовому серверу Postfix: «Якщо лист прийшов на будь-яку адресу в домені your.domain, і для неї немає окремої скриньки — віддай його користувачу main@your.domain».
Виконай команду:
# Add a wildcard alias to redirect all mail for the domain
docker exec -it mailserver setup alias add *@your.domain main@your.domain
Перевірка облікового запису та аліасу всередині сервера
Щоб переконатися, що docker-mailserver правильно записав дані у свої конфіги:
# Список усіх поштових скриньок
docker exec mailserver setup email list
# Список усіх аліасів (тут ми маємо побачити наш catch-all)
docker exec mailserver setup alias list
Якщо щось пішло не так...
#Remove the alias with the literal asterisk
docker exec -it mailserver setup alias del "*@your.domain" main@your.domain
# added new
docker exec -it mailserver setup alias add "@your.domain" main@your.domain
Базові DNS-записи (MX та SPF)
Щоб пошта почала доходити на main@your.domain, нам потрібно налаштувати записи в панелі керування доменом your.domain.
-
MX-запис (Discovery): Цей запис каже поштовим серверам: «Якщо хочете надіслати лист на @your.domain, йдіть до сервера mail.your.domain».
- Тип: MX
- Хост/Ім'я: @ (або порожній) Значення: mail.your.domain. (крапка в кінці важлива) Пріоритет: 10
-
SPF-запис (Authorization): Цей запис підтверджує, що твій сервер має право відправляти пошту від імені your.domain.
- Тип: TXT
- Хост/Ім'я: @
- Значення: v=spf1 ip4:17.22.56.133 -all
(Примітка: ми використовуємо той самий IP, що і для основного сервера).
Перевірка DNS (зовнішній світ)
Навіть якщо ти зберіг записи в панелі, вони мають «прорости» в мережі. Перевіримо їх за допомогою dig:
# Перевірка MX-запису (куди йде пошта)
dig MX your.domain +short
# Перевірка SPF-запису (дозвіл на відправку)
dig TXT your.domain +short | grep v=spf1
Якщо у відповідь ти бачиш 10 your.domain. та свій SPF рядок — значить, DNS працює.
Генерація та налаштування DKIM для your.domain
Потрібен унікальний ключ для нового домену. Навіть якщо основний домен має DKIM, для your.domain потрібен свій власний підпис.
Згенерєм ключ всередині контейнера:
# Generate DKIM keys for the new domain
docker exec -it mailserver setup config dkim domain your.domain
Після генерації ключ з'явиться у папці конфігурації:
# Show the public key to copy it to DNS
cat ./docker-data/dms/config/opendkim/keys/your.domain/mail.txt
Що робити з результатом:
Ти побачиш рядок, який виглядає приблизно так: mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; p=MIIBI..." ).
Тобі потрібно додати TXT-запис у DNS для your.domain:
- Тип: TXT
- Хост/Ім'я: mail._domainkey
- Значення: Весь рядок у лапках, що йде після TXT (починаючи з v=DKIM1...).
Генерація ключа DKIM з іншим селектором
енеруємо ключ із новим селектором:
docker exec -it mailserver setup config dkim domain your.domain selector dkim
Дивимось новий запис
cat ./docker-data/dms/config/opendkim/keys/your.domain/dkim.txt
Потрібно вручну (або через grep/sed) виправити 2 файли. Вони знаходяться у папці конфігурації
./docker-data/dms/config/opendkim/Там мають бути два основні файли:SigningTableтаKeyTable. Треба видалити непотрібні строки.
Налаштування DMARC для your.domain
DMARC каже іншим серверам: «Я налаштував SPF та DKIM. Якщо лист прийшов без них — ось що з ним робити». Оскільки це новий домен, ми почнемо з «м'якої» політики, щоб нічого не заблокувати випадково.
Додай TXT-запис у DNS для your.domain:
- Тип: TXT
- Хост/Ім'я: _dmarc
- Значення: v=DMARC1; p=none; rua=mailto:alert@your.domain
p=none: Політика «тільки спостереження». Якщо щось піде не так із DKIM/SPF, листи все одно будуть доставлені, але ти отримаєш звіт.rua=mailto:...: Сюди сервіси (як Google) надсилатимуть звіти про стан твоїх листів.
Налаштування чорних та білих списків (Filtering)
У docker-mailserver найшвидший спосіб заблокувати конкретного спамера або домен — це використання файлу postfix-receive-access.cf. Це працює на рівні "входу": якщо відправник у списку, сервер навіть не буде приймати лист.
Створення/редагування списку:
Потрібно створити (або відкрити) файл у папці конфігурації на хост-машині:
./docker-data/dms/config/postfix-receive-access.cf
Формат записів:
Додай адреси або домени, які хочеш заблокувати або дозволити:
# Blacklist specific email
spammer@evil.com REJECT
# Blacklist whole domain
bad-domain.net REJECT
# Whitelist (allow even if spam filters are suspicious)
trusted-partner.com OK
Застосування змін:
Після редагування файлу потрібно перезапустити поштовий сервер (або зачекати, поки він сам оновить конфіг, але рестарт надійніше):
docker compose restart mailserver
Чому це важливо для catch-all: Спамери часто перебирають імена (admin@, info@, sales@). Якщо ти помітиш, що на якусь конкретну "неіснуючу" адресу йде забагато сміття, можна заблокувати відправника саме тут.
Блокування для конкретної скриньки (Sieve-фільтри)
Якщо ти хочеш, щоб лист від someone@gmail.com блокувався тільки при спробі написати на me@your.domain, але проходив на інші скриньки, тобі знадобляться Sieve-фільтри.
Як це працює в docker-mailserver: Для кожного користувача можна створити файл із правилами обробки пошти.
Шлях до файлу: ./docker-data/dms/config/sieve/main@your.domain.sieve
Приклад правила для блокування:
require ["fileinto", "reject"];
if address :is "from" "bad-person@example.com" {
discard;
stop;
}
discardпросто видаляє лист без жодного повідомлення відправнику.
Що краще? Для боротьби зі спамом на catch-all краще використовувати глобальне блокування (Postfix), бо воно економить ресурси сервера — лист відхиляється ще на етапі "привітання", не завантажуючись повністю.
Перевірка авторизації (Логін у скриньку)
Тепер потрібно підключити свій поштовий клієнт (Thunderbird, Outlook, Apple Mail або мобільний додаток) до нової адреси.
Дані для підключення:
- Логін (Username): main@your.domain
- Пароль: Той, який ти ввів на Кроці 1.
- Сервер (IMAP/SMTP): mail.griva.top (використовуємо твій основний хостнейм, на який виписаний SSL-сертифікат).
Порти:
- IMAP: 993 (SSL/TLS)
- SMTP: 465 (SSL/TLS) або 587 (STARTTLS)
Як перевірити через термінал (якщо не хочеться відкривати клієнт):
Простою командою всередині контейнера:
# Тест авторизації через внутрішню утиліту (заміни password)
docker exec -it mailserver testsaslauthd -u main@your.domain -p password
Якщо отримаєш 0: OK "Success." — значить, пароль вірний і сервер готовий до роботи.
Команда
testsaslauthdнамагається зв'язатися з сервісом saslauthd. Проте у сучасному docker-mailserver за аутентифікацію (логін та пароль) зазвичай відповідаєDovecot, а сервіс saslauthd може бути взагалі вимкнений або використовувати інший шлях до сокета.
Коли ти бачиш No such file or directory, це означає, що утиліта не знайшла «трубу» (сокет), через яку вона має передати запит на перевірку.
Виконай цю команду:
# Тестування авторизації через Dovecot
docker exec -it mailserver doveadm auth test main@your.domain "ТВІЙ_ПАРОЛЬ"
Що ти маєш побачити:
- Якщо все добре: passdb: me@griva.org.ua auth succeeded
- Якщо пароль невірний: passdb: me@griva.org.ua auth failed
Відправка тестового листа через SWAKS
Ми використаємо інструмент swaks, який вбудований у docker-mailserver. Він дозволяє відправити лист і одразу побачити в консолі, як сервер спілкується з отримувачем.
-
Зайди на mail-tester.com та скопіюй адресу (наприклад, test-abcdef@mail-tester.com).
-
Виконай команду:
docker exec -it mailserver swaks --to ВАША_АДРЕСА_З_MAIL_TESTER \ --from main@your.domain \ --server localhost --port 25 \ --header "Subject: Testing dkim2 selector for griva.org.ua" \ --body "Checking if the space in DNS is gone and DKIM is valid now."На що звернути увагу:
-
У терміналі: Ти маєш побачити 250 2.0.0 Ok: queued as .... Це означає, що твій сервер прийняв лист і відправив його далі.
-
На сайті mail-tester.com: Натисни "Then check your score".
Sieve-фільтри (Автоматичне сортування)
Sieve — це потужна мова сценаріїв для фільтрації пошти на рівні сервера. Ми налаштуємо її так, щоб листи розкладалися по папках залежно від того, на який саме аліас вони прийшли.
- На хост-машині створи файл за цим шляхом:
./docker-data/dms/config/sieve/main@your.domain.sieve - Додай логіку сортування:
Ось приклад, який автоматично створює папки та розкладає пошту:
require ["fileinto", "mailbox", "copy"];
# If the email was sent to 'billing@your.domain'
if address :is "to" "billing@your.domain" {
fileinto :create "Finance";
stop;
}
# If the email was sent to 'news@your.domain'
if address :is "to" "news@your.domain" {
fileinto :create "Newsletters";
stop;
}
# Example of moving everything else that is NOT sent directly to 'main@'
if not address :is "to" "main@your.domain" {
fileinto :create "Catch-all";
stop;
}
Що це дає:
- Листи на main@your.domain залишаються в Inbox.
- Листи на billing@ автоматично створюють папку Finance і йдуть туди.
- Весь інший "хвіст" від catch-all падає в окрему папку Catch-all, щоб не заважати тобі в основній скриньці.
Як активувати фільтр:
Просто збережи файл. docker-mailserver автоматично підхоплює .sieve файли для користувачів. Якщо ти вже підключений через поштовий клієнт (наприклад, Thunderbird), ти побачиш, як нові папки з'являються самі при надходженні пошти.
Оновлення SSL-сертифіката (Certbot)
Якщо, ти використовуєш Certbot (Let's Encrypt). Щоб додати новий домен, не видаляючи старі, використовуй прапорець --expand.
Важливо: Перед цим переконайся, що в DNS для домену your.domain створено запис mail (A-запис або CNAME), який вказує на твій IP, інакше Let's Encrypt не зможе підтвердити володіння доменом.
Виконай команду на хост-машині:
# Оновлення сертифіката з додаванням нового домену
sudo certbot certonly --expand \
-d main.domain \
-d second.domain \
-d your.domain
Що це зробить:
- Certbot знайде існуючий сертифікат для main.domain.
- Додасть до нього your.domain.
- Оновить файли в /etc/letsencrypt/live/your.domain/.
або, з використанням docker
sudo docker run --rm -it \
-p 80:80 \
-v "./docker-data/certbot/certs/:/etc/letsencrypt/" \
certbot/certbot certonly --standalone --expand --non-interactive --agree-tos \
-m main@your.domain \
-d ... -d ... -d mail.your.domain