# Installer un seveur mail avec [mailcow](https://mailcow.email)

Nous utilisons une version "dockerisé" de [mailcow](https://github.com/mailcow/mailcow-dockerized).

## CONFIGURATION

### DNS

- Créer les enregistrements DNS suivant:
!!! info
    ``` { .js .copy }
    // Enregistrement A pour L'UI mAilcow
    mail 1800 IN A 78.192.247.57
    // Enregistrement MX pointant vers le hostname de mailcow
    @ 10800 IN MX 10 mail.legaragenumerique.fr.
    // Enregistrement TXT à prendre dans l'UI de Mailcow du domaine
    mail 1800 IN TXT "<=DKIM1;k=rsa;t=s;s=email;p=..."
    // Enregistrement TXT pointant vers l'IP du serveur Mailcow
    @ 1800 IN TXT "v=spf1 ip4:78.192.247.57 ~all"
    _dmarc 10800 IN TXT "v=DMARC1; p=quarantine; sp=reject; rua=mailto:reports@exemple.com; ruf=mailto:forensics@exemple.com; fo=1"
    // Enregistrement CNAME pointant vers le domaine (pour la configuration automatique des clients)
    autoconfig 10800 IN CNAME mail.legaragenumerique.fr.
    autodiscover 1800 IN CNAME mail.legaragenumerique.fr.
    // Idéalement un enregistrement SRV pour la résolution inversée (IP > nom de domaine)
    ```

!!! note "Enregistrement DKIM"
    ```
    Prendre l'enregistrement TXT mail de l'interface mailcow (DKIM key)
    ```

> Pour tout domaine autre que legaragenumerique.fr hébergé par `mailcow`, l'enregistrement MX doit pointer vers le `hostname` du serveur `mailcow` (dans cet exemple : mail.legaragenumerique.fr)

### Firewall

- Ouvrir les ports suivant (TCP et UDP):

| Service | Encryption | Host              | Port |
|---------|------------|-------------------|------|
| IMAP    | STARTTLS   | mailcow hostname  | 143  |
| IMAPS   | SSL        | mailcow hostname  | 993  |
| POP3    | STARTTLS   | mailcow hostname  | 110  |
| POP3S   | SSL        | mailcow hostname  | 995  |
| SMTP    | STARTTLS   | mailcow hostname  | 587  |
| SMTPS   | SSL        | mailcow hostname  | 465  |

### Stack

- Cloner le projet:

``` { .bash .copy }
git clone https://github.com/mailcow/mailcow-dockerized.git
cd mailcow-dockerized
./generate_config.sh
docker compose up -d
```

### Nginx RP config (Si mailcow dérrière proxy)

??? note "nginx configuration reverse proxy"
    ``` { .conf .copy }
    upstream mail {
        # Redirect to HTTP port of Mailcow instance, not HTTPS !
        server 192.168.0.102:880;
    }

    server {
        listen 80;
        listen [::]:80;

        server_name mail.legaragenumerique.fr autodiscover.* autoconfig.*;

        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name mail.legaragenumerique.fr autodiscover.* autoconfig.*;

        ssl_certificate /etc/letsencrypt/live/mail.legaragenumerique.fr/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/mail.legaragenumerique.fr/privkey.pem;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256';
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;

        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        client_max_body_size 10G;

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://mail;
            proxy_read_timeout 120s;
        }

        access_log /var/log/nginx/mail_access.log;
        error_log /var/log/nginx/mail_error.log;
    }
    ```

### Configurations clients

#### Configuration Thunderbird

![WS](../../assets/divers/server/tb_config.png)

#### Configuration CARDAV & CALDAV

Utiliser les adresses suivantes pour synchroniser les calendriers et contacts en remplaçant `mail.example.com` par votre hostname mailcow et `user@example.com` par la boite mail concernée.

```
CalDAV: https://mail.example.com/SOGo/dav/user@example.com/Calendar/personal/

CardDAV: https://mail.example.com/SOGo/dav/user@example.com/Contacts/personal/
```

### Transfert boite mail via Thunderbird

Processus pour récupérer les mails d'une adresse avant de d'héberger celle-ci sur `mailcow`, puis réimporter les mails.

#### Export

On exporte les mails au format `.elm` via [Thunderbird](https://www.thunderbird.net/fr/) dans un dossier.

![WS](../../assets/divers/server/export_mail.png)

- Déconnecter la boîte mail de `Thunderbird`

#### Changement des enregistrements DNS

- **Changer les enregistrements DNS** pour les faire pointer vers le serveur `mailcow` où la boîte mail est désormais hébergée

- Attendre la propagation du changement de DNS  
!!! tip 
    Certains serveurs mail peuvent mettre jusque 24h avant d'obtenir le changement pour un enregistrement (temps de propagation)

#### Import

- Connecter la boîte mail dans `Thunderbird`

![WS](../../assets/divers/server/import_mail.png)

- Attendre la fin de l'omport et la synchronisation avec les serveur mail

> Les mails sont désormais disponibles sur le nouveau serveur

## DOCUMENTATION

[Documentation mailcow](https://docs.mailcow.email)
