# Mail

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

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

***

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

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

* Встановити **Postfix** в режимі _"Internet Site"_
* Указати правильний домен
* Додати SPF, DKIM, DMARC записи у DNS
* Можливо, використовувати **SMTP-реле** (SendGrid, Mailgun, Gmail SMTP, тощо)

#### Приклад:

```bash
sudo apt update
sudo apt install postfix mailutils -y
```

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

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

```bash
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:**

```bash
sudo apt install postfix -y
```

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

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

```bash
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:**

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

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

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

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

```
mail_location = maildir:~/Maildir
```

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

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

Убери `#` з:

```
disable_plaintext_auth = yes
```

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

```bash
sudo nano /etc/dovecot/dovecot.conf
```

Додай:

```
protocols = imap pop3 lmtp
```

***

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

```bash
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. Перевірка роботи:**

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

```bash
sudo systemctl restart postfix dovecot
```

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

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

***

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

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

* **Mailcow (на Docker)** — повноцінний поштовий сервер з сучасним інтерфейсом
* **iRedMail** — встановлює одразу все (Postfix, Dovecot, SpamAssassin, вебінтерфейс і панель)

***



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

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

***

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

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

```bash
sudo adduser username
```

Приклад:

```bash
sudo adduser alice
```

Це створить:

* користувача `alice`
* домашню директорію `/home/alice`
* пароль для входу (використовується також для пошти, якщо Dovecot аутентифікує через PAM)

***

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

```bash
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**](mailto: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](mailto: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/`)

***

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

```bash
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`:

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

#### Таблиця `virtual_users`:

```sql
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`:

```sql
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
);
```

***

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

```sql
-- Додати домен
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` додати:

```ini
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`:

```bash
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`:

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

У `10-mail.conf`:

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

У `10-auth.conf`:

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

У `auth-sql.conf.ext`:

```ini
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. Створи йому каталог:

```bash
mkdir -p /var/vmail/example.com/alice/Maildir
chown -R vmail:mail /var/vmail
```

3. Перезапусти:

```bash
systemctl restart postfix dovecot
```

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

***



