Fare in modo che Postfix prenda le sue informazioni dal database MySQL
Nel capitolo precedente abbiamo creato lo schema del database SQL ed inserito alcuni dati di prova. Il punto di ingresso per tutta la posta sul nostro sistema è Postfix. Dobbiamo quindi dire a Postfix come prendere le informazioni dal database. Prima di tutto diciamogli come scoprire se un certo dominio è un valido dominio mail.
virtual_mailbox_domains
Come descritto in precedenza, una mappatura in Postfix è semplicemente una tabella che contiene una parte sinistra (LHS) e una parte destra (RHS). Per fare in modo che Postfix usi MySQL dobbiamo creare un file ‘cf’ (configuration file). Cominciamo col creare il file /etc/postfix/mysql-virtual-mailbox-domains.cf per la mappatura virtual_mailbox_domains che contiene:
user = mailuser password = fLxsWdf5ABLqwhZr # Usate la vostra password qui hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s'
Immaginate che Postfix riceva una mail da somebody@example.org e voglia scoprire se example.org è un dominio mail virtuale. Lancerà la query SQL sopra sostituendo ‘%s’ con ‘example.org’. Se trova questa riga nella tabella virtual_domains restituisce ‘1’. In realtà non è importante cosa torna esattamente purché ci sia un risultato.
Nota
Potreste essere tentati di scrivere “localhost” invece di “127.0.0.1”. Non fatelo perché in realtà c’è una differenza in questo contesto. L’ho già spiegato nella pagina precedente ma lasciatemelo ripetere: “localhost” farà cercare a Postfix il file socket di MariaDB, ma non può farlo dentro la sua cella chroot in /var/spool/postfix perché si trova in /var/run/mysqld/mysqld.sock di default. Ma se diciamo a Postfix di usare 127.0.0.1 come descritto faremo usare a Postifix una connessione TCP sulla porta 3306 di localhost, il che funziona anche se Postfix è dentro la cella.
Adesso diciamo a Postfix di usare questa mappatura del database:
postconf virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Il comando “postconf” è comodo perché aggiunge linee di configurazione al file /etc/postfix/main.cf. Inoltre attiva i nuovi settaggi instantaneamente, senza così dover ricaricare il processo Postfix.
I dati di prova creati prima hanno aggiunto il dominio “example.org” come uno dei nostri domini mail. Chiediamo a Postfix se riconosce quel dominio:
postmap -q example.org mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Dovreste ottenere ‘1’ come risultato. La nostra prima mappatura funziona. Ottimo. Procediamo con la seconda.
virtual_mailbox_maps
Ora andremo a definire virtual_mailbox_maps che mappa gli indirizzi email (parte sinistra) con la posizione della mailbox dell’utente nel disco (parte destra). Postfix ha un servizio di trasporto integrato chiamato “virtual” che riceve l’email e li mette in quella cartella. Ma non lo useremo in quel modo. Invece useremo il servizio di trasporto “dovecot” per facilitarci la vita.
Se usiamo “dovecot”, Postfix controlla ugualmente se l’indirizzo email di destinazione è definito nella mappatura virtual_mailbox_maps. Ma ignorerà la parte destra. Postfix controlla solo se un certo indirizzo email è valido. Simile a quando visto sopra, abbiamo bisogno di una query SQL che cerchi un indirizzo email e ritorni “1”.
Per farlo creiamo un altro file di configurazione /etc/postfix/mysql-virtual-mailbox-maps.cf:
user = mailuser password = fLxsWdf5ABLqwhZr # usate la vostra password del database qui
hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s'
Diciamo a Postfix che questo file deve essere usato per la mappatura virtual_mailbox_maps:
postconf virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Testiamo se Postfix è contento di questa mappatura chiedendogli dov’è la cartella mailbox del nostro utente john@example.org:
postmap -q john@example.org mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Dovremmo ottenre “1” che significa che john@example.org è un utente con una mailbox virtuale presente nel nostro server. Molto bene. Più avanti quando affronteremo la configurazione di Dovecot, useremo anche il campo password ma Postfix non ne ha bisogno qui. Alla prossima mappatura:
virtual_alias_maps
virtual_alias_maps è usato per inoltrare mail da un indirizzo email ad un altro. E’ possibile indicare destinazioni multiple. Nel database questo si ottiene usando righe differenti. Per maggiori dettagli fate riferimento alla pagina sui domini virtuali.
Creiamo un altro file “cf” /etc/postfix/mysql-virtual-alias-maps.cf:
user = mailuser
password = fLxsWdf5ABLqwhZr # usate la vostra password del database qui
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'
Facciamo usare a Postfix questa mappatura del database:
postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Testiamo se la mappatura funziona come previsto:
postmap -q jack@example.org mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Dovreste ottenere la destinazione prevista:
john@example.org
Se Postfix dovesse ricevere una mail per jack@example.org, questa sarà inoltrata a john@example.org.
Alias Catch-all
Come spiegato in precedenza in questo tutorial c’è un modo per inoltrare tutti gli indirizzi mail in un dominio ad un certo indirizzo email di destinazione. Questo è chiamato alias “catchcall”. Questi catturano tutte le mail per un dominio se non esiste uno specifico utente virtuale per quell’indirizzo email. I “catchall” sono il male in persona – seriamente. Può essere allettante in generale inoltrare tutti gli indirizzi mail ad una persona se, per esempio, il vostro reparto marketing richiede nuovi alias email ogni settimana. L’inconveniente è che riceverete un quantitativo di spam assurdo perché gli spammer manderanno la loro spazzatura ad indirizzi a caso del vostro dominio. O forse un mittente confonde la scrittura di un destinatario ma il server di posta trasmetterà la mail invece di rifiutarla a buon diritto. Quindi pensateci bene prima di usare i catchall.
Ancora convinti di usarli? Mmm, ok. Un alias catchall è del tipo “@example.org” ed inoltra mail per l’intero dominio ad altri indirizzi. Abbiamo creato l’utente ‘john@example.org’ e vorremmo inoltrare tutte le altre mail del dominio a ‘kerstin@example.com’. Quindi aggiungiamo un alias catchall come questo:
source | destination |
---|---|
@example.org | kerstin@example.com |
Ma c’è un trucco. Provate ad immaginare cosa succede quando Postfix riceve una mail per ‘john@example.org’. Postfix prima controlla gli alias nella tabella virtual_alias_maps. (Non guarda subito nella tabella virtual_mailbox_maps.) Trova la voce catchall sopra e siccome non ci sono alias più specifici, viene considerato l’account catchall e la mail è reindirizzata a ‘kerstin@example.com’. John non riceverà alcuna mail. Questo non è quello che vogliamo.
Quindi dobbiamo modificare la tabella come segue:
destination | |
---|---|
@example.org | kerstin@example.com |
john@example.org | john@example.org |
Alias più specifici hanno la precedenza sugli alias catchall generali. Postfix troverà prima una voce per ‘john@example.org’ e capisce che questa mail deve essere “inoltrata” a ‘john@example.org’ – lo stesso indirizzo email. Questa furbata può sembrare strana ma è necessaria se avete intenzione di usare gli account catchall.
Postfix controllerà tutte queste mappature per ogni:
- john@example.org (più specifico)
- john (funziona solo se “example.org” è nel dominio $myorigin)
- @example.org (catchall – meno specifico)
Questo è spiegato nella pagina man virtual(5) nella sezione TABLE SEARCH ORDER.
Per questa mappatura “john-a-sestesso” dobbiamo creare il file “.cf” /etc/postfix/mysql-email2email.cf per l’ultima mappatura:
user = mailuser
password = fLxsWdf5ABLqwhZr # usate la vostra password del database qui
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'
Controlliamo di ottenere l’indirizzo email di John quando chiediamo a Postfix se c’è qualche alias per lui:
postmap -q john@example.org mysql:/etc/postfix/mysql-email2email.cf
Il risultato dovrebbe essere lo stesso indirizzo:
john@example.org
Ora dobbiamo dire a Postfix che deve controllare sia gli alias che “john-a-sestesso”:
postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
L’ordine delle due mappature non è importante qui.
Ce l’abbiamo fatta! Tutte le mappature sono configurate e il database per lo più è pronto per essere riempito di domini e utenti. Assicuratevi che solo gli utenti ‘root’ e ‘postfix’ possano leggere i file “.cf” – dopotutto la password del database è salvata qui:
chgrp postfix /etc/postfix/mysql-*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf