534
contributi
(20 versioni intermedie di 4 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{Guida da adottare | Marcomg}} | |||
{{Stub}} | |||
==Introduzione== | ==Introduzione== | ||
Prima di mettere in piedi un server mail, è necessario valutare l'architettura di cui abbiamo bisogno e poi fare la cernita tra i vari pacchetti disponibili, equivalenti e non che concorrono all'installazione del servizio globale di mailing. | Prima di mettere in piedi un server mail, è necessario valutare l'architettura di cui abbiamo bisogno e poi fare la cernita tra i vari pacchetti disponibili, equivalenti e non che concorrono all'installazione del servizio globale di mailing. | ||
Come potrete immaginare, un server mail non è un software ma è un castello di servizi che noi edifichiamo secondo le nostre esigenze o capacità. Ciò ci dà la massima flessibilità e libertà ma al contempo crea spesso confusione, incertezze, dubbi e difficoltà di installazione. Infine in Rete si trovano infinite e differenti documentazioni che, | Come potrete immaginare, un server mail non è un software ma è un castello di servizi che noi edifichiamo secondo le nostre esigenze o capacità. Ciò ci dà la massima flessibilità e libertà ma al contempo crea spesso confusione, incertezze, dubbi e difficoltà di installazione. Infine in Rete si trovano infinite e differenti documentazioni che, cercando di adattare alle nostre varianti, spesso portano ad errori. | ||
In questa pagina voglio esporre in modo completo (dalla A alla Z) una delle tante possibili configurazioni per creare un server mail. Le peculiarità salienti di questa architettura sono: | In questa pagina voglio esporre in modo completo (dalla A alla Z) una delle tante possibili configurazioni per creare un server mail. Le peculiarità salienti di questa architettura sono: | ||
* servizio IMAP per la lettura delle email | |||
* configurazione dinamica di utenti, forward, domini tramite immagazzinamento dati su un Database (MySQL) | |||
* gestione email per più domini | |||
Se soltanto una di queste | Se soltanto una di queste caratteristiche differisce dalle tue necessità, ti consiglio di valutare e leggere altre documentazioni complete e pensate per altri scopi, in modo da non trovarti servizi e pacchetti inutili e problemi di configurazione nel caso in cui non conoscessi bene i software in uso. | ||
==Requisiti iniziali == | ==Requisiti iniziali == | ||
Sulla macchina è installa una versione GNU/Linux Debian (testato su Debian 6.0 a 64 bit) | Sulla macchina è installa una versione GNU/Linux Debian (testato su Debian 6.0 a 64 bit) | ||
La macchina è predisposta per essere un server [[ | La macchina è predisposta per essere un server [[Installare_un_ambiente_LAMP:_Linux,_Apache2,_SSL,_MySQL,_PHP5|LAMP]], ma per chi non ne avesse la necessità è sufficiente l'installazione del server MySQL. | ||
Per eseguire la guida bisogna avere i permessi di root | Per eseguire la guida bisogna avere i permessi di root. | ||
Nelle | {{Suggerimento|Nelle mie guide utilizzo preferenzialmente l'editor testuale '''nano''', ma vi lascio la libertà di poter scegliere quello che preferite: una ragione in più per porre attenzione ai ''copia e incolla'' dei comandi ;-) }} | ||
== Installazione == | == Installazione == | ||
Per l'installazione dei pacchetti eseguire il comando: | Per l'installazione dei pacchetti eseguire il comando: | ||
# apt install postfix-mysql dovecot-imapd | |||
Se sulla macchina c'era installato il predefinito Exim4, non preoccupatevi perché ci penserà Postfix a rimuoverlo. | Se sulla macchina c'era installato il predefinito Exim4, non preoccupatevi perché ci penserà Postfix a rimuoverlo. | ||
Riga 36: | Riga 38: | ||
Tutte le impostazioni si possono fare direttamente nel file principale: /etc/postfix/main.cf | Tutte le impostazioni si possono fare direttamente nel file principale: /etc/postfix/main.cf | ||
== Creazione del database == | == Creazione del database == | ||
A questo punto è | A questo punto è necessario preparare il database che ospiterà tutti i dati. Il nome assegnato al database è ''mailserver'', ma non è assolutamente vincolante, ergo potete assegnare il nome che volete, facendo però attenzione a modificare le istruzioni qui riportate. | ||
Entrare nella shell di mysql (mysql -u root -p): | Entrare nella shell di mysql (mysql -u root -p): | ||
mysql --user=root --password=mettere_password | # mysql --user=root --password=mettere_password | ||
Effettuato il login con i privilegi necessari | Effettuato il login con i privilegi necessari, dalla console di MySQL procediamo con la creazione del database: | ||
mysql> CREATE DATABASE mailserver DEFAULT CHARSET utf8; | #''mysql>'' CREATE DATABASE mailserver DEFAULT CHARSET utf8; | ||
Ora passiamo alla prima tabella destinata a memorizzare gli account utente virtuali. Nel nostro caso indirizzo email e nome utente coincideranno, come sono soliti fare gli ISP. | Ora passiamo alla prima tabella destinata a memorizzare gli account utente virtuali. Nel nostro caso indirizzo email e nome utente coincideranno, come sono soliti fare gli ISP. | ||
Prima dobbiamo selezionare il database | |||
mysql> use mailserver | #''mysql>'' use mailserver | ||
Poi creiamo la tabella con la seguente istruzione SQL | |||
mysql> CREATE TABLE `users` ( | #''mysql>'' CREATE TABLE `users` ( | ||
`email` varchar(200) NOT NULL, | `email` varchar(200) NOT NULL, | ||
`password` varchar(128) NOT NULL, | `password` varchar(128) NOT NULL, | ||
Riga 64: | Riga 65: | ||
Notate il campo active, potremo utilizzarlo come flag per disattivare un utente senza eliminare le informazioni relative alla sua casella di posta. | Notate il campo "active" della tabella, questo lo potremo utilizzarlo come flag per disattivare un utente senza eliminare le informazioni relative alla sua casella di posta. | ||
Proseguiamo con la successiva tabella destinata a contenere i domini per i quali il nostro server sarà abilitato a ricevere posta. Non dimenticate di far puntare al suo indirizzo IP i corrispondenti record MX dei DNS. | Proseguiamo con la successiva tabella destinata a contenere i domini per i quali il nostro server sarà abilitato a ricevere posta. Non dimenticate di far puntare al suo indirizzo IP i corrispondenti record MX dei DNS. | ||
mysql> CREATE TABLE `domains` ( | #''mysql>'' CREATE TABLE `domains` ( | ||
`domain` varchar(200) NOT NULL, | `domain` varchar(200) NOT NULL, | ||
`Status` enum('DISABLE','ENABLE') NOT NULL default 'ENABLE', | `Status` enum('DISABLE','ENABLE') NOT NULL default 'ENABLE', | ||
Riga 75: | Riga 76: | ||
Passiamo ora alla creazione della tabella degli forward, dove il campo "source" conterrà l'alias mentre "destination" la casella email verso cui verrà effettuata la ridirezione: | Passiamo ora alla creazione della tabella degli forward, dove il campo "source" conterrà l'alias mentre "destination" la casella email verso cui verrà effettuata la ridirezione: | ||
mysql> CREATE TABLE `forward` ( | #''mysql>'' CREATE TABLE `forward` ( | ||
`source` varchar(200) NOT NULL, | `source` varchar(200) NOT NULL, | ||
`destination` varchar(200) NOT NULL, | `destination` varchar(200) NOT NULL, | ||
Riga 85: | Riga 86: | ||
Terminiamo creando un utente che consentirà a Postfix di agire sul database: | Terminiamo creando un utente che consentirà a Postfix di agire sul database: | ||
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON mailserver.* TO postfix@localhost IDENTIFIED BY 'postfix_password'; | #''mysql>'' GRANT SELECT, INSERT, UPDATE, DELETE ON mailserver.* TO postfix@localhost IDENTIFIED BY 'postfix_password'; | ||
Aggiorniamo i privilegi | Aggiorniamo i privilegi | ||
mysql> FLUSH PRIVILEGES; | #''mysql>'' FLUSH PRIVILEGES; | ||
Infine, usciamo dalla shell di mysql con il comando: | |||
mysql> quit | #''mysql>'' quit | ||
Riga 117: | Riga 118: | ||
Nella directory /etc/postfix, creiamo un file di nome ''mysql-domains.cf''. | Nella directory /etc/postfix, creiamo un file di nome ''mysql-domains.cf''. | ||
vi /etc/postfix/mysql-domains.cf | # vi /etc/postfix/mysql-domains.cf | ||
Tale file servirà ad accedere alla tabella domains, precedentemente creata, per verificare se Postfix sia autorizzato a ricevere posta per il dominio in oggetto. Ricordo che dovremo aver preventivamente configurato i DNS perché i record MX del dominio puntino al nostro server. Inseriamo in ''mysql-domains.cf'' le seguenti istruzioni: | Tale file servirà ad accedere alla tabella domains, precedentemente creata, per verificare se Postfix sia autorizzato a ricevere posta per il dominio in oggetto. Ricordo che dovremo aver preventivamente configurato i DNS perché i record MX del dominio puntino al nostro server. Inseriamo in ''mysql-domains.cf'' le seguenti istruzioni: | ||
Riga 125: | Riga 126: | ||
query = SELECT domain AS virtual FROM domains WHERE domain='%s' | query = SELECT domain AS virtual FROM domains WHERE domain='%s' | ||
hosts = 127.0.0.1 | hosts = 127.0.0.1 | ||
NB: lo user "postfix" e relativa password sono relativi all'utente del database che hai definito con il comando "GRANT ..." nel capitolo precedente [[Server_mail_base:_Postfix_Dovecot_e_MySql#Creazione_del_database]] | |||
La sintassi è molto semplice: con le prime tre righe indichiamo a Postfix le credenziali (user e password) ed il database a cui collegarsi. | La sintassi è molto semplice: con le prime tre righe indichiamo a Postfix le credenziali (user e password) ed il database a cui collegarsi. | ||
Riga 133: | Riga 136: | ||
=== Utenti === | === Utenti === | ||
Nella directory /etc/postfix, creiamo un file di nome mysql-users.cf | Nella directory /etc/postfix, creiamo un file di nome mysql-users.cf | ||
vi /etc/postfix/mysql-users.cf | # vi /etc/postfix/mysql-users.cf | ||
All'interno del file inseriamo il seguente testo: | All'interno del file inseriamo i dati di autenticazione per permettere l'accesso al database, con il seguente testo: | ||
user = postfix | user = postfix | ||
password = postfix_password | password = postfix_password | ||
Riga 141: | Riga 144: | ||
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' AND status='ENABLE' | query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' AND status='ENABLE' | ||
hosts = 127.0.0.1 | hosts = 127.0.0.1 | ||
NB: lo user "postfix" e relativa password sono relativi all'utente del database che hai definito con il comando "GRANT ..." nel capitolo precedente [[Server_mail_base:_Postfix_Dovecot_e_MySql#Creazione_del_database]] | |||
La funzione SUBSTRING_INDEX permette di suddividere una stringa in sottostringhe utilizzando un carattere come separatore, nel nostro caso "@". Supponendo che l'indirizzo email sia test@miazienda.it SUBSTRING_INDEX(email,'@',-1) corrisponderà a miazienda.it mentre SUBSTRING_INDEX(email,'@',1) a test. Il risultato della query sarà il percorso ''miazienda.it/test/'' ed rappresenterà il percorso dove verranno salvate le email dell'utente in questione. Questo ci permetterà di gestire facilmente molti domini isolandoli e raggruppando i rispettivi account. | La funzione SUBSTRING_INDEX permette di suddividere una stringa in sottostringhe utilizzando un carattere come separatore, nel nostro caso "@". Supponendo che l'indirizzo email sia test@miazienda.it SUBSTRING_INDEX(email,'@',-1) corrisponderà a miazienda.it mentre SUBSTRING_INDEX(email,'@',1) a test. Il risultato della query sarà il percorso ''miazienda.it/test/'' ed rappresenterà il percorso dove verranno salvate le email dell'utente in questione. Questo ci permetterà di gestire facilmente molti domini isolandoli e raggruppando i rispettivi account. | ||
=== Forward o Alias === | === Forward o Alias === | ||
Questa tabella conterrà gli alias, ovvero quegli indirizzi email che saranno girati automaticamente ad un altro account email. | Questa tabella conterrà gli alias, ovvero quegli indirizzi email che saranno girati automaticamente ad un altro account email. | ||
Nella directory /etc/postfix, creiamo i seguenti due file: | Nella directory /etc/postfix, creiamo i seguenti due file: | ||
vi /etc/postfix/mysql-aliases.cf | # vi /etc/postfix/mysql-aliases.cf | ||
All'interno del file inseriamo il seguente testo: | All'interno del file inseriamo il seguente testo: | ||
Riga 156: | Riga 160: | ||
query = SELECT destination FROM forward WHERE source='%s' | query = SELECT destination FROM forward WHERE source='%s' | ||
hosts = 127.0.0.1 | hosts = 127.0.0.1 | ||
NB: lo user "postfix" e relativa password sono relativi all'utente del database che hai definito con il comando "GRANT ..." nel capitolo precedente [[Server_mail_base:_Postfix_Dovecot_e_MySql#Creazione_del_database]] | |||
Creiamo il secondo file: | Creiamo il secondo file: | ||
vi /etc/postfix/mysql-email2email.cf | # vi /etc/postfix/mysql-email2email.cf | ||
All'interno del file inseriamo il seguente testo: | All'interno del file inseriamo il seguente testo: | ||
Riga 166: | Riga 172: | ||
query = SELECT email FROM users WHERE email='%s' AND status='ENABLE' | query = SELECT email FROM users WHERE email='%s' AND status='ENABLE' | ||
hosts = 127.0.0.1 | hosts = 127.0.0.1 | ||
NB: lo user "postfix" e relativa password sono relativi all'utente del database che hai definito con il comando "GRANT ..." nel capitolo precedente [[Server_mail_base:_Postfix_Dovecot_e_MySql#Creazione_del_database]] | |||
=== Permessi === | === Permessi === | ||
Infine modifichiamo i permessi su tutti i file appena creati: | Infine modifichiamo i permessi su tutti i file appena creati: | ||
chmod 640 /etc/postfix/mysql-*.cf | # chmod 640 /etc/postfix/mysql-*.cf | ||
chown root:postfix /etc/postfix/mysql-*.cf | # chown root:postfix /etc/postfix/mysql-*.cf | ||
Riga 275: | Riga 283: | ||
NB: Se non utilizzate un relayhost per inviare le email, saltate questo capitolo. | NB: Se non utilizzate un relayhost per inviare le email, saltate questo capitolo. | ||
Adesso bisogna inserire lo user e la password per l'autenticazione con il server SMTP esterno. | Adesso bisogna inserire lo user e la password per l'autenticazione con il server SMTP esterno. | ||
vi /etc/postfix/sasl_password | # vi /etc/postfix/sasl_password | ||
All'interno di questo file, scrivere l'indirizzo host, come specificato in relayhost del file main.cf, seguito dallo user:password validi per l'autenticazione con tale host. | All'interno di questo file, scrivere l'indirizzo host, come specificato in relayhost del file main.cf, seguito dallo user:password validi per l'autenticazione con tale host. | ||
Riga 282: | Riga 290: | ||
Generiamo il postfix lookup table, con il seguente comando: | Generiamo il postfix lookup table, con il seguente comando: | ||
postmap hash:/etc/postfix/sasl_password | # postmap hash:/etc/postfix/sasl_password | ||
Verifichiamo che la table sia stata creata correttamente con il seguente comando: | Verifichiamo che la table sia stata creata correttamente con il seguente comando: | ||
postmap -q mail.191.biz /etc/postfix/sasl_password | # postmap -q mail.191.biz /etc/postfix/sasl_password | ||
Adesso, per ragioni di sicurezza, possiamo cancellare il file di generazione: | Adesso, per ragioni di sicurezza, possiamo cancellare il file di generazione: | ||
rm /etc/postfix/sasl_password | # rm /etc/postfix/sasl_password | ||
=== Verifica invio all'esterno delle email === | === Verifica invio all'esterno delle email === | ||
Riavviamo il servizio postfix | Riavviamo il servizio postfix | ||
service postfix reload | # service postfix reload | ||
Inviare un'email test a una propria casella email: | Inviare un'email test a una propria casella email: | ||
Riga 299: | Riga 307: | ||
Verificare i log per eventuali problemi: | Verificare i log per eventuali problemi: | ||
tail -f /var/log/mail.log | # tail -f /var/log/mail.log | ||
Riga 309: | Riga 317: | ||
== Configuriamo Dovecot == | == Configuriamo Dovecot == | ||
Prima di creiamo/modifichiamo il file: | Prima di creiamo/modifichiamo il file: | ||
vi /etc/dovecot/dovecot-sql.conf | # vi /etc/dovecot/dovecot-sql.conf | ||
All'interno del file scriviamo il seguente testo: | All'interno del file scriviamo il seguente testo: | ||
Riga 318: | Riga 326: | ||
user_query = SELECT '/home/vmail/%d/%n' AS home, 'maildir:/home/vmail/%d/%n' AS mail, 5000 AS uid, 5000 AS gid FROM users WHERE email='%u' AND status='ENABLE' | user_query = SELECT '/home/vmail/%d/%n' AS home, 'maildir:/home/vmail/%d/%n' AS mail, 5000 AS uid, 5000 AS gid FROM users WHERE email='%u' AND status='ENABLE' | ||
Si intuisce dalla sintassi che %u rappresenta l'indirizzo email completo (test@miazienda.it), %d il dominio (miazienda.it), %n il nome (test). | Si intuisce dalla sintassi che %u rappresenta l'indirizzo email completo (test@miazienda.it), %d il dominio (miazienda.it), %n il nome (test). | ||
NB: lo user "postfix" e relativa password sono relativi all'utente del database che hai definito con il comando "GRANT ..." nel capitolo precedente [[Server_mail_base:_Postfix_Dovecot_e_MySql#Creazione_del_database]] | |||
Adesso impostiamo il file di configurazione | Adesso impostiamo il file di configurazione | ||
vi /etc/dovecot/dovecot.conf | # vi /etc/dovecot/dovecot.conf | ||
con questi principali parametri: | con questi principali parametri: | ||
Riga 357: | Riga 367: | ||
=== Postfix === | === Postfix === | ||
A questo punto facciamo qualche prova per vedere se tutto funziona. Avviamo Postfix e controlliamo i messaggi nel file di log: | A questo punto facciamo qualche prova per vedere se tutto funziona. Avviamo Postfix e controlliamo i messaggi nel file di log, con i seguenti due comandi: | ||
service postfix start | # service postfix start | ||
tail -f /var/log/mail.log | # tail -f /var/log/mail.log | ||
Se c'è qualche problema correggiamolo interpretando i messaggi ricevuti. Per far rileggere a Postfix il file di configurazione digitiamo semplicemente postfix reload. | Se c'è qualche problema correggiamolo interpretando i messaggi ricevuti. Per far rileggere a Postfix il file di configurazione digitiamo semplicemente postfix reload. | ||
Per controllare che Postfix è installato correttamente, fate un telnet alla porta 25 di localhost (hostname dov'è installato postfix). | Per controllare che Postfix è installato correttamente, fate un telnet alla porta 25 di localhost (hostname dov'è installato postfix). | ||
# telnet localhost 25 | |||
Se tutto va bene, dovreste leggere un messaggio di benvenuto simile a questo: | Se tutto va bene, dovreste leggere un messaggio di benvenuto simile a questo: | ||
Trying 127.0.0.1... | Trying 127.0.0.1... | ||
Riga 376: | Riga 386: | ||
=== Server imap === | === Server imap === | ||
Da terminale dare il comando | Da terminale dare il comando | ||
telnet localhost imap | # telnet localhost imap | ||
se compare una scritta del tipo: | se compare una scritta del tipo: | ||
Riga 399: | Riga 409: | ||
=== Inviamo un'email di prova === | === Inviamo un'email di prova === | ||
A questo punto il funzionamento di base è testato non resta che cominciare ad inviare qualche email al server, sia all'account reale che all'alias, verificandone la corretta consegna. Inizialmente proviamo in locale con il comando mail: | A questo punto il funzionamento di base è testato non resta che cominciare ad inviare qualche email al server, sia all'account reale che all'alias, verificandone la corretta consegna. Inizialmente proviamo in locale con il comando mail: | ||
mail -s 'test funzionamento' test@miazienda.it | # mail -s 'test funzionamento' test@miazienda.it | ||
Dopo aver digitato il comando ''mail'' premiamo invio, poi scriviamo un messaggio di prova e con CRTL + d indichiamo che l'immissione di testo è terminata, un nuovo invio dopo "Cc:" finalizza la spedizione dell'email. | Dopo aver digitato il comando ''mail'' premiamo invio, poi scriviamo un messaggio di prova e con CRTL + d indichiamo che l'immissione di testo è terminata, un nuovo invio dopo "Cc:" finalizza la spedizione dell'email. | ||
Riga 409: | Riga 419: | ||
== Errori noti == | == Errori noti == | ||
Nei log in /var/log/mail.log ho riscontrato questo errore: | Nei log in /var/log/mail.log ho riscontrato questo errore: | ||
postfix/trivial-rewrite[1749]: warning: do not list domain | postfix/trivial-rewrite[1749]: warning: do not list domain miodominio.it in BOTH mydestination and virtual_mailbox_domains | ||
che mi impediva di inviare da locale le email al dominio virtuale | che mi impediva di inviare da locale le email al dominio virtuale miodominio.it. Questo problema è noto in quanto se Postfix trova un dominio virtuale identico al dominio della sistema, elimina l'email in quanto non sa dove destinarla. | ||
Una soluzione è assegnare domini differenti, ad esempio lasciare tutto il sistema e il database con il dominio originale e modificare in /etc/postfix/main.cf il valore di ''mydestination''; per esempio: | Una soluzione è assegnare domini differenti, ad esempio lasciare tutto il sistema e il database con il dominio originale e modificare in /etc/postfix/main.cf il valore di ''mydestination''; per esempio: | ||
mydestination = localhost | mydestination = localhost | ||
così postfix farà riferimento allo smistamento locale per ''localhost'' e poi verificherà la presenza dei domini virtuali senza trovare alcuna incongruenza | così postfix farà riferimento allo smistamento locale per ''localhost'' e poi verificherà la presenza dei domini virtuali senza trovare alcuna incongruenza | ||
== Conclusioni == | == Conclusioni == | ||
A questo punto abbiamo un server mail | A questo punto abbiamo un server mail base funzionante, ora, volendo, si potrebbero fare varie implementazioni, come, ad esempio, inserire dei controlli (virus e spam) alle email, installare e/o crearci un'interfaccia per modificare comodamente i campi del database, installare una webmail, ecc.. | ||
== Implementazioni == | |||
Aggiunta del mail scanner per il controllo delle email: '''Amavisd-new''' - fai riferimento alla guida [[Server mail: Postfix Amavisd-new Dovecot e MySql]] | |||
{{Autori | |||
|Autore=[[Utente:More|More+]] 23:37, 13 mag 2011 (CEST) | |||
}} | |||
[[Categoria:Mail server]] |