Postfix e MySQL · 6 min read · Oct 07, 2025
Utenti e domini virtuali con Postfix, Courier e MySQL (Debian Etch) - Pagina 2
4 Creare il database MySQL per Postfix/Courier
Per impostazione predefinita, MySQL è installato senza una password di root, che cambiamo immediatamente (sostituisci yourrootsqlpassword con la password che desideri utilizzare):
mysqladmin -u root password yourrootsqlpasswordOra creiamo un database chiamato mail:
mysqladmin -u root -p create mailSuccessivamente, andiamo nella shell di MySQL:
mysql -u root -pNella shell di 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 di 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; siamo usciti dalla shell di MySQL e siamo tornati nella shell di 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].
| source | destination |
| [email protected] | [email protected] |
La tabella users memorizza tutti gli utenti virtuali (cioè indirizzi email, poiché l’indirizzo email e il nome utente sono gli stessi) e le password (in forma crittografata) e un valore di quota per ciascuna casella di posta (in questo esempio il valore predefinito è 10485760 byte, che significa 10MB).
| password | quota | |
| [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,
| domain | transport |
| example.com | smtp:[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 usi un nome di dominio completamente qualificato (FQDN) al suo posto 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.
5 Configurare 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 nemmeno in una chroot jail (l’alternativa sarebbe spostare il socket MySQL nella chroot jail, il che causerebbe alcuni altri problemi).
Assicurati che /etc/mysql/my.cnf contenga la seguente riga:
vi /etc/mysql/my.cnf| [...] bind-address = 127.0.0.1 [...] |
Se hai dovuto modificare /etc/mysql/my.cnf, riavvia MySQL ora:
/etc/init.d/mysql restartEsegui
netstat -tapper assicurarti che MySQL stia ascoltando su 127.0.0.1 (localhost.localdomain):
server1:/usr/src# netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 localhost.localdo:mysql *:* LISTEN 3003/mysqld
tcp 0 0 *:sunrpc *:* LISTEN 1684/portmap
tcp 0 0 *:auth *:* LISTEN 2036/inetd
tcp 0 0 *:1522 *:* LISTEN 2077/rpc.statd
tcp 0 0 *:smtp *:* LISTEN 12053/master
tcp6 0 0 *:imaps *:* LISTEN 3839/couriertcpd
tcp6 0 0 *:pop3s *:* LISTEN 3629/couriertcpd
tcp6 0 0 *:pop3 *:* LISTEN 3572/couriertcpd
tcp6 0 0 *:imap2 *:* LISTEN 3792/couriertcpd
tcp6 0 0 *:www *:* LISTEN 3712/apache2
tcp6 0 0 *:ssh *:* LISTEN 2058/sshd
tcp6 0 148 server1.example.com:ssh ::ffff:192.168.0.2:4515 ESTABLISHED2139/0Ora 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 |
Poi cambia i permessi e il gruppo di questi file:
chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cfOra 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 -mSuccessivamente 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'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<-- Inserisci il nome del tuo paese (ad es., "IT").
<-- Inserisci il nome del tuo stato o provincia.
<-- Inserisci la tua città.
<-- Inserisci il nome della tua organizzazione (ad es., il nome della tua azienda).
<-- Inserisci il nome della tua unità organizzativa (ad es. "Reparto IT").
<-- Inserisci il nome di dominio completamente qualificato del sistema (ad es. "server1.example.com").
<-- Inserisci il tuo indirizzo email.Poi cambia i permessi di smtpd.key:
chmod o= /etc/postfix/smtpd.keyRicevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.