Mail

Налагодження пошти на Ubuntu Server 24.04 можна виконати різними способами, залежно від твоїх цілей: чи це тільки надсилання листів із сайту, чи повноцінний поштовий сервер для прийому/відправки пошти (SMTP, IMAP/POP3), з вебінтерфейсом, захистом, DNS-записами тощо.

Я розділю на два основні сценарії:


1. Тільки надсилання пошти (наприклад, з сайту):

Мінімально необхідне:

  • Встановити Postfix в режимі "Internet Site"

  • Указати правильний домен

  • Додати SPF, DKIM, DMARC записи у DNS

  • Можливо, використовувати SMTP-реле (SendGrid, Mailgun, Gmail SMTP, тощо)

Приклад:

sudo apt update
sudo apt install postfix mailutils -y

При установці вибери: "Internet Site", а як "System mail name" — твій домен (напр., example.com)

Після цього можна перевірити надсилання:

echo "Test message" | mail -s "Test subject" you@example.com

2. Повноцінний поштовий сервер (вхідна та вихідна пошта):

Це складніший сценарій. Потрібні наступні компоненти:

Основні пакети:

  • postfix — SMTP сервер для відправки/прийому пошти

  • dovecot — IMAP/POP3 сервер (щоб читати пошту)

  • spamassassin + clamav — захист від спаму/вірусів

  • opendkim — підпис DKIM

  • certbot — SSL (обов'язково!)

  • вебінтерфейс (optional): Roundcube, RainLoop, Mailcow (Docker), тощо


Кроки налагодження вручну (Postfix + Dovecot):

1. Postfix:

sudo apt install postfix -y

Обрати "Internet Site", mail name = твій домен (наприклад, mail.example.com)

Після встановлення, редагуй конфіг:

sudo nano /etc/postfix/main.cf

Перевір, щоб були такі рядки:

myhostname = mail.example.com
mydomain = example.com
myorigin = /etc/mailname
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8
home_mailbox = Maildir/
smtpd_tls_cert_file=/etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_use_tls=yes

2. Dovecot:

sudo apt install dovecot-core dovecot-imapd dovecot-pop3d -y

Найпростіше використовувати пошту у форматі Maildir у домашній папці:

sudo nano /etc/dovecot/conf.d/10-mail.conf

Знайди та встанови:

mail_location = maildir:~/Maildir

Увімкни ім'я користувача/пароль:

sudo nano /etc/dovecot/conf.d/10-auth.conf

Убери # з:

disable_plaintext_auth = yes

Увімкни IMAP/POP3 протоколи:

sudo nano /etc/dovecot/dovecot.conf

Додай:

protocols = imap pop3 lmtp

3. Сертифікат SSL (через Let's Encrypt):

sudo apt install certbot python3-certbot-apache -y
sudo certbot certonly --standalone -d mail.example.com

Після отримання сертифікату, додай його в конфіги Postfix та Dovecot (приклад вище).


4. DNS-записи (на твоєму DNS-хостингу):

A-запис:

mail    A    <твій IP>

MX-запис:

@    MX 10   mail.example.com.

SPF:

example.com. TXT "v=spf1 mx ~all"

DKIM + DMARC:

Потрібно налаштовувати додатково через opendkim та створити відповідні TXT записи.


5. Перевірка роботи:

Після перезапуску сервісів:

sudo systemctl restart postfix dovecot

Перевірка портів:

ss -tuln | grep -E '25|587|993|995'

Альтернатива — Готові рішення:

Якщо не хочеш морочитися з конфігами вручну:

  • Mailcow (на Docker) — повноцінний поштовий сервер з сучасним інтерфейсом

  • iRedMail — встановлює одразу все (Postfix, Dovecot, SpamAssassin, вебінтерфейс і панель)


Уявімо, я все необхідне зробив вручну. Як додати користувача (поштову скриньку)?

Добре! Якщо ти налаштував поштовий сервер вручну (Postfix + Dovecot), і використовуєш системні акаунти з поштою у форматі Maildir, то створення нової поштової скриньки — це фактично створення системного користувача, а пошта буде зберігатися у ~/Maildir.


✅ Як додати поштову скриньку (системного користувача):

1. Створи користувача:

sudo adduser username

Приклад:

sudo adduser alice

Це створить:

  • користувача alice

  • домашню директорію /home/alice

  • пароль для входу (використовується також для пошти, якщо Dovecot аутентифікує через PAM)


2. Створи структуру Maildir (якщо ще нема):

sudo mkdir /home/alice/Maildir
sudo maildirmake.dovecot /home/alice/Maildir
sudo maildirmake.dovecot /home/alice/Maildir/.Drafts
sudo maildirmake.dovecot /home/alice/Maildir/.Sent
sudo maildirmake.dovecot /home/alice/Maildir/.Trash
sudo chown -R alice:alice /home/alice/Maildir

Або просто авторизуйся IMAP-клієнтом (наприклад, Thunderbird), і Dovecot сам створить Maildir.


3. Перевір:

  • Вхідна пошта має зберігатися у /home/alice/Maildir/new

  • IMAP/POP3 клієнт може підключитися до сервера з логіном alice і встановленим паролем


📥 Приклади адреси:

  • Якщо в тебе домен example.com, то пошта буде: alice@example.com

У цьому випадку Postfix автоматично обробляє адресу alice@example.com як локального користувача alice.


🛠 Якщо хочеш створити скриньку не як системного користувача, а віртуального:

Це вже складніше:

  • потрібно налаштовувати віртуальні домени/користувачі в Postfix і Dovecot

  • зберігати користувачів у MySQL, або у файлах

  • налаштовувати virtual_mailbox_domains, virtual_mailbox_maps, virtual_uid_maps, virtual_gid_maps, тощо

Але для простого сервера з кількома ящиками достатньо системних користувачів.


Хочеш, щоб я показала також приклад конфігурації з віртуальними поштовими скриньками — без створення системних юзерів?

Не треба, це, мабуть значно складніше.

Так, правильно — віртуальні скриньки дають більше гнучкості (наприклад, десятки доменів без окремих системних юзерів), але ціна — складність: потрібно заводити MySQL або файли-карти, писати virtual_alias_maps, virtual_mailbox_maps, UID/GID вручну тощо.

Для домашнього сервера або простої корпоративної пошти на кілька користувачів — системні обліковки + Maildir повністю достатньо й надійно.

Якщо буде потрібно:

  • веб-інтерфейс (наприклад, Roundcube)

  • фільтрація пошти

  • або прийом пошти з alias-адрес (наприклад, info@example.com → real_user) — усе це можна поступово додавати на існуючу базу.

Можу допомогти з наступними кроками, якщо захочеш:

  • дозвіл IMAP через клієнт (Thunderbird, K-9 Mail, etc.)

  • налаштування SPF/DKIM/DMARC у DNS

  • налаштування TLS на портах 587 і 993

  • встановлення вебінтерфейсу (Roundcube)

Пиши, куди далі рухаємося.

я правильно розумію, що якщо треба два поштових домена, то це вже через віртуальні скриньки?

Так, ти правильно розумієш: якщо ти хочеш обслуговувати два або більше поштових доменів (наприклад, @example.com і @second.org) на одному сервері, то стандартна система з локальними (системними) користувачами вже не підходить.


Чому?

Postfix (і Dovecot), коли працюють з системними користувачами, не знають нічого про домени — для них user це просто ім’я локального облікового запису. Тобто:

  • alice@example.com і alice@second.org → для системи це один і той самий alice

Відповідно:

  • не можна створити двох різних користувачів alice у двох доменах.

  • не можна мати bob@example.com і bob@second.org, якщо потрібно, щоб це були різні скриньки


Тому у випадку кількох доменів — потрібно:

❗ Використовувати віртуальні домени та віртуальні скриньки

Тоді:

  • користувачі й домени зберігаються в okремому джерелі (файл, база MySQL, LDAP)

  • пошта кожного користувача зберігається у визначеній структурі (наприклад, /var/vmail/second.org/bob/Maildir/)

  • немає потреби створювати системного юзера


Альтернатива: окремі системи або ізоляція

Теоретично, можна:

  • створити віртуальні машини або контейнери для кожного домену (наприклад, example.com на одному LXC, second.org на іншому)

  • або використовувати Docker і той самий Mailcow, де мультидомен підтримується "з коробки"


Якщо дуже хочеться уникнути віртуальних скриньок...

...і кількість користувачів мала — можна змоделювати мультидоменність вручну, наприклад:

  • створити системного користувача alice_example, alice_second

  • прописати в virtual_alias_maps перенаправлення:

alice@example.com  alice_example
alice@second.org   alice_second

Але це костиль, який не масштабується і ускладнює все далі.


Підсумок

Завдання
Рішення

Один домен

Системні користувачі

Багато доменів

Віртуальні скриньки

Потрібно гнучке управління

Віртуальні скриньки + MySQL

Автоматизація, web UI

Mailcow / iRedMail / Modoboa

Якщо хочеш — можу показати приклад базової конфігурації Postfix із віртуальними скриньками, або порадити готовий стек з мультидоменністю.

Розкажи про Віртуальні скриньки + MySQL

Добре, поясню детально й поступово.


📬 Віртуальні скриньки + MySQL у Postfix/Dovecot

Цей підхід дозволяє:

  • обслуговувати декілька доменів

  • створювати поштові адреси без системних обліковок

  • зберігати паролі та поштові адреси в базі MySQL

  • масштабувати сервер і керувати ним централізовано


📌 Основна ідея

1. Postfix:

  • приймає пошту

  • перевіряє, чи існує адреса у базі (MySQL)

  • віддає її віртуальному користувачу

2. Dovecot:

  • дозволяє клієнтам (Thunderbird, Roundcube, K-9 тощо) підключитися до скриньки

  • аутентифікує користувача за паролем з MySQL

  • надає доступ до Maildir (наприклад, /var/vmail/example.com/alice/)


📦 Компоненти, які потрібні

sudo apt install postfix dovecot-core dovecot-imapd dovecot-pop3d dovecot-mysql mariadb-server -y

📁 Структура директорій (приклад)

/var/vmail/
├── example.com/
│   └── alice/
│       └── Maildir/
├── second.org/
    └── bob/
        └── Maildir/

🧩 База MySQL

Приклад бази mailserver із трьома таблицями:

Таблиця virtual_domains:

CREATE TABLE virtual_domains (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  PRIMARY KEY (id)
);

Таблиця virtual_users:

CREATE TABLE virtual_users (
  id INT NOT NULL AUTO_INCREMENT,
  domain_id INT NOT NULL,
  password VARCHAR(255) NOT NULL,
  email VARCHAR(100) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY email (email),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);

Таблиця virtual_aliases:

CREATE TABLE virtual_aliases (
  id INT NOT NULL AUTO_INCREMENT,
  domain_id INT NOT NULL,
  source VARCHAR(100) NOT NULL,
  destination VARCHAR(100) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);

🔐 Додавання користувача (приклад)

-- Додати домен
INSERT INTO virtual_domains (name) VALUES ('example.com');

-- Отримати domain_id
SELECT id FROM virtual_domains WHERE name='example.com';

-- Додати користувача
INSERT INTO virtual_users (domain_id, password, email)
VALUES (1, ENCRYPT('пароль'), 'alice@example.com');

Паролі бажано зберігати у вигляді SHA512-CRYPT або bcrypt, не ENCRYPT.


⚙️ Конфігурація Postfix

У main.cf додати:

virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-users.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-aliases.cf

virtual_mailbox_base = /var/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

UID/GID — створюєш користувача vmail:

sudo useradd -r -u 5000 -g mail -d /var/vmail -m -s /sbin/nologin vmail

Файл /etc/postfix/mysql-virtual-domains.cf:

user = mailuser
password = mailpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

І подібні — для users та aliases.


⚙️ Конфігурація Dovecot

У dovecot.conf:

!include conf.d/*.conf
!include_try local.conf

У 10-mail.conf:

mail_location = maildir:/var/vmail/%d/%n/Maildir

У 10-auth.conf:

disable_plaintext_auth = no
auth_mechanisms = plain login
!include auth-sql.conf.ext

У auth-sql.conf.ext:

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=mail home=/var/vmail/%d/%n
}

І dovecot-sql.conf.ext:

driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailpass
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

✅ Готово! Перевір:

  1. Додай користувача до бази

  2. Створи йому каталог:

mkdir -p /var/vmail/example.com/alice/Maildir
chown -R vmail:mail /var/vmail
  1. Перезапусти:

systemctl restart postfix dovecot
  1. Підключися через IMAP (993) Thunderbird чи будь-яким клієнтом


Last updated