# SnappyMail

**Cicle formatiu**: CFGM Sistemes Microinformàtics i Xarxes (SMX) / CFGS Administració de sistemes informàtics en xarxa (ASIX)

**Mòdul:** 0227 - Serveis de xarxa / 0375 - Serveis de xarxa i Internet

**Sistema operatiu:** Ubuntu Server 26.04 LTS

# 1. Què és SnappyMail

**SnappyMail** és un client de correu web (*webmail*) senzill, modern i lleuger, escrit en PHP i JavaScript. Es tracta d'una **bifurcació (fork) de RainLoop Webmail Community Edition**, creada per continuar el desenvolupament d'aquell projecte quan va quedar pràcticament abandonat. És una opció excel·lent quan es necessita una interfície webmail **lleugera, ràpida i sense dependències de base de dades** per connectar-se a un servidor IMAP/SMTP ja existent, amb [Dovecot i Postfix](https://proferamon.com/tic/correu.html). La seva instal·lació a Ubuntu 26.04 es redueix a desplegar uns quants fitxers PHP darrere d'Apache o Nginx amb PHP-FPM, sense necessitat de dimonis addicionals.

![SnappyMail logo](https://proferamon.com/tic/imatges/snappymail/snappymail01.png)

Característiques generals del projecte:

> - No necessita cap base de dades pròpia: es connecta directament a un servidor **IMAP** (per rebre correu) i **SMTP** (per enviar-lo).
> - Pensat per ser **ràpid i mòbil**: la primera arrencada des de mòbil pesa uns 138 KB (amb compressió Brotli) i obté puntuacions molt altes a Lighthouse.
> - Compatible amb navegadors moderns (Chrome 69+, Firefox 78+, Safari 12+, Edge 79+); **no** suporta Internet Explorer ni Edge Legacy.
> - Ideal per instal·lar al costat d'un servidor de correu ja existent (Postfix + Dovecot, per exemple), o com a alternativa lleugera a Roundcube.

> [!NOTE]
> SnappyMail **no és** un servidor de correu. És únicament una interfície web que es connecta a un servidor IMAP/SMTP que ja ha d'existir prèviament.

# 2. Llicència

SnappyMail es distribueix sota la llicència **GNU Affero General Public License versió 3 (AGPL-3.0)**.

Punts clau d'aquesta llicència:

> - És programari lliure i de codi obert.
> - A diferència de la GPL normal, l'AGPL obliga a compartir el codi font també quan el programa s'ofereix com a servei a través de xarxa (SaaS), no només quan es distribueix el binari.
> - Manté els avisos de copyright originals de RainLoop (2013-2022) i afegeix els propis de SnappyMail (2020-2024).

# 3. Funcionalitats principals

- **Gestió de diversos comptes/dominis IMAP-SMTP** des d'una única instal·lació.
- **Xifratge de correu**: suport per OpenPGP (via OpenPGP.js v5, [GnuPG](https://proferamon.com/tic/gpg.html) i Mailvelope) i possibilitat d'usar S/MIME.
- **Filtres Sieve**: creació de regles de filtratge al servidor (per exemple, respostes automàtiques de vacances), si el servidor IMAP ho permet.
- **Contactes**: llibreta d'adreces amb suport SQLite, MySQL, PostgreSQL o [LDAP](https://proferamon.com/tic/ldap.html).
- **Temes i personalització**: temes d'interfície, marca blanca (canviar logotip, títol, descripció).
- **Tauler d'administració** (`/?admin`) per configurar dominis, seguretat, mides màximes d'adjunts, temes disponibles, etc.
- **Sense processos en segon pla**: no emmagatzema credencials per automatitzar tasques ni revisa el correu quan l'usuari no ha iniciat sessió (per disseny, per privacitat).
- **Respecte per la privacitat**: elimina integracions de xarxes socials, Gravatar, Google, Facebook, Twitter, Dropbox, etc. presents originalment a RainLoop.

# 4. Requisits previs

Abans d'instal·lar, cal tenir:

> - Un servidor Ubuntu 26.04 amb accés `root` o `sudo`.
> - Un servidor de correu (IMAP/SMTP) ja funcionant, accessible des d'aquesta màquina (per exemple, Dovecot + Postfix).
> - **PHP 7.4 o superior** (Ubuntu 26.04 inclou per defecte una versió més recent, com PHP 8.5, que va perfectament).

Extensions PHP necessàries:

| Extensió  | Obligatòria | Ús |
|-----------|:-----------:|----|
| mbstring  | Sí | Gestió de cadenes multibyte |
| zlib      | Sí | Compressió |
| json      | Sí | Format de dades |
| libxml    | Sí | Processament XML |
| dom       | Sí | Processament DOM |
| curl      | No | Peticions HTTP externes |
| gd / imagemagick | No | Redimensionar imatges adjuntes |
| gnupg     | No | Correu xifrat/signat |
| intl      | No | Dominis IDN |
| ldap      | No | Contactes via LDAP |
| openssl   | Recomanada | Xifratge de dades confidencials |
| sodium    | Recomanada | Millor xifratge encara que OpenSSL |
| pdo (sqlite/mysql/pgsql) | No | Contactes en BD |

# 5. Instal·lació a Ubuntu 26.04

Hi ha dues vies habituals: baixar el paquet `.tar.gz` directament (mètode universal, vàlid per a qualsevol distribució) o utilitzar el dipòsit APT (només Debian/Devuan de moment). A Ubuntu 26.04 farem servir el mètode del `.tar.gz`, que és el recomanat oficialment.

## 5.1. Actualitza el sistema

Actualitza la llista de paquets

```bash
sudo apt update
```

Actualitza el sistema

```bash
sudo apt upgrade
```

## 5.2. Instal·la Apache, PHP-FPM i extensions

```bash
sudo apt install apache2 php-fpm php-mbstring php-xml php-curl php-gd \
  php-intl php-ldap php-sqlite3 php-common php-cli unzip wget
```

Activa els mòduls necessaris d'Apache:

```bash
sudo a2enmod proxy_fcgi setenvif rewrite headers expires deflate
```

Activa el fitxer de configuració de `php8.5-fpm`:

```bash
sudo a2enconf php8.5-fpm
```

Registra els serveis perquè s'engeguin automàticament en cada arrencada i els arrenca immediatament:

```bash
sudo systemctl enable --now php8.5-fpm apache2
```

## 5.3. Descarrega i desplega SnappyMail

Crea la carpeta `webmail`:

```bash
sudo mkdir -p /var/www/webmail
```

Descarrega SnappyMail:

```bash
sudo wget -c https://snappymail.eu/repository/latest.tar.gz
```

Descomprimeix a la carpeta creada:

```bash
sudo tar -xzf latest.tar.gz -C /var/www/webmail
```

Esborra el fitxer descarregat:

```bash
sudo rm latest.tar.gz
```

## 5.4. Estableix permisos correctes

Canvia els permisos de les carpetes:

```bash
sudo find /var/www/webmail -type d -exec chmod 755 {} \;
```

Canvia els permisos dels fitxers (descarta directoris, enllaços simbòlics, etc.):

```bash
sudo find /var/www/webmail -type f -exec chmod 644 {} \;
```

Canvia el propietari de la carpeta i les subcarpetes:

```bash
sudo chown -R www-data:www-data /var/www/webmail
```

## 5.5. Treu la carpeta `data` fora del document root (recomanat)

Per seguretat, és bona pràctica moure la carpeta `data/` (on es guarden configuracions i contrasenyes) fora de l'arrel pública del servidor web.

Crea la carpeta `snappymail`:

```bash
sudo mkdir -p /var/lib/snappymail
```

Mou el contingut de `data` a la carpeta creada:

```bash
sudo mv /var/www/webmail/data/* /var/lib/snappymail/
```

Canvia el propietari de la carpeta:

```bash
sudo chown -R www-data:www-data /var/lib/snappymail
```

Canvia el nom del fitxer perquè el detecti i el carregui en l'arrencada:

```bash
sudo mv /var/www/webmail/_include.php /var/www/webmail/include.php
```

Edita `/var/www/webmail/include.php`

```bash
sudo nano /var/www/webmail/include.php
```

Descomenta/afegeix la línia amb el nou camí:

```nano
define('APP_DATA_FOLDER_PATH', '/var/lib/snappymail/');
```

# 6. Configura el servidor web

Com que `webmail.thos.local` és un nom intern (no un domini públic), no pots obtenir-hi un certificat de Let's Encrypt. La solució habitual en aquest cas és generar un **certificat autosignat**, que xifra igualment la connexió encara que el navegador mostri un avís de confiança fins que l'acceptis manualment (o ho importis com a certificat de confiança al client).

## 6.1. Genera el certificat autosignat

```bash
sudo openssl req -x509 -nodes -days 825 -newkey rsa:4096 \
  -keyout /etc/ssl/private/webmail.thos.local.key \
  -out /etc/ssl/certs/webmail.thos.local.crt \
  -subj "/C=ES/ST=Catalunya/L=Mataro/O=IES Thos i Codina/OU=SMX/CN=webmail.thos.local"
```

Què fa cada part:

> - **`-x509`**: en lloc de generar només una sol·licitud de certificat (CSR), genera directament un certificat autosignat complet.
> - **`-nodes`** (*no DES*): no xifra la clau privada amb contrasenya, perquè Apache/Nginx la puguin llegir a l'arrencada sense demanar-la manualment.
> - **`-days 825`**: validesa del certificat (uns 27 mesos; és el màxim que molts navegadors accepten actualment per a certificats d'aquest tipus).
> - **`-newkey rsa:4096`**: genera alhora una nova clau privada RSA de 4096 bits.
> - **`-keyout`** / **`-out`**: rutes on es desen la clau privada i el certificat públic respectivament.
> - **`-subj "..."`**: omple les dades del certificat sense passar pel mode interactiu; `CN` (*Common Name*) ha de coincidir amb el nom que faràs servir per accedir-hi (`webmail.thos.local`).

Ajusta permisos de la clau privada perquè només `root` hi pugui llegir:

```bash
sudo chmod 640 /etc/ssl/private/webmail.thos.local.key
```

Canvia el propietari i el grup:

```bash
sudo chown root:ssl-cert /etc/ssl/private/webmail.thos.local.key
```

> [!NOTE]
> Un certificat autosignat xifra el trànsit igual de bé que un de "de confiança", però no aporta cap validació d'identitat per un tercer: el navegador avisarà de "connexió no segura" fins que acceptis l'excepció o instal·lis el certificat com de confiança als clients.

## 6.2. Apache (VirtualHost amb PHP-FPM i HTTPS)

Activa el mòdul SSL d'Apache:

```bash
sudo a2enmod ssl
```

Crea la configuració HTTP (`/etc/apache2/sites-available/webmail.conf`) i redirigeix tot el trànsit HTTP cap a HTTPS:

```bash
sudo nano /etc/apache2/sites-available/webmail.conf
```

```nano
<VirtualHost *:80>
    ServerName webmail.thos.local
    # Redirigeix tot el trànsit HTTP cap a HTTPS
    Redirect permanent / https://webmail.thos.local/
</VirtualHost>
```

Crea la configuració HTTPS (`/etc/apache2/sites-available/webmail-ssl.conf`):

```bash
sudo nano /etc/apache2/sites-available/webmail-ssl.conf
```

```nano
<VirtualHost *:443>
    ServerName webmail.thos.local
    DocumentRoot /var/www/webmail

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/webmail.thos.local.crt
    SSLCertificateKeyFile /etc/ssl/private/webmail.thos.local.key
    SSLProtocol -all +TLSv1.2 +TLSv1.3

    <Directory /var/www/webmail>
        Options -Indexes
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.5-fpm.sock|fcgi://localhost"
    </FilesMatch>

    # No exposis mai la carpeta data si es queda dins del document root
    <LocationMatch "^/data/">
        Require all denied
    </LocationMatch>

    ErrorLog ${APACHE_LOG_DIR}/webmail_error.log
    CustomLog ${APACHE_LOG_DIR}/webmail_access.log combined
</VirtualHost>
```

Activa els fitxers de VirtualHost del lloc:

```bash
sudo a2ensite webmail.conf webmail-ssl.conf
```

Desactiva el VirtualHost predeterminat:

```bash
sudo a2dissite 000-default.conf
```

Comprova la sintaxi dels fitxers de configuració d'Apache:

```bash
sudo apachectl configtest
```

Recarrega Apache:

```bash
sudo systemctl reload apache2
```

> [!TIP]
> Si més endavant `thos.local` deixa de ser intern i el servidor esdevé accessible des d'un domini públic, val la pena substituir el certificat autosignat per un de Let's Encrypt (via `certbot`), que evita l'avís de confiança als navegadors dels usuaris.

## 6.3. Alternativa: Nginx

Si prefereixes Nginx en lloc d'Apache:

```nano
# Redirigeix tot el trànsit HTTP cap a HTTPS
server {
    listen 80;
    server_name webmail.thos.local;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name webmail.thos.local;
    root /var/www/webmail;
    index index.php;

    ssl_certificate     /etc/ssl/certs/webmail.thos.local.crt;
    ssl_certificate_key /etc/ssl/private/webmail.thos.local.key;
    ssl_protocols       TLSv1.2 TLSv1.3;

    client_max_body_size 50M;

    location ~ (^|/)\. { return 403; }
    location ~ ^/data/ { deny all; }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~* \.php$ {
        fastcgi_pass unix:/run/php/php8.5-fpm.sock;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    }
}
```

# 7. Primer accés i configuració del domini de correu

1. Obre al navegador `https://webmail.thos.local/?admin` (accepta l'avís de certificat autosignat si és la primera vegada). Això generarà el fitxer `admin_password.txt` dins la carpeta de dades.
2. Consulta la contrasenya inicial:

   ```bash
   sudo cat /var/lib/snappymail/_data_/_default_/admin_password.txt
   ```

3. Inicia sessió amb l'usuari `admin` i aquesta contrasenya.
4. Canvia l'idioma de la interfície.

   ![Idioma](https://proferamon.com/tic/imatges/snappymail/snappymail02.png)

4. Ves immediatament a **Seguridad** i canvia el nom d'usuari i la contrasenya. Un cop canviada, el fitxer `admin_password.txt` s'esborra automàticament.

   ![Canvi de contrasenya](https://proferamon.com/tic/imatges/snappymail/snappymail03.png)

5. Al menú **Dominios**, afegeix el domini de correu (per exemple `thos.local`) indicant:

   - Servidor IMAP (host, port, xifratge STARTTLS/SSL).
   - Servidor SMTP (host, port, xifratge, autenticació).
   ![Afegeix servidor IMAP](https://proferamon.com/tic/imatges/snappymail/snappymail04.png)

   ---

   ![Afegeix servidor SMTP](https://proferamon.com/tic/imatges/snappymail/snappymail05.png)

6. Opcionalment, a **Contacts**, activa el suport de llibreta d'adreces (SQLite és l'opció més senzilla per a una pràctica d'aula).

   ![Contactes](https://proferamon.com/tic/imatges/snappymail/snappymail06.png)

7. Prova l'accés d'un usuari final a `https://webmail.thos.local/` amb les credencials del seu compte de correu.

   ![Accés amb un usuari](https://proferamon.com/tic/imatges/snappymail/snappymail07.png)

---

   ![Missatge](https://proferamon.com/tic/imatges/snappymail/snappymail08.png)

# 8. Seguretat i bones pràctiques

- **Utilitza sempre HTTPS**, mai HTTP en producció; el formulari d'inici de sessió envia credencials en clar si no hi ha TLS.
- **Aïlla el webmail del servidor de correu**: si és possible, executa SnappyMail en una màquina diferent de la que fa d'IMAP/SMTP, per reduir la superfície d'atac.
- **Protegeix el tauler `/?admin`** restringint-lo per IP o amb autenticació addicional al servidor web.
- **Mantén-lo actualitzat**: és un projecte que evoluciona ràpidament i publica pedaços de seguretat sovint.
- **[Fail2ban](https://proferamon.com/tic/0378RA2.html)**: considera afegir una regla per bloquejar intents repetits de login fallits.
- Verifica que la carpeta de dades **no sigui accessible per HTTP** (SnappyMail avisa automàticament d'això dins el tauler d'administració si detecta el problema).

# 9. Actualització

Actualitzar és tan senzill com sobreescriure els fitxers amb la nova versió.

Descarrega la nova versió:

```bash
sudo wget -c https://snappymail.eu/repository/latest.tar.gz
```

Descomprimeix:

```bash
sudo tar -xzf latest.tar.gz -C /var/www/webmail
```

Esborra el fitxer descarregat:

```bash
sudo rm latest.tar.gz
```

Canvia el propietari de la carpeta `/var/www/webmail`:

```bash
sudo chown -R www-data:www-data /var/www/webmail
```

Cada versió es desa en un subdirectori propi dins de `snappymail/v/`; només se sobreescriuen `/index.php` i `/data/VERSION`. La resta de la reconfiguració la fa el mateix producte en la primera execució posterior.

# 10. Enllaços d'interès

**Documentació oficial**

> - Lloc web oficial (snappymail.eu): <https://snappymail.eu/>
> - Dipòsit a GitHub: <https://github.com/the-djmaze/snappymail>
> - Wiki oficial (índex): <https://github.com/the-djmaze/snappymail/wiki>
> - Instruccions d'instal·lació: <https://github.com/the-djmaze/snappymail/wiki/Installation-instructions>
> - Manual d'administració: <https://github.com/the-djmaze/snappymail/wiki/Admin-Manual>
> - Configuració d'OpenPGP: <https://github.com/the-djmaze/snappymail/wiki/OpenPGP>
> - Filtres Sieve: <https://github.com/the-djmaze/snappymail/wiki/Filters---Sieve>
> - Capacitats IMAP suportades: <https://github.com/the-djmaze/snappymail/wiki/IMAP-capabilities>
> - Millora del rendiment: <https://github.com/the-djmaze/snappymail/wiki/Improve-performance>
> - Preguntes freqüents (FAQ): <https://github.com/the-djmaze/snappymail/wiki/FAQ>
> - Documentació per a desenvolupadors: <https://github.com/the-djmaze/snappymail/wiki/Developer-Documentation>
> - Instal·lació amb Docker: <https://github.com/the-djmaze/snappymail/wiki/Docker>
> - Pàgina de descàrregues (releases): <https://github.com/the-djmaze/snappymail/releases>

**Llicència**

> - Text complet de la GNU AGPL-3.0: <http://www.gnu.org/licenses/agpl-3.0.html>

**Projecte original (RainLoop)**

> - RainLoop Webmail a GitHub: <https://github.com/RainLoop/rainloop-webmail>

#### Versions d'aquest document

> + [HTML](https://proferamon.com/tic/snappymail.html)
> + [PDF](https://proferamon.com/tic/pdf/snappymail.pdf)
> + [ODT](https://proferamon.com/tic/odt/snappymail.odt)
> + [MD](https://proferamon.com/tic/md/snappymail.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)