CONFIGURAZIONI PC E RETI
ovvero... come abbiamo fatto dalla A alla Z.
 
HOME DOCUMENTI PROGETTI RISORSE DOMANDE ARTICOLI

 GESTIONE POSTA INTERNA ED ESTERNA
 ultimo aggiornamento: 8 aprile 2002 ore 10.40
 
 
PROBLEMATICA
gestione della posta interna e degli account Internet, in modo da avere uno smistamento in automatico delle e-mails.
 
PROGETTI
il documento è correlato al progetto PR1.
 
I VANTAGGI
1) non è necessario acquistare licenze (tipo Exchange per Windows);
2) è molto adatto per reti miste (ad esempio, se alcuni pc sono Windows e altri Linux);
3) è facilmente configurabile;
4) è possibile utilizzare un solo account di posta Internet e ricevere comunque delle e-mail personali sulle caselle di posta interna, mediante regole di smistamento;
5) il tutto puo' essere gestito con una sola connessione Internet se il collegamento viene eseguito dal server di posta;
6)gli utenti interni possono comunque spedire delle e_mails Internet indipendentemente dal fatto che la connessione Internet sia attiva: il tutto viene gestito da Postfix.

 
UN SOLO ACCOUNT DI POSTA E INDIRIZZI PERSONALIZZATI
Come è possibile ricevere posta personale su indirizzo interno se l'azienda ha un solo indirizzo di posta generale? Semplice: impostando delle regole sulla posta ricevuta.
Supponiamo, ad esempio, che un'azienda abbia solo l'indirizzo di posta internet info@azienda.it . In questo caso, di solito, cè una persona che "scarica" la posta" per tutta l'azienda, la legge, e la smista a seconda di chi è il destinatario (sempre che capisca chi è...). Nel nostro caso, invece, possiamo decidere delle regole per cui questo lavoro venga fatto in automatico dal server Linux. Ad esempio, possiamo decidere che se nell'oggetto del messaggio viene indicato il nome Mario Rossi, allora il dipendente Mario Rossi riceverà quella mail. Naturalmente, la convenzione deve essere comunicata a chi spedisce la mail. Quindi, supponiamo di scrivere questa mail:

A: info@azienda.it
Oggetto: per Mario Rossi: files richiesti
Testo: ecco i files che mi hai richiesto. Ciao. Giovanni

Dopo la spedizione, quando il server scaria la posta, la interpreta e, trovando scritto Mario Rossi nell'oggetto, la inserisce nella casella di posta interna di Mario Rossi, il quale la potrà leggere quando vuole con il suo client di posta.
Se nessuna regola di posta ricevuta sarà soddisfatta, si puo' decidere chi sarà l'utente che riceverà le emails per l'azienda.

 
COSA UTILIZZIAMO PER IL SERVER DI POSTA
Partendo da una configurazione con Postfix e l'utilizzo di POP3, come abbiamo visto nel documento relativo all'installazione di un server di posta, possiamo gestire già la posta interna. Attraverso delle modifiche ai sorgenti di Postfix, con conseguente ricompilazione e reinstallazione, al file main.cf e configurando adeguatamente fetchmail e procmail, possiamo raggiungere lo scopo che ci siamo prefissati.
Mediante fetchmail potremo scaricare la posta Internet.
Procmail ci permetterà di definire delle regole per lo smistamento ai vari utenti.
Per quanto riguarda la spedizione della posta, ci penserà direttamente Postfix, una volta che definiamo il server SMTP nel suo file di configurazione.

 
SUPPONIAMO DI AVERE UN'AZIENDA...
... il cui indirizzo di posta generale sia info@azienda.it. Nell'azienda ci sono due dirigenti che hanno il proprio indirizzo di posta Internet. Supponiamo che si chiamano Luigi Verdi e Valeria Bianchi, con indirizzi luigi.verdi@azienda.it e valeria.bianchi@azienda.it.
Il resto dei dipendenti riceverà mail solo dall'indirizzo generale dell'azienda, ossia info@azienda.it. Supponiamo che i dipendenti siano tre: Mario Rossi, Antonio Giallo e Alessandra Neri. Mario Rossi è anche la persona incaricata per la lettura della mail generale dell'azienda.

 
MODELLO DI SPEDIZIONE
Supponiamo che Mario Rossi spedisce una mail con destinarati Valeria Bianchi e un cliente esterno Giorgio Quadro. Il suo indirizzo di spedizione è mario.rossi@s_azienda.it.
Il server di posta interno riconosce che la mail ha due indirizzi, di cui uno è interno, l'altro è esterno, e "spezza in due" la mail: la parte interna viene gestita dal modulo local, mentre la mail esterna dal modulo smtp.
La mail interna arriva a Valeria con l'indirizzo originario, per cui Valeria puo' rispondere a Mario con un replay all'indirizzo interno di Mario.
La mail esterna per Giorgio Quadro viene gestita dal modulo smtp il cui codice sorgente viene modificato in modo da poter cambiare l'indirizzo interno di Mario con l'indirizzo internet info@azienda.it dell'azienda, pur mantenendo l'informazione Mario Rossi nel campo From. Questo puo' avvenire con l'inserimento nel file sender_canout della riga:
mario.rossi@s_azienda.it|Mario Rossi <info@azienda.it>
L'eventuale rispsota di Giorgio Quadro avviene come descritto nel paragrafo seguente.


 
MODELLO DI RICEZIONE
Continuando l'esempio iniziato nel paragrafo precedente, supponendo che Giorgio Quadro voglia rispondere a Mario Rossi con un replay, di fatto risponde a info@azienda.it. Con i programmi di posta attuali, comunque, il nome Mario Rossi rimane nel campo To della mail.
Il server di posta "scarica" le mail da internet attraverso uno script lanciato ad intervalli regolari che esegue fetchmail come utente postfix. Le impostazioni di procmail per l'utente postfix riconoscono che nella parte To della mail è presente il nome "Mario Rossi" e redirigono la mail all'utente mario.rossi@s_azienda.it, che quindi riceverà la mail come personale (sebbene essa sia stata mandata all'indirizzo aziendale info@azienda.it).


 
SITUAZIONE DI PARTENZA
1) Server di posta PC Linux con installato postfix (o sendmail), imap, fetchmail e procmail(nel nostro caso, il 200.200.15.1);
2) altri PC client Linux o Windows (nel nostro caso, il 200.200.15.2 e 200.200.15.3).

 
IN BREVE
1) su PC Linux (200.200.15.1) viene reinstallato Postfix;
2) vengono creati sul PC Linux gli utenti che possono utilizzare il server di posta;
3) vengono creati i files necessari a fetchmail per scaricare la posta da internet;
4) vengono creati i files necessari a procmail per smistare la posta;
3) sugli altri PC (Linux o Windows) vengono configurati gli account di posta specificando come server POP3 e SMTP il server di posta Linux (nel nostro caso, 200.200.15.1).

 
FASI
1) installazione di Imap e Postfix;
2) il file sender_canout;
3) avvio di Postfix;
4) configurazione di Fetchmail;
5) configurazione di Procmail;
6) schedulazione scarico e invio posta Internet.

 
FASE 1: INSTALLAZIONE DI IMAP E POSTFIX
L'installazione di IMAP è una delle alternative in Linux per poter utilizzare il protocollo POP3 (comune per la spedizione/ricezione di posta su Internet). Le indicazioni per installare IMAP sono contenute nel documento

Server posta interna

Per quanto riguarda Postfix, visto che dovremo eseguire dei cambiamenti al codice sorgente, occorre poi reinstallarlo (se già presente). ATTENZIONE: eseguire un salvataggio dei files contenuti nella directory /etc/postfix in modo da non doverli riscrivere di seguito!!!
Se sul sistema è presente Sendmail, occorre rimuoverlo. Se si tratta di files RPM, per la rimozione riferirsi sempre al documento presente sul questo sito (fase 2):

Server posta interna

ossia, utilizzare il comando

rpm -e <nomerpm> --nodeps

Per sapere il nome esatto dell'RPM, ad esempio per Postfix, utilizzare il comando

rpm -q postfix

Una volta deinstallato il server di posta (Postfix, Sendmail o altro), occorre recuperare il file di Postfix contenente i sorgenti di Postfix. Per questo, si puo' andare sul sito ufficiale di Postfix, selezionare Download, una "nazione", e scegliere Source da "Official NON BETA release". Salvare il file nella directory /root (quindi, come utente root) e scompattarlo con

gzip -dc <nome file> | tar -xvf -

(riferirsi al documento Metodo di installazione programmi presente su questo sito).

La modifica del codice deve essere eseguita sui files

smtp.c e smtp_proto.c

presenti in <directory_postfix_scompattato>/src/smtp.
Abbiamo dovuto inserire delle righe di codice per poter modificare l'indirizzo Replay: e From: della e-mail quando viene spedita da un utente della rete locale verso un utente Internet. Non sappiamo se è possibile ottenere lo stesso risultato senza cambiare il codice, ma le nostre ricerche di documentazione a riguardo non hanno dato un esito positivo. Alla fine abbiamo deciso che sarebbe stato piu' facile modificare il codice...
Le righe di codice aggiunte non hanno la pretesa di essere ottimali, e sono solo una possibile implementazione che risolve il problema, ma di sicuro non è l'implementazione migliore. Quindi, chi si vuole cimentare a migliorare la procedura, si faccia avanti.
Le righe di codice "agiscono" nel momento stesso in cui vengono spediti i dati via SMTP (quindi, durante la connessione), individuando i punti in cui viene definito l'indirizzo Replay To e spedito l'indirizzo From: e sostituendoli con l'indirizzo presente nel file /etc/postfix/sender_canout, che ha la seguente struttura:

<indirizzo_user_linux1>|<indirizzo da sostituire1>
<indirizzo_user_linux2>|<indirizzo da sostituire2>

quindi, due indirizzi divisi dal carattere pipe (|).
L'indirizzo deve essere modificato in modo da permettere il Replay della mail sia dai sever di posta che dagli utenti Internet che la ricevono. Se la modifica non venisse fatta, chi riceve la mail eseguirebbe il Replay ad un indirizzo non valido per Internet. Ad esempio, si ritroverebbe un indirizzo From: uguale a mario.rossi@s_azienda.it se il dominio del server di posta viene settato a "s_azienda.it". In Postfix esiste un metodo per eseguire il cambiamento dell'indirizzo From: consistente nell'utilizzo del file sender_canonical o canonical in /etc/postfix, ma la modifica viene eseguita anche sulle email dirette agli utenti locali, i quali avranno lo stesso problema per il Replay (a dire il vero, non lo avrebbero se ogni utente avesse un indirizzo proprio su Internet, configurando recipient_canonical o canonical; nel nostro esempio, invece, utilizzeremo l'indirizzo info@azienda.it per i tre utenti che non hanno un indirizzo proprio). Cambiare l'indirizzo di Replay To è poi necessario in quanto alcuni server di posta sono configurati per rigettare le emails per cui l'indirizzo di Replay To non è valido.

La versione da noi attualmente utilizzata è stata la postfix-20010228-pl05. Quindi i files indicati in questo documento si riferiscono a questa versione.
Iniziamo con il file

//##### smtp.c #####

Il codice inserito da noi, indicato con un colore piu' chiaro, sostituisce l'indirizzo Replay To.
E' necessario includere il file <stdio.h> per l'utilizzo di alcune funzioni e tipi di variabili, quali FILE:

all'inizio del file occorre quindi aggiungere la linea di codice

#include <stdio.h>

Le altre righe di codice devono essere inserite nella funzione (riferirsi alle parti piu' chiare)

static int deliver_message(DELIVER_REQUEST *request)
{
VSTRING *why;
SMTP_STATE *state;
int result;

// aggiunto da N&G
char *str_old=request->sender;
char str_tmp[200];
char str_tmp2[200];
char str_tmp3[200];
int i;
int fai_sost=0;
FILE *fi;

// controllo indirizzo nel file sender_canout (se esiste)
if(fi=fopen("/etc/postfix/sender_canout","r"))
{
while(!(feof(fi)))
{
fgets(str_tmp,200,fi);
str_tmp[strlen(strdup(str_tmp))-1]='\0';
for(i=0;i<strlen(str_tmp);i++)
{
if(str_tmp[i]=='|')
{
str_tmp2[i]='\0';
fai_sost=1;
break;
}
else
str_tmp2[i]=str_tmp[i];
}

if(fai_sost!=1)
break; // errore nel file ... esco

if(strstr(request->sender,strdup(str_tmp2)))
{
// Ok: sostituisce l'indirizzo
sprintf(str_tmp2,"%s",strstr(str_tmp,"|")+1);
// controllo se l'indirizzo è contenuto da <indir>
if(strstr(str_tmp2,"<"))
{
strcpy(str_tmp3,strstr(str_tmp2,"<")+1);
for(i=0;i<strlen(str_tmp3);i++)
if(str_tmp3[i]=='>')
{
str_tmp3[i]='\0';
break;
}
}
else
strcpy(str_tmp3,strdup(str_tmp2));

request->sender=mystrdup(str_tmp3);
fai_sost=2;
break;
}
}
fclose(fi);
}

if (msg_verbose)
msg_info("deliver_message: from %s", request->sender);

if (request->nexthop[0] == 0)
msg_fatal("empty nexthop hostname");
if (request->rcpt_list.len <= 0)
msg_fatal("recipient count: %d", request->rcpt_list.len);

/*
* Initialize. Bundle all information about the delivery request, so that
* we can produce understandable diagnostics when something goes wrong
* many levels below. The alternative would be to make everything global.
*/
why = vstring_alloc(100);
state = smtp_state_alloc();
state->request = request;
state->src = request->fp;

/*
* Establish an SMTP session and deliver this message to all requested
* recipients. At the end, notify the postmaster of any protocol errors.
* Optionally deliver mail locally when this machine is the best mail
* exchanger.
*/
if ((state->session = smtp_connect(request->nexthop, why)) == 0) {
if (smtp_errno == SMTP_OK) {
if (*var_bestmx_transp == 0)
msg_panic("smtp_errno botch");
state->status = deliver_pass_all(MAIL_CLASS_PRIVATE,
var_bestmx_transp,
request);
} else
smtp_site_fail(state, smtp_errno == SMTP_RETRY ? 450 : 550,
"%s", vstring_str(why));
} else {
debug_peer_check(state->session->host, state->session->addr);
if (smtp_helo(state) == 0)
smtp_xfer(state);
if (state->history != 0
&& (state->error_mask & name_mask(VAR_NOTIFY_CLASSES,
mail_error_masks, var_notify_classes)))
smtp_chat_notify(state);
smtp_session_free(state->session);
debug_peer_restore();
}

// aggiunto da N&G
if(fai_sost==2)
{
myfree(request->sender);
request->sender=str_old;
}

/*
* Clean up.
*/
vstring_free(why);
smtp_chat_reset(state);
result = state->status;
smtp_state_free(state);

return (result);
}


Come ulteriore chiarezza, è possibile scaricare dal sito il file smtp.c comprensivo di modifiche.
Il file completo delle modifiche puo' essere scaricato Per quanto riguarda il file

//##### smtp_proto.c #####

il codice inserito da noi, indicato con un colore piu' chiaro, sostituisce l'indirizzo From:.
E' necessario includere il file <stdio.h> per l'utilizzo di alcune funzioni e tipi di variabili, quali FILE:

all'inizio del file occorre quindi aggiungere la linea di codice

#include <stdio.h>

Le altre righe di codice devono essere inserite nella funzione (riferirsi alle parti piu' chiare)

int smtp_xfer(SMTP_STATE *state)

Per quanto riguarda questo file, riportiamo solo le righe di codice da aggiungere e una indicazione su dove aggiungerle. Si puo' comunque scaricare il file smtp_proto.c per visualizzare il file completo. Ricordiamo che il file si riferisce alla release postfix-20010228-pl05.

Tra le definizioni delle variabili inserire le seguenti (solo quelle piu' chiare):

...
SOCKOPT_SIZE optlen = sizeof(sndbufsize);
int mail_from_rejected;
// inserito da N&G
int i;
char str_tmp[200];
char str_tmp2[200];
char str_tmp3[200];
FILE *fi;
int fai_sost=1; //controllo sostituzione solo una volta
...

Cercare poi il ciclo while (attenzione. sempre nella funzione smtp_xfer!!!) che contiene l'istruzione rec_get, ed inserire sempre le righe indicate piu' in chiaro

while ((rec_type = rec_get(state->src, state->scratch, 0)) > 0) {
// aggiunto da N&G: routine sostituzione indirizzo
if(strncmp(state->scratch->vbuf.data,"From:",5)==0)
{
if((fai_sost)&&(fi=fopen("/etc/postfix/sender_canout","r")))
{
for(i=0;i<200;i++)
{
if(state->scratch->vbuf.data[i]=='\0')
{
str_tmp3[i]='\0';
break;
}
else
str_tmp3[i]=state->scratch->vbuf.data[i];
}

while(!(feof(fi)))
{
fgets(str_tmp,200,fi);
str_tmp[strlen(strdup(str_tmp))-1]='\0';
for(i=0;i<strlen(str_tmp);i++)
{
if(str_tmp[i]=='|')
{
str_tmp2[i]='\0';
fai_sost=2;
break;
}
else
str_tmp2[i]=str_tmp[i];
}

if(fai_sost!=2)
break;

if(strstr(str_tmp3,strdup(str_tmp2)))
{
// Ok: sostituisce l'indirizzo
sprintf(str_tmp2,"From: %s",strstr(str_tmp,"|")+1);
vstring_strncpy(state->scratch,str_tmp2,state->scratch->vbuf.len);
break;
}
}
fclose(fi);
}
fai_sost=0;
}

if(strncmp(state->scratch->vbuf.data,"Disposition-Notification-To:",28)==0)
{
sprintf(str_tmp2,"Disposition-Notification-To: %s",strndup(request->sender,100));

msg_warn(str_tmp2);
vstring_strncpy(state->scratch,str_tmp2,state->scratch->vbuf.len);

}
...

Una volta eseguite le modifiche e salvati i files, occorre ricompilare Postfix.
Prima di fare questo, inseriamo l'utente postfix tramite il comando
useradd postfix
e gli assegnamo una password con il comando
passwd postfix
Entriamo poi nella directory
cd <directory_postfix_scompattato>/
e lanciamo il comando
make
Se il comando non va a buon fine (i messaggi finiscono con Error), allora è necessario individuare la causa,che potrebbe essere una delle due:
a) mancano delle librerie o dei programmi per la compilazione in C dei files;
b) vi sono degli errori di linguaggio C nel codice inserito nei files.
Per quanto riguarda il caso a), nei messaggi sono comunque indicati i programmi e le librerire mancanti, che devono quindi essere installati prima di rilanciare make. Di solito queste librerie o programmi sono contenuti nella propria distribuzione Linux. Quindi, basta prendere il CD contenente i files di installazione richiesti e installarli.
Il caso b) viene individuato invece con l'indicazione dei files e della riga relativa in cui vi è l'errore. Per chi non conosce il C, l'unica cosa da fare e' riguardarsi bene i files indicati in questo sito (che sono stati provati e quindi corretti dal punto di vista del C) e correggere gli errori.

Prima di lanciare il comando di installazione, verificate di avere una copia dei files contenuti in /etc/postfix se la versione attuale sostituisce una versione di Postfix precedentemente installata!!!
Una volta che il comando make va a buon termine, occorre lanciare il comando
make install
Verranno chieste delle informazioni sulle directory in cui verrà installato Postfix e sulle directory utilizzate da Postfix: se non ci sono delle esigenze particolari, e non si vogliono reimpostare quelle precedentemente utilizzate, quelle predefinite vanno benissimo!!!
Dopo aver eseguito l'installazione, occorre adattare il file main.cf alla propria configurazione. Se si è precedentemente salvato il proprio main.cf, basta sostituire il nuovo main.cf con quello salvato e adattare i percorsi delle directory alla configurazione scelta in make install. Occorre anche copiare gli eventuali files rimanenti salvati in precedenza, e rilanciare newaliases se necessario.
Al file main.cf deve essere aggiunto il parametro
relayhost=smtp.azienda.it
essendo nel nostro esempio "smtp.azienda.it" il server per la spedizione della mail internet fornitoci dal provider Internet.
Nel nostro esempio il file main.cf contiene i seguenti parametri:
# INTERNET HOST AND DOMAIN NAMES
myhostname = interno.s_azienda.it
mydomain = s_azienda.it

# SENDING MAIL
myorigin = $mydomain
di modo che gli indirizzi di posta interna sono pari a <nome_utente>@s_azienda.it
In una configurazione di default, il file "postfix" viene posizionato in /usr/sbin. Per eseguire un check dell'installazione occorre lanciare il comando
/usr/sbin/postfix check
e leggere qual e' il risultato. A noi ha dato delle indicazioni sulla non appartenenza all'utente postfix/gruppo postfix dei files contenuti in /var/spool/postfix. Per risolvere il problema abbiamo lanciato il comando
cd /var/spool/postfix
chown -R postfix.postfix *


 
FASE 2: IL FILE SENDER_CANOUT
Ricordiamo che il file "sender_canout" è stato introdotto da noi ed è gestibile tramite Postfix solo se vengono eseguite le modifiche al codice come indicato nella fase 1 in questo documento.
Attraverso il file "sender_canout" è possibile modificare le informazioni riguardanti il Repaly To e il From: che vengono inviate al server SMTP (server di invio della posta Internet). In questo modo, i server su cui la mail transiterà riconoscerà l'indirizzo come valido, in quanto indirizzo di Internet.
Inoltre, chi riceverà la mail e vorrà rispondere alla stessa, si ritroverà impostato un indirizzo Internet valido.
Ad esempio, senza l'impostazione di sender_canout, se Mario Rossi spedisse una mail a redazione@retelinux.com, la mail non potrebbe arrivare, in quanto i server di posta di katamail la rifiuterebbero. Infatti, ai server di katamail arriverebbe una mail con Replay To pari a mario.rossi@s_azienda.it, verificherebbe l'esistenza di un dominio s_azienda.it in Internet e, non trovandolo, cancellerebbe la mail (chiaramente neanche avvisando il mittente, che sarebbe appunto mario.rossi@s_azienda.it, quindi non esitente in Internet).
Altri server invece accetterebbero la mail (ad esempio quelli della tin), e a noi arriverebbe la mail dal dott. Mario. Ma se noi facessimo un "Rispondi", l'indirizzo di risposta sarebbe mario.rossi@s_azienda.it; quindi, non essitendo, ci tornerebbe indietro un avviso di mancata consegna della mail, e non potremmo in qualche modo rispondere la mittente, se lo stesso non avesse inserito il proprio indirizzo nel testo della mail.
Mario Rossi potrebbe impostare il proprio indirizzo di risposta Internet valido, o lo potremmo fare noi configurando il file sender_canonical in /etc/postfix, ma nel nostro esempio vi sarebbe un problema per quanto riguarda la posta interna. Infatti, se Mario Rossi mandasse una mail a antonio.giallo con indirizzo impostato a info@azienda.it, Antonio riceverebbe la mail, ma nel momento in cui volesse rispondere la mail sarebbe indirizzata ad info@azienda.it, quindi ad un indirizzo Internet e non interno. Certamente, con le regole inserite in procmail (come vedremo in seguito) in seguito Mario Rossi riceverebbe la mail, ma i passaggi sarebbero un po' inusuali.. perchè spedire una mail Internet per raggiungere un utente interno? Teniamo presente che una caratteristica che dovrebbe avere la mail interna è quella di poter ricevere subito una mail non appena spedita, e quindi non quella di aspettare magari 10 minuti in quanto la schedulazione di invio/ricezione della posta esterna Internet e' impostata con quell'interbvallo di tempo. Tra l'altro la risposta dipenderebbe anche dal programmi di mail utilizzato, e se capitasse di usarne uno che tiene solo l'indirizzo di e_mail, e quindi solo info@azienda.it ma non "Mario Rossi", Mario Rossi non riceverebbe la mail.
Per quanto riguarda l'esempio preso in esame in questo documento, il file /etc/postfix/sender_canout conterrà le seguenti righe:

luigi.verdi@s_azienda.it|dott. Luigi Verdi <luigi.verdi@azienda.it>
valeria.bianchi@s_azienda.it|ing. Valeria Bianchi <valeria.bianchi@azienda.it>
mario.rossi@s_azienda.it|dott. Mario Rossi <info@azienda.it>
antonio.giallo@s_azienda.it|dott. Antonio Giallo <info@azienda.it>
alessandra.neri@s_azienda.it|dott. Alessandra Neri <info@azienda.it>

Come vuole il nostro esempio e come abbiamo immesso nel file sender_canout, i primi due utenti hanno un indirizzo proprio internet, mentre gli ultimi tre hanno tutti info@azienda.it.
La struttura del file è semplice:
a) ogni riga si riferisce ad un utente;
b) gli indirizzi di posta interna ed esterna sono separati dal carattere pipe (|);
c) l'indirizzo di posta esterna puo' essere espresso in due modi: 1) solo indicando l'indirizzo (ad esempio, redazione@retelinux.com); 2) indicando le parole (di solito nome e cognome dell'utente) che appariranno nel campo From di chi riceve la mail e l'indirizzo tra i segni < e > (ad esempio, Natalia e Gualty <redazione@retelinux.com>).

 
FASE 3: AVVIO DI POSTFIX
A questo punto è possibile avviare il server Postfix, mediante il comando
/usr/sbin/postfix start
(sempre che postfix sia in /usr/sbin, naturalmente).
Se il server non parte, è possibile controllare i files errors, warnings e info presenti in /var/log/mail, in modo da scoprirne la causa.
Ricordiamo che ad ogni modifica di main.cf deve essere lanciato il comando
/usr/sbin/postfix reload
e che per fermare il server si utilizza il comando
/usr/sbin/postfix stop
Se vengono eseguite altre modifiche al codice, viene ricompilato e viene lanciato di nuovo make install, non è necessario riavviare il server di posta.
Se si vuole l'avvio in automatico del server di posta Postfix all'avvio del sistema, basta inserire in /etc/rc.local la riga /usr/sbin/postfix start.

 
FASE 4: CONFIGURAZIONE DI FETCHMAIL
Per scaricare la posta da Internet è possibile utilizzare il programma fetchmail.
Stabiliamo che l'utente Postfix scarichi la posta per tutti. Quindi sara' necessario creare il file nascosto
.fetchmailrc nella sua home directory. Ricordiamo che è possibile da root "diventare" postfix con il comando
su postfix
che è possibile accedere velocemente alla home directory con il comando
cd
(solo cd senza nient'altro)
e che è possibile visualizzare i files nascosti con il comando
ls -a
Il file .fetchmailrc conterrà le informazioni riguardanti il server di posta da cui si scarica la mail, l'userid e password per collegarsi a tale server e l'utente a cui vengono indirizzate le e-mail scaricate.
Per quanto riguarda il nostro esempio, Luigi Verdi (luigi.verdi@azienda.it) e Valeria Bianchi (valeria.bianchi@azienda.it) riceveranno le e-mails direttamente nella loro casella di posta, mentre l'utente postfix riceverà la posta relativa all'indirizzo info@azienda.it, e poi provvederà a smistarla mediante procmail.
Ecco come potrebbe essere nel nostro esempio il file .fetchmairc:

poll pop.azienda.it proto POP3 user luigi.verdi is luigi.verdi here password pwluigi
poll pop.azienda.it proto POP3 user valeria.bianchi is valeria.bianchi here password pw2valeria
poll pop.azienda.it proto POP3 user info is postfix here password pw56dinfo

Attenzione: non confondere "user <nome_user>" con "is <nome_utente_linux> here": il primo si riferisce all'userid per il server di posta Internet, il secondo all'user del server di posta interno Linux! Il comando da utilizzare per scaricare la posta è
fetchmail -a
e deve essere lanciato dall'utente postfix. Per essere lanciato da root, è necessario utilizzare il comando
su postfix -c 'fetchmail -a'
Nella fase 6 inseririremo questo comando in una politica di schedulazione temporale, di modo che venga lanciato periodicamente in automatico.
Il file .fetchmailrc deve avere settati i permessi in questo modo:
chmod 0710 .fetchmailrc
Ricordiamo che, se si è eseguito su postfix da root, per ritornare root occorre lanciare il comando exit

 
FASE 5: CONFIGURAZIONE DI PROCMAIL
Attraverso Procmail si possono impostare delle regole per "consegnare" le mails ad un utente o ad un altro, a seconda di quali caratteristiche delle mails in arrivo vengono prese in cosiderazione. Ad esempio, si puo' decidere di indirizzare a Mario Rossi tutte le mails che contengono nel proprio oggetto la frase xxx Mario Rossi.
Le regole devono essere inserite nel file nascosto .procmailrc che deve essere creato nella home directory dell'utente che riceve le mails su cui si dovranno poi applicare le regole. Nel nostro caso, quindi, .procmailrc deve essere creato nella home directory dell'utente postfix.
Come regole, si puo' decidere che vengono instradate agli utenti le mail che hanno nel campo To: il nome e cognome dell'utente, o che contengono xxx <nome> <cognome> nell'oggetto della mail.
Per quanto riguarda il nostro esempio, inseriremo quindi le regole seguenti:

:0
* ^Subject:.*xxx Mario Rossi
!mario.rossi@s_azienda.it

:0
* ^To:.*Mario Rossi
!mario.rossi@s_azienda.it

:0
* ^Subject:.*xxx Antonio Giallo
!antonio.giallo@s_azienda.it

:0
* ^To:.*Antonio Giallo
!antonio.giallo@s_azienda.it

:0
* ^Subject:.*xxx Alessandra Neri
!alessandra.neri@s_azienda.it

:0
* ^To:.*Alessandra Neri
!alessandra.neri@s_azienda.it

Naturalmente, per Luigi Verdi e Valeria Bianchi non è necessario inserire le regole, in quanto ricevono direttamente le mails senza "passare" dall'utente postfix.

 
FASE 6: SCHEDULAZIONE SCARICO E INVIO POSTA INTERNET
Per quanto riguarda la schedulazione, l'invio di posta viene gestito da Postfix: quindi, quando la connessione Internet risulta essere attiva, Postfix "se ne accorge" e spedisce le mail dirette verso Internet.
Per quanto riguarda la lettura delle mails, si puo' decidere di eseguirla ad ogni intervallo di tempo prefissato.
Supponendo di avere una connessione Internet via modem dal server di posta, si potrebbe scrivere uno script, lanciato ad esempio ogni 5 minuti, che testa se la connessione Internet e' attiva, nel qual caso scarica la posta.
Per scaricare la posta, come visto nella fase 4, occorre utilizzare il comando fetchmail -a. Per temporizzare gli eventi, si potrebbe utilizzare crontab. Inoltre, si puo' decidere di eseguire lo scarico dei messaggi non appena si attiva la connessione ad Internet.
Lo script di controllo connessione e di scarico della posta potrebbe essere il seguente:

#!/bin/bash
TEST1=`/sbin/ifconfig|grep ppp0`
if [ "$TEST1" = "" ] ; then
echo "connessione non attiva"
exit 0;
else
su postfix -c 'fetchmail -a'
fi
exit 0;

Attenzione: rispettare gli spazi nel file bash!
Chiamiamo il file scarico_posta e salviamolo nella directory /etc/ppp(ad esempio). Quindi, diamogli i permessi di esecuzione con
cd /etc/ppp
chmod 0770 scarico_posta

Occorre poi schedulare l'esecuzione di scarico_posta ogni 5 minuti. Per far questo, eseguiamo da root
crontab -e

ed editiamo il file immettendo la riga

MAILTO=""
*/5 * * * * /etc/ppp/scarico_posta

Con MAILTO si disattiva l'invio di una mail contenente il risultato delle operazioni (evitando cosi' a root di ricever una mail ogni 5 minuti!).
Per eseguire lo scarico ad ogni connessione basta inserire il comando su postfix -c 'fetchmail -a' di scarico della posta nel file ip-up.local in /etc/ppp (se non e' presente, occorre crearlo e dargli i permessi di esecuzione).

 
DOCUMENTI CORRELATI
SERVER DI POSTA INTERNA
PROGETTO PR1
RIFERIMENTI
www.postfix.org
www.tuxedo.org/%7Eesr/fetchmail/index.html
www.procmail.org
www.ii.com/internet/robots/procmail/qs
members.tripod.com/~tizianof/come/postalinux.html
CAMBIAMENTI
--. 4 aprile 2002 10.40: correzione errore nel codice in smtp.c
--. 21 novembre 2001 10.20: correzione errore nel codice downloadabile in smtp_proto.c, segnalato da Alessandro Scapuzzi
--. 6 novembre 2001 15.05: correzione errore nel codice (stdio.h al posto di studio.h), segnalato da Michele Nasoni
--. 25 ottobre 2001 16.00: inserimento modelli di spedizione e ricezione
--. 16 ottobre 2001 11.00: cambiamento script bash scarico posta
--. 15 ottobre 2001 11.00: creazione documento
 
 
 redazione@retelinux.com