un mail server fatto in casa

Avere le email su servizi pubblici è si comodo, per via del fatto che possiamo connetterci alla loro webmail sempre e comunque, ma non è sicuro in quanto le nostre email risiedono su server di “sconosciuti” presso i quali lavorano “sconosciuti” che hanno il potere di leggere le email altrui avendo i diritti di amministratori.

In questo documento spiegherò come mettere in piedi un infrastruttura per ricevere posta a casa ma la posta non arriverà direttamente al nostro server, bensì verrà spedita a Gmail ed il nostro sistema la preleverà da li, cancellandola dal server, per renderla disponibile a casa nostra.
Ho eseguito l’installazione su un sistema Ubuntu Server, perciò penso che le istruzioni per Debian siano simili.
Ovviamente il tutto necessita che si lasci la macchina accesa sempre, o quando se ne ha bisogno, però attualmente ci sono delle ottime soluzioni, prima su tutte il Raspberry PI che permettono di avere un vero e proprio computer in uno spazio ridotto, a basso costo e silenzioso.

Gli ingredienti

Un account Dyn DNS. In realtà funzionerebbe anche inserendo l’IP a mano ma spesso i provider telefonici applicano una tariffa maggiorata per chi richiede l’IP fisso perciò vediamo di evitare questa inutile spesa. Fetchmail. Fetchmail è un programma gratuito ed open source per il reperimento delle email. In poche parole si occupa di scaricare la posta da un server tramite i protocolli conosciuti (POP3, IMAP etc. . . ) e salvarla da qualche parte, tipo il nostro account su Linux oppure passarla ad un altro programma. Procmail. Procmail è un altro programma gratuito ed open source che si occupa di processare la posta, volendo la può smistare in cartelle, mandarla ad un altro indirizzo email (forwarding) passarla ad un altro programma ancora e così via. Spamassassin. Lo avrete capito dal nome, spamassassin è un altro programma gratuito ed open source che si occupa di controllare il contenuto e la provenienza delle email e, tramite varie regole, magie ed incantesimi vari, riesce a marcare come spam la posta che lui ritiene tale aggiungendo headers appositi alle email. Dovecot. Dovecot è un programma server di email (indovinate un po’? Gratuito ed open source) che si occuperà di servirci le email. Lui si espone tramite i protocolli conosciuti, IMAP nel nostro caso e noi potremo connetterci a lui con un client di posta e controllare la posta.

Vai con l’impasto!

Salto la parte dell’account su Dyn DNS, mettiamo che abbiate registrato un DNS chiamato mymailserver.dyndns.org.
Procediamo ad installare i componenti. Per prima cosa installiamo fetchmail. Si può installare usando i sistemi di pacchettizzazione delle distribuzioni Linux, ad esempio:
Debian (e derivati):

1
sudo apt-get install fetchmail

Fedora (e derivati):

1
sudo yum install fetchmail

Per tutti gli altri sistemi è possibile scaricare i sorgenti da Fetchmail e compilarlo seguendo le istruzioni, il classico

1
./configure && make && make install

Lasceremo per ora inconfigurato fetchmail e passeremo all’installazione di Procmail. La procedura è la stessa che per fetchmail:
Debian (e derivati):

1
sudo apt-get install procmail

Fedora (e derivati):

1
sudo yum install procmail

Per le altre distro potrete installare direttamente dai sorgenti scaricabili al sito Procmail.
Saltiamo anche la configurazione di procmail e andiamo a installare Spam
Assassin. La procedura è identica, anche questo è disponibile nei repository ufficiali:
Debian (e derivati):

1
sudo apt-get install spamassassin

Fedora (e derivati):

1
sudo yum install spamassassin

La configurazione di Spam Assassin la salterò del tutto perché è talmente variegata che vi rimando alla documentazione ufficiale e al download dei sorgenti nel caso abbiate bisogno o vogliate compilarlo da essi all’indirizzo https://spamassassin.apache.org. Sappiate comunque che la configurazione di base fa già un ottimo lavoro.
Per ultimo installiamo Dovecot. Anche questo disponibile sui repository ufficiali. Nel nostro caso installeremo la versione apposita per fornire il protocollo IMAP.
Debian (e derivati):

1
sudo apt-get install dovecot-imapd

Non utilizzando Fedora non sono riuscito a capire se esiste sui repository, per voi e per gli utilizzatori di distro in cui non sia presente nei repository, vi rimando ai sorgenti sul sito ufficiale Dovecot.

Abilitare su Google il prelievo in POP3

Gmail di default non supporta il download della posta tramite protocollo POP3, esso va abilitato. Andiamo nelle impostazioni di Gmail (di solito è il tastino con l’ingranaggio in alto a destra), selezioniamo “Settings”, clicchiamo sul tab “Forwarding and POP/IMAP”. Nella sezione “POP Download” selezioniamo “Enable POP for all mail”. Nel caso vogliate che le email vengano cancellate da Gmail una volta scaricate, nella sezione “When messages are accessed with POP” selezionate “delete Gmail’s copy”. Salvate e siamo a posto.

I certificati di Google

Ovviamente fetchmail storcerà il naso quando vedrà che stiamo prelevando la posta da un server di cui non possediamo il certificato, così ora andremo a scaricare i certificati di Google in una nostra cartella da passare poi a fetchmail. La seguente procedura la potete trovare descritta al seguente indirizzo:
http: //www.andrews-corner.org/mutt.html#ssl.

Andiamo ad eseguire i seguenti comandi:

1
mkdir -pv $HOME/.certs

In questo modo creiamo la cartella .certs nella nostra home la quale conterrà i certificati.

1
2
3
cd $HOME/.certs
touch Thawte_Premium_Server_CA.pem
touch Equifax_Secure_CA.pem

Ci siamo spostati nella cartella .certs e abbiamo creato i due file .pem vuoti.

1
2
wget --no-check-certificate https://github.com/bagder/curl/raw/master/lib/mk-ca-bundle.
perl mk-ca-bundle.pl

Abbiamo scaricato un bundle perl per la creazione dei certificati. Ora che abbiamo lanciato il file perl mk-ca-bundle.pl, esso avrà generato il file ca- bundle.crt nella cartella, questo è il pack dei certificati. Andiamo ad aprirlo con un qualsiasi editor di testo. In questo file troverete due blocchi di codice alieno contenuti tra le stringhe —–BEGIN CERTIFICATE—– e —–END CERTIFICATE—–. Il primo blocco lo troverete sotto il titolo Thawte Premium Server CA, copiatelo (comprensivo di —–BEGIN CERTIFICATE—– e —–END CERTIFICATE—–) dentro il file ThawtePremiumServerCA.pem. Prendete il secondo blocco di codice sotto il titolo Equifax Secure CA e copiatelo dentro il file EquifaxSecureCA.pem.
Ora lanciamo il comando

1
c_rehash $HOME/.certs/

e avremo i certificati belli e pronti per l’uso dentro la cartella .certs nella nostra home.

Vai con la cottura!

Dopo aver installato questa saccocciata di roba è arrivato il momento di configurare il tutto. Partiamo dal fondo, ovvero da Dovecot. A Dovecot basterà indicare la directory in cui salveremo la posta (per comodità sceglieremo il formato Maildir). Personalmente ho messo la cartella su un HD secondario, se avete uno di quei NAS che si collegano via USB3 o eSATA sarebbe ancora meglio. Perciò ammettiamo che vogliamo salvare la posta nella cartella del nostro hard disk ausiliario /mnt/MailHD/dovecot.
Apriamo il file 10-mail.conf che troviamo nel percorso /etc/dovecot/conf.d e cerchiamo la variabile maillocation, come valore inseriamo il nostro percorso appena scelto, la riga nel file avrà questo aspetto:

1
mail_location = maildir:/mnt/MailHD/dovecot/Maildir

Sostanzialmente gli stiamo dicendo che la posta sarà memorizzata in formato maildir nella cartella Maildir dentro la cartella che abbiamo scelto. Maildir sarà la cartella che conterrà l’architettura della cartella della posta in arrivo. Dovecot è già pronto, se lo avete installato dai repository del vostro sistema operativo sarà già configurato per partire all’avvio, in questo modo già vi fornisce la posta con protocollo IMAP.
Ora andiamo a configurare procmail, ovvero il software che si occuperà di infilare la posta di Gmail dentro a Dovecot. Creiamo un file chiamato .procmailrc dentro la home del nostro utente, il file avrà il seguente contenuto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PATH=/usr/bin:/usr/local/bin
MAILDIR=/mnt/MailHD/dovecot/Maildir
DEFAULT=/mnt/MailHD/dovecot/Maildir
LOGFILE=/home/user/procmail.log
DELIVER="/usr/lib/dovecot/deliver"
SHELL=/bin/sh
:0fw: spamassassin.lock
* < 256000
| spamassassin
# All mail tagged as spam (eg. with a score higher than the set
# threshold)
# is moved to "probably-spam".
:0:
* ^X-Spam-Status: Yes
$MAILDIR/.INBOX.Spam/
:0 w
| $DELIVER

Vi spiego in breve cosa abbiamo scritto:
PATH = E’ il percorso dove si trova l’eseguibile
MAILDIR = La directory madre in formato Maildir relativa alla posta
DEFAULT = E’ la directory dove sarà memorizzata la posta, di solito si mette lo stesso percorso di MAILDIR
LOGFILE = Quale sarà il file di log, vi consiglio vivamente di inserire questa variabile così nel caso ci siano problemi potete facilmente investigarne la natura.
DELIVER = E’ un eseguibile opzionale, nel nostro caso vitale, che si occuperà di fare lo store delle email. Nel nostro caso è obbligatorio in quanto se mettessimo le email direttamente nella cartella di Dovecot, esso non aggiornerebbe il suo indice e non riusciremmo a farci restituire le email arrivate. In questo caso, deliver aggiorna l’indice e copia la mail nella directory Maildir.
SHELL = La shell dei comandi da utilizzare
Dopo il blocco delle variabili abbiamo le seguenti direttive.

1
2
3
:0fw: spamassassin.lock
* < 256000
| spamassassin

Queste tre righe passano qualsiasi mail arrivata a spamassassin che aggiungerà degli header alle email nel caso ritenga che siano spam.

1
2
3
:0:
* ^X-Spam-Status: Yes
$MAILDIR/.INBOX.Spam/

Questa parte fa si che tutte le email che Spamassassin ha marcato con l’header X-Spam-Status vengano spostate nella directory Spam.

1
2
:0 w
| $DELIVER

Quest’ultima parte passa tutte le email, processate e non, all’eseguibile deliver che si occuperà di inserirle in Dovecot.
Passiamo ora a configurare fetchmail, che si occuperà di prelevare la posta da Gmail. Creiamo un file dentro la home dell’utente chiamato .fetchmailrc.
Il file avrà il seguente contenuto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
set no bouncemail
set logfile /home/user/fetchmail.log
set daemon 90
poll pop.gmail.com
proto pop3
port 995
auth password
user ’username@gmail.com’ there
with password ’myPasswordOrMyGoogleApplicationsPassword’
options
nokeep
ssl
sslcertck
sslcertpath /home/user/.certs
mda "/usr/bin/procmail -f %F -d %T";

Le prime tre righe indicano semplicemente che le email errate non devono tornare al destinatario, il percorso al file di log e che fetchmail girerà in modalità demone ogni 90 secondi.
Le righe seguenti indicano che prenderemo la posta dal server pop.gmail.com usando il protocollo POP3 sulla porta 995 autenticandoci con la password. Lo username sarà il nostro indirizzo Gmail, la password sarà la nostra password Gmail ma se avete abilitato il 2-step-authentication dovrete inserire la password delle applicazioni che Google vi ha dato al momento che avete abilitato questo sistema, potete vederla nel vostro profilo Google.
Options indica che andremo ad indicare le opzioni sotto.
Nokeep indicherà che la posta non dovrà essere conservata sul server di Google.
Ssl, sslcertck e sslcertpath sarà il percorso in cui sono i certificati di Google.
L’ultima riga invoca il Mail Delivery Agent, nel nostro caso procmail che andrà a processare ogni email prelevata.

Il varo

Ok ora è tutto pronto, se avete installato tutto da repository dovrebbe essere tutto già in piedi e pronto a partire al boot del sistema. Se fetchmail non dovesse partire all’avvio, potete lanciarlo con il comando:

1
fetchmail -d 600

l’opzione -d indica che partirà in modalità demone (non sarà huppato alla console e cose del genere) e girerà ogni 600 secondi.
Ora dovrebbe cominciare a tirare giù la posta, ci mettera molto, ve lo dico subito. Controllate di frequente i log di Fetchmail e Procmail per vedere se ci sono errori particolari o se procede tutto spedito.

Apertura all’esterno e configurazione del client

Ora quello che vi rimane da fare è rendere disponibile il sistema dall’esterno. All’inizio del documento vi ho indicato dyndns. In soldoni, DynDns rende disponibile il vostro IP esterno di casa tramite un indirizzo umano, nel nostro caso ad esempio sarà mymailserver.dyndns.org (l’indirizzo lo scegliete al momento dell’apertura dell’account e della crazione di un nuovo servizio DNS). Alcuni router supportano l’account DynDns, basta inserire le credenziali e il router aggiornerà automaticamente DynDns con l’IP del momento. Per chi non ha un router che supporta questa configurazione non c’è problema, sono disponibili i tool di DynDns da installare sulla macchina che penseranno ad aggiornare automaticamente l’IP, potete scaricarli a questo indirizzo: http://dyn.com/support/clients/.
Ora dovete configurare il router per esporre il servizio IMAP dall’esterno. Per fare questo vi rimando alle istruzioni del vostro router, solo vi do un consiglio. La porta IMAP è la 143 ma non esponete direttamente la 143, configurate il PAT/NAT in modo che la porta esterna sia ad esempio la 5421 o una porta strana e poi rimappate internamente verso la 143.
Ora aprite il client di posta che volete usare e configurate il vostro account Gmail. Andate poi nelle impostazioni del server della posta in arrivo e cambiate i seguenti valori:
Server: mymailserver.dyndns.org (o qualsiasi indirizzo DynDns avete scelto)
Porta: 5421 (o la porta che avete aperto dall’esterno sul router)
Sicurezza: STARTTLS
Autenticazione: password
Come username e password inserite le credenziali del vostro utente Linux.
Come server di posta in uscita SMTP utilizzate quello di Google, lasciate quindi configurato così com’è.

Author

Daniele Argento

Posted on

2016-10-22

Updated on

2023-09-20

Licensed under

Comments