Postfix MySQL · 6 min read · Oct 10, 2025

Utenti e Domini Virtuali Con Postfix, Courier e MySQL (CentOS 5.1) - Pagina 2

7 Crea Il Database MySQL Per Postfix/Courier

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 di cui Postfix e Courier hanno bisogno:

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

Come avrai notato, con il comando quit; abbiamo lasciato la shell MySQL e siamo tornati nella shell Linux.

La tabella domains memorizzerà ogni 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 crittografata!) e un valore di quota per ogni casella di posta (in questo esempio il valore predefinito è 10485760 byte, che significa 10MB).

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

La tabella transport è facoltativa, è per utenti avanzati. Permette 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” (cosa sensata per indirizzi IP…). Se utilizzi un nome di dominio completamente qualificato (FQDN) invece non utilizzeresti le parentesi quadre.).

8 Configura Postfix

Ora dobbiamo dire a Postfix dove può trovare tutte le informazioni nel database. Pertanto, dobbiamo creare sei file di testo. Noterai che dico a Postfix di connettersi a MySQL all’indirizzo IP 127.0.0.1 invece di localhost. Questo perché Postfix è in esecuzione in una chroot jail e non ha accesso al socket MySQL a cui tenterebbe di connettersi se dicessi a Postfix di usare localhost. Se uso 127.0.0.1 Postfix utilizza il networking TCP per connettersi a MySQL, il che non è un problema anche in una chroot jail (l’alternativa sarebbe spostare il socket MySQL nella chroot jail, il che causerebbe altri problemi).

Ora creiamo i nostri sei file di testo.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

chmod o= /etc/postfix/mysql-virtual_*.cf  
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Ora creiamo un utente e un gruppo chiamati vmail con la home directory /home/vmail. Qui verranno memorizzate tutte le caselle di posta.

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Successivamente, facciamo alcune configurazioni di Postfix. Assicurati di sostituire server1.example.com con un FQDN valido, altrimenti il tuo Postfix potrebbe non funzionare correttamente!

postconf -e 'myhostname = server1.example.com'  
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
postconf -e 'mynetworks = 127.0.0.0/8'  
postconf -e 'virtual_alias_domains ='  
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
postconf -e 'virtual_mailbox_base = /home/vmail'  
postconf -e 'virtual_uid_maps = static:5000'  
postconf -e 'virtual_gid_maps = static:5000'  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
postconf -e 'virtual_create_maildirsize = yes'  
postconf -e 'virtual_maildir_extended = yes'  
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'  
postconf -e 'virtual_mailbox_limit_override = yes'  
postconf -e 'virtual_maildir_limit_message = "L'utente che stai cercando di contattare ha superato la quota."'  
postconf -e 'virtual_overquota_bounce = yes'  
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'  
postconf -e 'inet_interfaces = all'

Successivamente, creiamo il certificato SSL necessario per TLS:

cd /etc/postfix  
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Nome del Paese (codice a 2 lettere) [GB]: <– Inserisci il Nome del tuo Paese (ad es., “IT”).
Nome dello Stato o della Provincia (nome completo) [Berkshire]: <– Inserisci il Nome del tuo Stato o Provincia.
Nome della Località (ad es., città) [Newbury]: <– Inserisci la tua Città.
Nome dell’Organizzazione (ad es., azienda) [My Company Ltd]: <– Inserisci il Nome della tua Organizzazione (ad es., il nome della tua azienda).
Nome dell’Unità Organizzativa (ad es., sezione) []: <– Inserisci il Nome della tua Unità Organizzativa (ad es. “Reparto IT”).
Nome Comune (ad es., il tuo nome o il nome host del tuo server) []: <– Inserisci il Nome di Dominio Completamente Qualificato del sistema (ad es., “server1.example.com”).
Indirizzo Email []: <– Inserisci il tuo Indirizzo Email.

Poi cambia i permessi di smtpd.key:

chmod o= /etc/postfix/smtpd.key

9 Configura Saslauthd

Modifica /usr/lib/sasl2/smtpd.conf. Dovrebbe apparire così:

vi /usr/lib/sasl2/smtpd.conf

| pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path:/var/spool/authdaemon/socket |

Poi disabilita Sendmail e avvia Postfix, saslauthd e courier-authlib:

chmod 755 /var/spool/authdaemon  
chkconfig --levels 235 courier-authlib on  
/etc/init.d/courier-authlib start
chkconfig --levels 235 sendmail off  
chkconfig --levels 235 postfix on  
chkconfig --levels 235 saslauthd on  
/etc/init.d/sendmail stop  
/etc/init.d/postfix start  
/etc/init.d/saslauthd start

10 Configura Courier

Ora dobbiamo dire a Courier che deve autenticarsi contro il nostro database MySQL. Prima, modifica /etc/authlib/authdaemonrc e cambia il valore di authmodulelist in modo che legga

vi /etc/authlib/authdaemonrc

| [...] authmodulelist="authmysql" #authmodulelist="authuserdb authpam authpgsql authldap authmysql authcustom authpipe" [...] |

Poi modifica /etc/authlib/authmysqlrc. Dovrebbe apparire esattamente così (ancora, assicurati di inserire i dettagli corretti del database):

cp /etc/authlib/authmysqlrc /etc/authlib/authmysqlrc_orig  
cat /dev/null > /etc/authlib/authmysqlrc  
vi /etc/authlib/authmysqlrc

| MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |

Poi riavvia Courier:

chkconfig --levels 235 courier-imap on  
/etc/init.d/courier-authlib restart  
/etc/init.d/courier-imap restart

Eseguendo

telnet localhost pop3

puoi vedere se il tuo server POP3 funziona correttamente. Dovrebbe restituire +OK Hello there . (digita quit per tornare alla shell Linux):

[root@server1 postfix]# telnet localhost pop3  
Trying 127.0.0.1...  
Connected to localhost.localdomain (127.0.0.1).  
Escape character is '^]'.  
+OK Hello there.  
quit  
+OK Better luck next time.  
Connection closed by foreign host.  
[root@server1 postfix]#
Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.