Postfix Tutorial · 7 min read · Oct 14, 2025

Utenti e Domini Virtuali Con Postfix, Courier, MySQL e SquirrelMail (Debian Wheezy)

Questo tutorial è Copyright (c) 2013 di Falko Timme. È derivato da un tutorial di Christoph Haas che puoi trovare su http://workaround.org. Sei libero di utilizzare questo tutorial sotto la licenza Creative Commons 2.5 o qualsiasi versione successiva.

Questo documento descrive come installare un server di posta Postfix basato su utenti e domini virtuali, cioè utenti e domini che si trovano in un database MySQL. Dimostrerò anche l’installazione e la configurazione di Courier (Courier-POP3, Courier-IMAP), in modo che Courier possa autenticarsi contro lo stesso database MySQL utilizzato da Postfix.

Il server Postfix risultante è in grado di SMTP-AUTH e TLS e quota (la quota non è integrata in Postfix per impostazione predefinita, mostrerò come patchare il tuo Postfix di conseguenza). Le password sono memorizzate in forma criptata nel database (la maggior parte dei documenti che ho trovato trattava password in testo semplice, il che è un rischio per la sicurezza). Inoltre, questo tutorial copre l’installazione di Amavisd, SpamAssassin e ClamAV in modo che le email vengano scansionate per spam e virus. Mostrerò anche come installare SquirrelMail come interfaccia webmail in modo che gli utenti possano leggere e inviare email e cambiare le loro password.

Il vantaggio di una configurazione “virtuale” (utenti e domini virtuali in un database MySQL) è che è molto più performante rispetto a una configurazione basata su “veri” utenti di sistema. Con questa configurazione virtuale, il tuo server di posta può gestire migliaia di domini e utenti. Inoltre, è più facile da amministrare perché devi solo occuparti del database MySQL quando aggiungi nuovi utenti/domini o modifichi quelli esistenti. Niente più comandi postmap per creare file db, niente più ricaricamenti di Postfix, ecc. Per l’amministrazione del database MySQL puoi utilizzare strumenti basati sul web come phpMyAdmin che verrà installato anche in questo howto. Il terzo vantaggio è che gli utenti hanno un indirizzo email come nome utente (invece di un nome utente + un indirizzo email) che è più facile da comprendere e ricordare.

Questo howto è inteso come una guida pratica; non copre gli aspetti teorici. Questi sono trattati in molti altri documenti sul web.

Questo documento viene fornito senza garanzia di alcun tipo! Voglio dire che questo non è l’unico modo per impostare un tale sistema. Ci sono molti modi per raggiungere questo obiettivo, ma questo è il modo che scelgo. Non rilascio alcuna garanzia che questo funzionerà per te!

1 Nota Preliminare

Questo tutorial è basato su Debian Wheezy, quindi dovresti impostare un’installazione di base del server Debian Wheezy prima di continuare con questo tutorial. Il sistema dovrebbe avere un indirizzo IP statico. Uso 192.168.0.100 come il mio indirizzo IP in questo tutorial e server1.example.com come nome host.

È molto importante che tu faccia di /bin/sh un symlink a /bin/bash…

dpkg-reconfigure dash

Usa dash come shell di sistema predefinita (/bin/sh)? <– No

… e che disabiliti AppArmor:

/etc/init.d/apparmor stop   
update-rc.d -f apparmor remove   
apt-get remove apparmor apparmor-utils

2 Installa Postfix, Courier, Saslauthd, MySQL, phpMyAdmin

Per installare Postfix, Courier, Saslauthd, MySQL e phpMyAdmin, eseguiamo semplicemente

apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql libpam-smbpass

Ti verranno poste alcune domande:

Tipo generale di configurazione della posta: <– Internet Site
Nome della posta di sistema: <– server1.example.com
Nuova password per l’utente MySQL “root”: <– yourrootsqlpassword
Ripeti la password per l’utente MySQL “root”: <– yourrootsqlpassword
Creare directory per l’amministrazione basata sul web? <– No
Certificato SSL richiesto <– Ok
Server web da riconfigurare automaticamente: <– apache2
Configurare il database per phpmyadmin con dbconfig-common? <– No

3 Applica La Patch Quota A Postfix

Dobbiamo ottenere i sorgenti di Postfix, patcharli con la patch quota, costruire nuovi pacchetti Postfix.deb e installare quei pacchetti .deb:

apt-get build-dep postfix
cd /usr/src  
apt-get source postfix

(Assicurati di utilizzare la versione corretta di Postfix nei comandi seguenti. Ho installato Postfix 2.9.6. Puoi scoprire la tua versione di Postfix eseguendo

postconf -d | grep mail_version

L’output dovrebbe apparire così:

root@server1:/usr/src# postconf -d | grep mail_version  
mail_version = 2.9.6  
milter_macro_v = $mail_name $mail_version  
root@server1:/usr/src#

)

wget http://vda.sourceforge.net/VDA/postfix-vda-v11-2.9.6.patch  
cd postfix-2.9.6  
patch -p1 < ../postfix-vda-v11-2.9.6.patch

Successivamente, apri debian/rules e cambia DEB_BUILD_HARDENING da 1 a 0:

vi debian/rules

| [...] export DEB_BUILD_HARDENING=0 [...] |

Se non lo fai, la tua build fallirà con i seguenti messaggi di errore:

maildir.c: In function âdeliver_maildirâ:  
maildir.c:974:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c:977:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c:983:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c:986:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c: In function âsql2fileâ:  
maildir.c:404:25: warning: ignoring return value of âreadâ, declared with attribute warn_unused_result [-Wunused-result]  
maildir.c:417:26: warning: ignoring return value of âwriteâ, declared with attribute warn_unused_result [-Wunused-result]  
cc1: some warnings being treated as errors  
make: * [maildir.o] Error 1  
make: Leaving directory `/usr/src/postfix-2.9.3/src/virtual'  
make[1]: * [update] Error 1  
make[1]: Leaving directory `/usr/src/postfix-2.9.3'  
make: *** [build] Error 2  
dpkg-buildpackage: error: debian/rules build gave error exit status 2  
root@server1:/usr/src/postfix-2.9.3#

Ora possiamo costruire i nuovi pacchetti Postfix.deb:

dpkg-buildpackage

Ora andiamo in una directory sopra, dove sono stati creati i nuovi pacchetti .deb:

cd ..

Il comando

ls -l

mostra i pacchetti disponibili:

root@server1:/usr/src# ls -l  
total 8400  
drwxr-xr-x  4 root root    4096 May  7 01:24 linux-headers-3.2.0-4-amd64  
drwxr-xr-x  4 root root    4096 May  7 01:24 linux-headers-3.2.0-4-common  
lrwxrwxrwx  1 root root      23 Jun 24  2012 linux-kbuild-3.2 -> ../lib/linux-kbuild-3.2  
drwxr-xr-x 18 root root    4096 Jul  1 21:13 postfix-2.9.6  
-rw-r--r--  1 root root    3561 Jul  1 21:13 postfix_2.9.6-2_amd64.changes  
-rw-r--r--  1 root root 1529980 Jul  1 21:13 postfix_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root  254432 Jul  1 21:12 postfix_2.9.6-2.diff.gz  
-rw-r--r--  1 root root    1492 Jul  1 21:12 postfix_2.9.6-2.dsc  
-rw-r--r--  1 root root 3767309 Mar 11 15:03 postfix_2.9.6.orig.tar.gz  
-rw-r--r--  1 root root  255470 Jul  1 21:13 postfix-cdb_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root  367774 Jul  1 21:13 postfix-dev_2.9.6-2_all.deb  
-rw-r--r--  1 root root 1294258 Jul  1 21:13 postfix-doc_2.9.6-2_all.deb  
-rw-r--r--  1 root root  264196 Jul  1 21:13 postfix-ldap_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root  257322 Jul  1 21:13 postfix-mysql_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root  257376 Jul  1 21:13 postfix-pcre_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root  257476 Jul  1 21:13 postfix-pgsql_2.9.6-2_amd64.deb  
-rw-r--r--  1 root root   55009 May  7 08:47 postfix-vda-v11-2.9.6.patch  
drwxr-xr-x  7 root root    4096 May  7 01:24 virtualbox-guest-4.1.18  
root@server1:/usr/src#

Seleziona i pacchetti postfix e postfix-mysql e installali in questo modo:

dpkg -i postfix_2.9.6-2_amd64.deb postfix-mysql_2.9.6-2_amd64.deb

4 Crea Il Database MySQL Per Postfix/Courier

Ora creiamo un database chiamato mail:

mysqladmin -u root -p create mail

Successivamente, andiamo nella shell MySQL:

mysql -u root -p

Nella shell MySQL, creiamo l’utente mail_admin con la password mail_admin_password (sostituiscila con la tua password) che ha privilegi SELECT, INSERT, UPDATE, DELETE sul database mail. Questo utente sarà utilizzato da Postfix e Courier per connettersi al database mail:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';  
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';  
FLUSH PRIVILEGES;

Ancora nella shell MySQL, creiamo le tabelle necessarie a Postfix e Courier:

USE mail;
CREATE TABLE domains (  
domain varchar(50) NOT NULL,  
PRIMARY KEY (domain) )  
ENGINE=MyISAM;
CREATE TABLE forwardings (  
source varchar(80) NOT NULL,  
destination TEXT NOT NULL,  
PRIMARY KEY (source) )  
ENGINE=MyISAM;
CREATE TABLE users (  
email varchar(80) NOT NULL,  
password varchar(20) NOT NULL,  
quota INT(10) DEFAULT '10485760',  
PRIMARY KEY (email)  
) ENGINE=MyISAM;
CREATE TABLE transport (  
domain varchar(128) NOT NULL default '',  
transport varchar(128) NOT NULL default '',  
UNIQUE KEY domain (domain)  
) ENGINE=MyISAM;
quit;

Come avrai notato, con il comando quit; siamo usciti dalla shell MySQL e siamo tornati nella shell Linux.

La tabella domains memorizzerà ciascun dominio virtuale per il quale Postfix dovrebbe ricevere email (ad esempio example.com).

domain
example.com

La tabella forwardings è per l’aliasing di un indirizzo email a un altro, ad esempio inoltrare email per [email protected] a [email protected].

sourcedestination
[email protected][email protected]

La tabella users memorizza tutti gli utenti virtuali (cioè indirizzi email, perché l’indirizzo email e il nome utente sono gli stessi) e le password (in forma criptata!) e un valore di quota per ciascuna casella di posta (in questo esempio il valore predefinito è 10485760 byte, che significa 10MB).

emailpasswordquota
[email protected]No9.E4skNvGa. (“segreto” in forma criptata)10485760

La tabella transport è facoltativa, è per utenti avanzati. Consente di inoltrare email per singoli utenti, interi domini o tutte le email a un altro server. Ad esempio,

domaintransport
example.comsmtp:[1.2.3.4]

inoltrerebbe tutte le email per example.com tramite il protocollo smtp al server con l’indirizzo IP 1.2.3.4 (le parentesi quadre [] significano “non effettuare una ricerca del record MX DNS” (il che ha senso per gli indirizzi IP…). Se utilizzi un nome di dominio completamente qualificato (FQDN) invece non utilizzeresti le parentesi quadre.).

A proposito, (presumo che l’indirizzo IP del tuo sistema di server di posta sia 192.168.0.100) puoi accedere a phpMyAdmin su http://192.168.0.100/phpmyadmin/ in un browser e accedere come mail_admin. Poi puoi dare un’occhiata al database. Più avanti puoi usare phpMyAdmin per amministrare il tuo server di posta.

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.