Servizio di Posta con OpenBSD (Parte1|MTA)

di | Novembre 23, 2025

In questo appunto, descrivo la procedura utilizzata per avviare un servizio di posta elettronica su un piccolo server con OpenBSD 7.6. L’argomento non è proprio semplicissimo.

Supponiamo che Alice e Bob vogliano comunicare in sicurezza tramite la Posta elettronica.

Le componenti da considerare son 3 :

  • MTA (Mail Trasport Agent) permette al messaggio inviato da Alice (mittente), di giungere alla mailbox privata di Bob (destinatario).
  • MDA (Mail Delivery Agent) permette al destinatario (Bob) di prelevare dalla propria mailbox, il messaggio ricevuto da Alice (o da chiunque altro mittente).
  • MUA (Mail User Agent) è il client di posta, che tramite l’MDA, preleva dal server i messaggi parcheggiati nella mailbox. Il MUA si interfaccia, lato server, sia con l’MDA quando deve leggere/prelevare i messaggi da una propria mailbox, e sia con l’MTA quando dovrà inviare messaggi ad altro destinatario.

Quindi l’MTA e l’MDA sono componenti che girano su quello che generalmente chiamiamo “Server di Posta“, mentre il MUA (spesso, ma non sempre) è installato sulle nostre postazioni (PC, dispositivi mobili).

Ho semplificato molto l’architettura, volutamente, per non rendere troppo complicato l’argomento. Per dirne una : quasi sempre il servizio di posta relativo ad un dominio, anche domestico, dovrebbe essere erogato almeno 2 macchine bilanciate per favorire la normale manutenzione senza dare disservizio.

Passiamo alla realizzazione. Ho utilizzato OpenSMTP come MTA, Dovecot come MDA e Thurderbird|neomutt|RainLoop come MUA.

DNS : Record A, AAAA ed MX

Per attivare un servizio di Posta elettronica è necessario aver un nome di dominio (FQDN), risolto con l’IP della server. L’associazione tra il nome di dominio e l’IP viene definita inserendo nel DNS un record A (per IPv4) oppure un record AAAA (nel caso di IPv6). Nel mio caso ho registrato il nome di dominio di terzo livello (o forse quarto) granito.org.uk, tramite Aruba, il quale mette a disposizione anche una comoda interfaccia web per la gestione del DNS. Inserisco un primo record A per associare il nome dominio all”IPv4 pubblico assegnato al mio server (5). Sulla macchina è presente anche un webserver (che in questo momento ti sta fornendo i miei appunti), e pertanto ho aggiunto anche un record CNAME (7) per creare una sorta di alias, per permettere l’accesso an blog da entrambe le URL https://granito.org.uk e https://www.granito.org.uk.

Per il servizio di Posta Elettronica (SMTPServer) creerò il nome di dominio dedicato mail.granito.org.uk, inserendo un record A per definire il sottodominio “mail”. In entrambi i casi di record A, imposto “1 Ora” di TTL, che dovrebbe equivalere alla frequenza di aggiornamento, in caso di variazioni.

Gestione DNS
granito.org.uk

Tipo	          Nome host	          Valore	          TTL	
A	              @	                  46.23.93.32	      1 Ora	
A	              mail	              46.23.93.32	      1 Ora
CNAME	          www	              granito.org.uk

Nel caso di SMTPServer è necessario definire nel DNS anche il record MX, per permettere agli altri di raggiungerlo.

Gestione DNS
granito.org.uk

Attualmente stai usando:  Record MX personalizzati

Nome host	      Valore	                         Priorità    TTL
@	              mail.granito.org.uk                10          1 Ora	

Supponiamo di inviare una mail da alice@tiscali.it a info@granito.org.uk. Per recapitarla, il server SMTP di Tiscali andrà a ricercare per tale dominio almeno un record MX. Per un servizio di Posta che si rispetti, di solito per un medesimo dominio ci sono almeno 2 record MX, che puntano a destinazioni ridondate. Se avessi ad esempio avuto a disposizione 2 server ridondati, avrei potuto inserire 2 record MX. Il DNS Server con gli MX funziona da bilanciatore di carico. L’attributo Priorità ha senso esclusivamente se vengono definiti per lo stesso dominio 2 o piú MX. Per un bilanciatore di tipo “round robin” la Priorità tra 2 MX va impostata con valore identico.

Di seguito un’ipotetica configurazione di bilanciamento avendoci 2 server di posta ritornati (mail1 e mail2).

Nome host	      Valore	                         Priorità    TTL
@	              mail1.granito.org.uk               10          1 Ora	
@	              mail2.granito.org.uk               10          1 Ora

Qualche Query di verifica con dig

alfree$ date
Mon Nov 17 13:23:22 CET 2025
alfree$ hostname
alfree.openbsd.amsterdam

# Record A : granito.org.uk -> 46.23.93.32
alfree$ dig granito.org.uk +short
46.23.93.32

# Record CN : www.granito.org.uk -> granito.org.uk
alfree$ dig www.granito.org.uk +short
granito.org.uk.
46.23.93.32

# Record A : mail.granito.org.uk -> 46.23.93.32
alfree$ dig mail.granito.org.uk +short
46.23.93.32

# Record MX : granito.org.uk --> Elenco MX : mail.granito.org.uk 
alfree$ dig granito.org.uk MX

; <<>> dig 9.10.8-P1 <<>> granito.org.uk MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25135
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;granito.org.uk.                        IN      MX

;; ANSWER SECTION:
granito.org.uk.         3499    IN      MX      100 mail.granito.org.uk.

;; Query time: 1 msec
;; SERVER: 46.23.91.29#53(46.23.91.29)
;; WHEN: Mon Nov 17 13:23:51 CET 2025
;; MSG SIZE  rcvd: 64

alfree$

Sembra tutto predisposto tutto correttamente.

C’è da dire che il ruolo dei DNS con gli MX non termina qui. E’ possibile fare dell’altro, come ad esempio far puntare un record MX ad un altro MX, ossia creare delle infrastrutture piu’ complesse, che però vanno oltre lo scopo.

Passiamo ora ad installare e configurare il server SMTP.

OpenSMTP (MTA)

SMTPd è preinstallato con OpenBSD. Ne è stato eseguito un port anche su GNU/Linux e altri sistemi BSD. Sicuramente è impacchettato su Debian GNU/Linux, ArchLinux, e probabilmente anche Slackware. Comunque per maggiori dettagli fate riferimento al sito web ufficiale OpenSMTPd

alfree2$ cat /etc/mail/smtpd.conf
# $OpenBSD: smtpd.conf,v 1.14 2019/11/26 20:14:38 gilles Exp $
# This is the smtpd server system-wide configuration file.
# See smtpd.conf(5) for more information.

#.---------------------------------------------------------------.
#|                                                               |
#|         File di configurazone Principale di OpenSMTP          |
#|                    (versione customizzata)                    |
#|                                                               |
#'---------------------------------------------------------------'

#.-----------------------------------------------------------------------.
#| Identita' digitale del Server. -- al momento e' self-signed --        |
#'-----------------------------------------------------------------------'
pki "mail" cert "/etc/ssl/mail.crt"
pki "mail" key  "/etc/ssl/private/mail.key"

#.---------------------------------------------------------------------------.
#| Tabelle Alias, Credenziali ed Utenti Virtuali utilizzati da OpenSMTP.     |
#| Per avere gli utenti virtuali, memorizzati nel file /etc/mail/credentials |
#| nel formato simil-passwd-unix, e' necessario installare il pacchetto      |
#| "opensmtp-table-passwd". L'inserimento dei dati in questo file (al        | 
#| momento) e' manuale e abbastanza noioso. La password e' mantenuta         |
#| cifrata, la forma cifrata e' ottenuta col comando :                       |
#| smtpctl encrypt <password>                                                |
#| alfree2# smtpctl encrypt miapassword                                      |
#| $2b$08$1emmtK5qvdss6kdv2mOll.oWqByZn19wgR5FCM7rC8wo1sQDDP4bK              | 
#'---------------------------------------------------------------------------'
table aliases     file:/etc/mail/aliases
table credentials passwd:/etc/mail/credentials
table virtuals    file:/etc/mail/virtuals

#.--------------------------------------------------------------------.
#| Definizione Listen                                                 |
#|--------------------------------------------------------------------|
#| 1) Porta 25 la usano chi ti manda la posta dall'esterno,           | 
#|    utilizzando altri smtp-server, "on all" significa su tutte le   |
#|    interfacce di rete.                                             |
#|    La porta viene specificata, ma forse non serve farlo perche'    | 
#|    e' quella di default, dall'esterno puntano li. Non so se        |
#|    tramite record MX e' possibile specificarne un'altra.           |
#|    pki specifica l'identita'digitale, al momento self-signed       |
#|    detto. Non so se questo puo' rapprentare un problema.           |
#|    L'hostname e' quanto riportato anche nel DNS con i record A     |
#|    (e non CN), MX e TEXT.                                          |
#| 2) Porta 587 la possono usare gli utenti di OpenSMTP per inviare   |
#|    una e-mail. Se l'esigenza e' inviare da locale allora           |
#|    l'interfaccia di esposizione puo' essere impostta a lo0         |
#|    Nel caso in cui l'utente e' remoto al server (ad esempio dal    |
#|    proprio PC con thunderbird, allora deve essere esposta sulla    |
#|    specifica interfaccia pubblica oppure su tutte (all).           |
#'--------------------------------------------------------------------'
listen on all port 25  tls         pki "mail" hostname "mail.granito.org.uk"
listen on all port 587 tls-require pki "mail" hostname "mail.granito.org.uk" auth <credentials>

#.----------------------------------------------------------------.
#| Sezione Azioni. (Referenziate nella sezione Match)             |
#'----------------------------------------------------------------'
action "local_mail"  mbox alias <aliases>
action "domain_mail" maildir "/var/vmail/granito.org.uk/%{dest.user:lowercase}" virtual <virtuals>
action "outbound"    relay

#.-----------------------------------------------------------.
#| Sezione Match.                                            |
#| 1) local->local  => azione "local_mail"                   |
#| 2) local->any    => azione "outbound"                     |
#| 3) any-user->any => azione "outbound"                     | 
#| 4) any->domain   => azione "domain_mail"                  |
#'-----------------------------------------------------------'
match      from any   for domain "granito.org.uk" action "domain_mail"
match      from local for local                   action "local_mail"
match      from local for any                     action "outbound"
match auth from any   for any                     action "outbound" 

# :::... EOF

Riga 16 e 17 : Chiave Privata e Certificato SSL

E’ necessario avere un’identità digitale SSL, ossia una chiave privata ed il corrispondente certificato (x509) firmato da una Certification Authority riconosciuta. Se momentaneamente non ne avete una, potete generarne una, autocertificandola.

alfree$ cd /etc/mail
alfree$ doas mkdir private                                  
alfree$ doas openssl genrsa -out private/mail.key 4096      
Generating RSA private key, 4096 bit long modulus
..................................................................
e is 65537 (0x010001)

alfree$ doas openssl req -x509 -new -nodes -key private/mail.key -out mail.crt -days 3650 -sha256
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:IT
State or Province Name (full name) []:Italia
Locality Name (eg, city) []:Roma
Organization Name (eg, company) []:Alfree     
Organizational Unit Name (eg, section) []:Alfree
Common Name (eg, fully qualified host name) []:mail.granito.org.uk
Email Address []:info@granito.org.uk

alfree$ ls -ltr private
total 12
-rw-r--r--  1 root  wheel  3243 Oct 12 19:02 mail.key
-rw-r--r--  1 root  wheel  2013 Oct 12 19:05 mail.crt
alfree$ 

Una volta creata l’identità digitale dell’SMTP Server, è necessario applicare ai corrispondenti file i giusti permessi di sistema operativo. I certificati essendo pubblici potranno essere letti da tutti gli utenti della macchina, ma non modificati o sostituiti. La chiave privata dovrà essere letta dal solo owner di processo e dall’amministratore, pertanto vanno applicati i seguenti diritti :

alfree$ doas chmod 755 /etc/mail/identity
alfree$ doas chmod 700 /etc/mail/identity/mail.key
alfree$ doas chmod 700 /etc/mail/identity/mail.crt
alfree$
alfree$ ls -la /etc/mail/identity/
total 28
drwxr-xr-x  2 root  wheel   512 Oct 12 19:35 .
drwxr-xr-x  3 root  wheel   512 Oct 13 19:26 ..
-rwx------  1 root  wheel  2013 Oct 12 19:35 mail.crt
-rwx------  1 root  wheel  3243 Oct 12 19:34 mail.key

Blocco 30-32 : Definizione Tabelle Aliases, Credentials e Virtuals

Il termine Tabelle indica essenzialmente un file di configurazione secondario, dedicato a contenere una specifica tipologia di informazioni, nel nostro caso specifico: aliases, utenti ed utenti virtuali.

La tabella aliases l’ho lasciata inalterata.

La tabella credentials può contenete utenti virtuali e non di sistema operativo, questo per preservare in certi casi, quando un account di posta non debba aver accesso anche al servizio SSH/SFTP, le risorse della macchina esclusivamente a chi realmente ha necessità ad accedervi. Per poter gestire utenti virtuali è necessario installare un’estensione, chiamato opensmtp-table-passwd :

alfree$ doas pkg_add opensmtpd-table-passwd
quirks-7.103 signed on 2025-10-13T22:55:16Z
alfree$
alfree$ doas pkg_info opensmtpd-table-passwd
Information for inst:opensmtpd-table-passwd-1.0.2

Comment:
passwd(5) table for OpenSMTPD

Description:
The passwd table allows to use a custom passwd(5) file as smtpd(8)
table.  It is useful, for example, to share the authentication with the
Dovecot passwd-file.

Maintainer: Omar Polo <op@openbsd.org>

WWW: https://github.com/OpenSMTPD/table-passwd/


alfree$ doas pkg_info -Q opensmtpd-table-passwd
opensmtpd-table-passwd-1.0.2 (installed)

E’ necessario create un utenza reale e relativo gruppo, senza accesso SSH/SFTP che avrà il compito di gestire di account virtuali. Creo ad esempio l’utenza vmail del gruppo vmail, come detto senza shell, e come homedir /var/mail, il luogo in cui verranno posizionate le mailbox (la posta) degli utenti virtuali dell’smtp server. Imposto UID e GID fissa all’utente 2000, per avere installazioni identiche quando dovrò replicarla su altri nodi. Il comando darà un WARNING perchè la directoty designata ad Homedir non esiste, avrei dovuto aggiungere il parametro -m per dirgli di crearla, nel caso no esistesse, ma non lo faccio per evitare che il comando useradd vada a copiare in tale directory i file di /etc/skel/. Preferisco creare la directory ed applicare ad essa i giusti permessi, con i 2 comandi successivi

doas useradd -c "Virtual Mail Account" -d /var/vmail -s /sbin/nologin -u 2000 -g =uid -L staff vmail
doas mkdir /var/vmail
doas chown vmail:vmail /var/vmail

Finalmente siamo pronti a creare i primi utenti e relative mailbox. 😉

La tabella credentials contiene gli utenti, ed ha un formato simile al file passwd di unix.

  • Utenza (ossia il nome casella di posta elettronica da creare, nel caso specifico info@granito.org.uk)
  • Password nel formato cifrato, ottenibile tramite il comando “smtpctl encrypt <password>”
  • Utente di SO creato in precedenza per la gestione delle utenze virtuali (vmail)
  • UID dell’utente di SO per le utenze virtuali (2000)
  • GID dell’utente di SO per le utenze virtuali (2000)
  • MailAddr, ossia la directory in cui verranno memorizzata la casella di posta dell’utente (mail in arrivo). Le mailbox di un determinato dominio, è buona cosa memorizzarle nella homedir dell’utente vmail. All’interno di questa ogni dominio avrà una sua sottodirectory e all’interno di questa una directory per mailbox (nel caso specifico il MailAddr è /var/vmail/granito.org.uk/info)
  • AddrName. Può essere non valorizzato al momento. In ogni caso non ho capito bene a che serve 😮
  • MailAddrMap. Simile ad MailAddr, non ho ancora ben capito la differenza tra i due. Probabilmente potrebbe essere anche non valorizzato nel nostro caso. L’ho valorizzato al momento in questo modo (poi approfondirò) userdb_mail=maildir:/var/vmail/granito.org.uk/info)
alfree2# smtpctl encrypt miapassword
$2b$08$1emmtK5qvdss6kdv2mOll.oWqByZn19wgR5FCM7rC8wo1sQDDP4bK

alfree2$ doas cat /etc/mail/credentials
info@granito.org.uk:$2b$08$1emmtK5qvdss6kdv2mOll.oWqByZn19wgR5FCM7rC8wo1sQDDP4bK:vmail:2000:2000:/var/vmail/granito.org.uk/info::userdb_mail=maildir:/var/vmail/granito.org.uk/info

La tabella virtuals definisce gli eventuali alias. Nel caso specifico, per l’utenza virtuale info, definisco i seguenti 4 alias : abuse, hostmaster, postmaster e webmaster. Qualsiasi mail inviata ad uno degli 4 alias verrà recapitata automaticamente alla casella reale info@granito.org.uk

alfree2$ cat /etc/mail/virtuals
abuse@granito.org.uk:      info@granito.org.uk
hostmaster@granito.org.uk: info@granito.org.uk
postmaster@granito.org.uk: info@granito.org.uk
webmaster@granito.org.uk:  info@granito.org.uk
info@granito.org.uk:       vmail

Blocco 54-55 : Definizione Definizione dei Listener, per ricezione ed invio mail.

Il primo Listen è sulla porta TCP/25 necessaria per la ricezione di mail dall’esterno, da altri domini. La usa chi ti manda una mail, utilizzando altri smtp-server. Può rimanere in ascolto su tutte le interfacce di rete impostando “on all”, oppure sulla specifica interfaccia. La clausola “tls” attiva il layer SSL. Le clausole “pki” e “hostname” permettono la ricezione di sole mail e per il dominio specificato. Per l’invio mail a questo dominio non è previsto nessun meccanismo di autenticazione o verifica al momento. Potrei essere bersaglio di qualche spammer, se si accorgesse della presenza del servizio. Vedremo successivamente come intercettare il possibile spammer e come ricevere esclusivamente da server fidati.

Il secondo Listen è sulla porta TCP/587 necessario per l’invio di messaggi verso altri server-smtp (e caselle di posta). L’invio è possibile esclusivamente ogni utenti (al momento esclusivamente l’utente “info” può inviare mail dall’hostname “mail.granito.org.uk” e dominio “granito.org.uk”. Per tale motivo è impostata la clausola “auth <credential>”. Anche in questo caso, come in precedenza si può impostare il Listen psulla singola interfaccia di rete o su tutte. Ad esempio se si intende permettere l’invio solo se si è loggati sulla macchina si può impostare l’interfaccia di loopback (lo0). Nel nostro caso l’utente è virtuale e non reale, quindi non può accedere alla macchina in SSH.

Blocco 60-62 : Definizioni delle Azioni

In questo blocco ci si limita a definire delle azioni fine a se stesse. L’azione “local_mail” sposta una mail ricevuta della mailbox di un utente locale. L’azione “domain_mail” sposta una mail nella mailbox dell’utente di dominio, specificandone la path completa (/var/vmail/granito.org.uk.org/%{dest.user:lowercase}) e tenendo conto gli alias utente definiti precedentemente nella tabella <virtuals>. Infine, l'”outbound” definisce l’azione di relay, ossio di invio mail.

Nel nostro caso specifico l’azione “local_mail” non verrà utilizzata, e quindi potremmo anche non definirla, al momento.

Blocco 71-74 : Definizioni eventi (match) collegati alle azioni

Da Any al Dominio “mail.granito.org.uk”, significa che è arrivata una mail da qualcuno per una casella del nostro dominio, in quel caso è necessario eseguire l’azione “domain_mail”, ossia va ricercata la casella e recapitata la mail, come specificato.

Da Local a Local, significa che è stata ricevuta una mail da un’utente locale per un’utente locale, e va eseguita l’azione “local_mail“. Abbiamo detto che per il momento non ci interessano le mail tra utenti locali, quindi anche in questo caso potremmo non definire questo evento/match, al momento.

Da Local ad ANY, significa che un utente Locale sta inviando una mail per un’utente su altro dominio. In questo caso l’azione collegata è “outbound“, che corrisponde ad un RELAY, ossia all’instradamento del messaggio verso l’SMTP di competenza. Anche questo caso non non è oggetto di interesse, e quindi potremmo anche non definirlo, al momento. Nessun utente locale è abilitato ad inviare messaggi di nessun tipo.

Da ANY ad ANY, significa che un’utente (virtuale) del nostro server SMTP sta invia una mail verso un destinatario esterno, anche in questo caso l’azione collegata è “outbound“, che corrisponde come detto al RELAY, ossia all’istradamento da parte del nostro server SMTP verso l’SMTP competente

Verifica della Configurazione

Per verificare che la configurazione applicata sia corretta, si può eseguire il seguente comando :

alfree$ doas smtpd -n
configuration OK
alfree$

Abilitare ad avviare il Servizio SMTPd

# Abilita il servizio al BOOT
alfree$ doas rcctl enable smtpd

# Per avviare il Servizio
alfree$ doas rcctl start smtpd
smtpd(ok)

# Verificare i processi in esecuzione
alfree$ ps aux | grep smtpd
root      8321  0.0  0.0   2180   2028 ??  Sp      1:45PM    0:00.02 /usr/sbin/smtpd
_smtpd   27671  0.0  0.1   1932   4440 ??  Spc     1:45PM    0:00.02 smtpd: crypto (smtpd)
_smtpd   16135  0.0  0.1   2124   4340 ??  Spc     1:45PM    0:00.02 smtpd: control (smtpd)
_smtpd   92106  0.0  0.1   2068   4372 ??  Sp      1:45PM    0:00.02 smtpd: lookup (smtpd)
_smtpd    5676  0.0  0.2   7076   9844 ??  Spc     1:45PM    0:00.07 smtpd: dispatcher (smtpd)
_smtpq   75445  0.0  0.1   2300   4360 ??  Spc     1:45PM    0:00.09 smtpd: queue (smtpd)
_smtpd   44223  0.0  0.1   1936   4372 ??  Spc     1:45PM    0:00.03 smtpd: scheduler (smtpd)
_smtpd   69924  0.0  0.0    988   1400 ??  S       1:45PM    0:00.01 credentials /etc/mail/credentials (table-passwd)
alfree$

TEST#1 : Ricezione mail da altro dominio

Prima di effettuare il primo invio mail alla casella info@granito.org.uk, controllo che la home dell’utente vmail sia vuota.

alfree$ ### Mailbox info@granito.org.uk vuota
alfree$ ls /var/vmail/
alfree$ date
Mon Nov 17 14:29:15 CET 2025

Dopodichè invio una mail da Thunderbird per Android, client che uso normalmente per leggere una posta della mia mailbox storica

Nel controllare nuovamente (sul server mail.granito.org.uk) la home dell’utente vmail, compare la directory granito.org.uk, e all’interno di questa la mia casella info (info@granito.org.uk). Come è possibile notare, tutte le directory (e la mail stessa) riportano come TIMESTAMP, il medesimo dell’invio (17/11 14:41).

alfree$ ls /var/vmail/
granito.org.uk

alfree$ doas ls /var/vmail/granito.org.uk/
info

alfree$ doas ls -la /var/vmail/granito.org.uk/info
total 20
drwx------  5 vmail  vmail  512 Nov 17 14:41 .
drwx------  3 vmail  vmail  512 Nov 17 14:41 ..
drwx------  2 vmail  vmail  512 Nov 17 14:41 cur
drwx------  2 vmail  vmail  512 Nov 17 14:41 new
drwx------  2 vmail  vmail  512 Nov 17 14:41 tmp

alfree$ doas ls -la /var/vmail/granito.org.uk/info/new^D
>
total 20
drwx------  2 vmail  vmail   512 Nov 17 14:58 .
drwx------  5 vmail  vmail   512 Nov 17 14:41 ..
-rw-------  1 vmail  vmail  1780 Nov 17 14:41 1763386912.2f52ccf9.alfree.openbsd.amsterdam

Leggo la mail con comando cat, ed è proprio lei. Da client di posta, normalmente (di default) non è visibile immediatamente l’header di una mail ricevuta. Bisognerebbe però leggerlo, ci sono tanti dettagli interessanti in esso, per chi si occupa di sicurezza. Innanzitutto ci dice [alla riga 4] che il server SMTP del mittente è smtp.tiscali.it (santino-notr.mail.tiscali.it [213.2025.33.215]).

Ci fornisce il Timestamp di ricezione (riga 6)

Ci dice di aver ricevuto qualcosa da ehlo.thunderbird.net [109.54.62.182] o da santino.mail.tiscali.net (? righe 7-8)

Da notare che il nostro server OpenSMTP riceve anche il DKIM di Tiscali che analizzeremo in seguito, quando andremo a mettere in sicurezza il server dallo spamming. (righe 26-31)

Il Body (quello che a noi normalmente interessa) ci viene inviato sia in formato sia text/plain e sia text/html). (righe 46-47)

alfree$ doas cat /var/vmail/granito.org.uk/info/new/1763386912.2f52ccf9.alfree.openbsd.amsterdam
Return-Path: &lt;raffaele.granito@tiscali.it>
Delivered-To: info@granito.org.uk
Received: from smtp.tiscali.it (santino-notr.mail.tiscali.it [213.205.33.215])
        by mail.granito.org.uk (OpenSMTPD) with ESMTP id 2c27dd9d
        for &lt;info@granito.org.uk>;
        Mon, 17 Nov 2025 14:41:52 +0100 (CET)
Received: from ehlo.thunderbird.net ([109.54.62.182])
        by santino.mail.tiscali.it with
        id 3phr2G00j3vvE1H01phrEr; Mon, 17 Nov 2025 13:41:52 +0000
X-Spam-Final-Verdict: clean
X-Spam-State: 0
X-Spam-Score: 0
X-Spam-Verdict: clean
x-auth-user: raffaele.granito@tiscali.it
Date: Mon, 17 Nov 2025 14:41:49 +0100
From: Raffaele Granito &lt;raffaele.granito@tiscali.it>
To: info@granito.org.uk
Subject: TEST#1 invio mail da Tiscali.it
User-Agent: Thunderbird for Android
Message-ID: &lt;D3C013BD-C900-4B79-BDD9-1602231B329D@tiscali.it>
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary=----D21SQRURU50GWC1C48Y986Q6I7GJRC
Content-Transfer-Encoding: 7bit
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tiscali.it; s=smtp;
        t=1763386912; bh=cZhWs0P+jmw+Xtx8HBLzzNcVoilJQkRuk7xc4SL75tU=;
        h=Date:From:To:Subject;
        b=wv7xIBs/qdaWYaXrhgbxAcQpRycxUTCIuFuo4qCt4b+s2WK/gg16VMkhSqGFw33nj
         phAi9nCnO0BIgMWRXFDNFKvXdTo/1ubs5mIdeJGe1MSYmjG4BvfjaNvTgCVbKvyVIE
         vvm4nYvig506RoWHvGG/7+a/SrTP7ZLoBbdmQQ6Y=

------D21SQRURU50GWC1C48Y986Q6I7GJRC
Content-Type: text/plain;
 charset=utf-8
Content-Transfer-Encoding: quoted-printable

Questo =C3=A8 un test=2E Il primo=2E

-- timestamp 17/11/2025 14:41
------D21SQRURU50GWC1C48Y986Q6I7GJRC
Content-Type: text/html;
 charset=utf-8
Content-Transfer-Encoding: quoted-printable

&lt;!DOCTYPE html>&lt;html>&lt;body>&lt;div dir=3D"auto">Questo =C3=A8 un test=2E Il pr=
imo=2E&lt;br>&lt;br>-- timestamp 17/11/2025 14:41&lt;/div>&lt;/body>&lt;/html>
------D21SQRURU50GWC1C48Y986Q6I7GJRC--
alfree$

Al momento non abbiamo altri modi per leggere la Posta che ci arriva, finquando non avremo sulla macchina anche la componente MDA, come vedremo successivamente nella seconda parte.

Se vogliamo, a solo scopo didattico, un visualizzatore di mailbox possiamo usare mutt o neomutt, sempre che siamo amministratori della macchina, o comunque coi diritti per aprire la mailbox sul filesystem, con il comando sotto riportato, dopo aver installato il pacchetto neomutt :

alfree$ doas pkg_add neomutt
quirks-7.103 signed on 2025-10-13T22:55:16Z
Ambiguous: choose package for neomutt
a       0: &lt;None>
        1: neomutt-20250113p0v0
        2: neomutt-20250113p0v0-gpgme
        3: neomutt-20250113p0v0-gpgme-notmuch
        4: neomutt-20250113p0v0-gpgme-sasl-notmuch
        5: neomutt-20250113p0v0-gpgme-sasl
        6: neomutt-20250113p0v0-notmuch
        7: neomutt-20250113p0v0-sasl
Your choice: 1
neomutt-20250113p0v0:tdb-1.4.13: ok
neomutt-20250113p0v0:libunistring-0.9.7: ok
neomutt-20250113p0v0:libidn2-2.3.0p0: ok
neomutt-20250113p0v0:kyotocabinet-1.2.80: ok
neomutt-20250113p0v0: ok

doas neomutt -f /var/vmail/granito.org.uk/info -e 'set folder=/var/vmail/granito.org.uk'

Nella prima videata otterrete l’elenco delle mail ricevute dalla casella di posta info@granito.org.uk.

Selezionandone una e dando INVIO, neomutt vi visualizzerà il dettaglio

Una “q” per tornare alla lista e due volte “q” per scire da neomutt.

Vi ho convinto che le mail se usate un gestore di posta elettronica le dovreste inviare già col body cifrato, quanto meno? Vi ho messo una pulce nell’orecchio che dovreste avere un vostro server su cui depositare almeno la posta che ricevete?

TEST#2 : Trasmissione mail verso altro dominio

Il problema nell’effettuare subito un test di invio, è dovuto al fatto che nessun MTA di altro dominio, sano di mente :D, accetterebbe mai un messaggio recapitato dal questo MTA. L’unico maniera per farlo è stato quello di inviare una mail a me stesso.

Procediamo.

Prima di tutto va definito nel file di configurazione di neomutt (/etc/mutt/neomuttrc): l’SMTP Server da utilizzare, credenziali di uso ed altri parametri di connessione, come nell’esempio successivo, in cui per comodità ho evidenziato il blocco per una maggiore comprensione.

alfree$ cat /etc/mutt/neomuttrc
ignore *
unignore from: subject to cc date x-mailer x-url user-agent
hdr_order date from to cc subject
macro index \eb "&lt;search>~b " "search in message bodies"
macro index,pager,attach,compose \cb "\
&lt;enter-command> set my_pipe_decode=\$pipe_decode pipe_decode&lt;Enter>\
&lt;pipe-message> urlview&lt;Enter>\
&lt;enter-command> set pipe_decode=\$my_pipe_decode; unset my_pipe_decode&lt;Enter>" \
"call urlview to extract URLs out of a message"
macro generic,pager &lt;F1> "&lt;shell-escape> less /usr/local/share/doc/neomutt/manual.txt&lt;Enter>" "show NeoMutt documentation"
macro generic,pager &lt;F2> "&lt;shell-escape> less /usr/local/share/doc/neomutt/manual.txt&lt;Enter>" "show NeoMutt documentation"
macro index y "&lt;change-folder>?" "show incoming mailboxes list"
macro pager y "&lt;exit>&lt;change-folder>?" "show incoming mailboxes list"
bind browser y exit
bind editor &lt;delete> delete-char
mime_lookup   application/octet-stream
attachments   +A */.*
attachments   -A text/vcard text/x-vcard
attachments   -A application/pgp.*
attachments   -A application/pkcs7-.* application/x-pkcs7-.*
attachments   +I text/plain
attachments   -A message/external-body
attachments   -I message/external-body

#####################################################
###  SMTP Configurazione - info@granito.org.uk
#####################################################
set smtp_url             = "smtp://mail.granito.org.uk:587"
set ssl_starttls         = yes
set ssl_force_tls        = yes
set smtp_authenticators  ="info@granito.org.uk"
set smtp_pass            ="&lt;password>"

set from                 = info@granito.org.uk
set real_name            = "Raffaele Granito (mail.granito.org.uk)"

Con neomutt è possibile inviare mail in modalità batch, ossia con un solo comando, senza utilizzare la GUI. In alcuni casi questa possibilità è molto comoda.

alfree$ doas neomutt -f /var/vmail/granito.org.uk/info \
-e 'set folder=/var/vmail/granito.org.uk' \
-s "TEST#2 invio mail" \
-- info@granito.org.uk

CONTINUA……………

Ringraziamenti e Conclusioni

Un ringraziamento a OpenBSD Amterdam che mi offre le VM per le mie sperimentazioni ad un prezzo molto onesto e che devolve parte del ricavato alla OpenBSD Foundation per questo immenso sistema operativo. Ringrazio Solene e l’anonimo nerd di VULTR per aver condiviso e suggerito.

Ringrazio chi vorrà segnalarmi gli errori fatti, in maniera tale da correggerli, e far si che questo appunto sia utile ad altre persone interessate all’argomento.

Seguirà appena possibile la seconda parte, che riguarderà probabilmente l’installazione e la configurazione base dell’MDA che ci permetterà di leggere la mail box con POP3 ed IMAP.

_________________________________________

Annotazioni
(1) rfc-5321 — Specifica per implementare SMTP Server https://www.rfc-editor.org/rfc/rfc5321.html
(2) OpenSMTP — Homepage di progetto https://www.opensmtpd.org/
(3) table-password — per gestione delle utenze virtuali in OpenSMTP https://github.com/OpenSMTPD/table-passwd
(4) VULTR Howto https://docs.vultr.com/an-openbsd-e-mail-server-using-opensmtpd-dovecot-rspamd-and-rainloop
(5) Solene Howto https://dataswamp.org/~solene/2024-07-24-openbsd-email-server-setup.html