Utilizzare la funzione mail() in Php non è sempre cosi facile, poichè essa implica, se ci si trova su macchine Linux, una configurazione del servizio Postfix. Questo servizio è un pò rognoso da configurare perchè implica diverse conoscenze della rete e del protocollo smtp.

Uno dei problemi maggiormente diffuso è quello del rifiuto da parte del server smtp dell’invio della posta, perchè non viene riconosciuto il mittente che su debian/ubuntu è di solito [email protected] molti mail server rifiutano automaticamente invii da parte di utenti locali non riconosciuti.

Iniziamo installando postfix. Altrimenti non esisterebbe chi invia l’email.
sudo apt-get install postfix

Utilizziamo l’impostazione “Sito Internet”.

Successivamente scriviamo una pagina php con un form per l’invio della mail. Se volete un piccolo aiuto seguite questa guida su come inviare una mail in php.

Adesso potrebbe capitarvi che l’email non venga inviata perchè il sender non viene riconosciuto. Anche se si provvede a impostare il campo “From” sulla funzione con un’utente valido, viene comunque preso il campo (envelope-from) che identifica l’utente che ha inviato la mail. Questo blocco esiste per diminuire la ricezione di spam.

Di fatto anche con la funzione mail() c’è la possibilità di forzare questo parametro.Si aggiunge in coda ai paramentri della funzione mail il comando “-f [email protected]“.

mail($destinatario,$mail_oggetto,$messaggio,$header,"-f [email protected]");

Vediamo nel complessivo con l’aggiunta degli header.


$mail_header .= "MIME-Version: 1.0
\n";
$mail_header .= "Content-type: text/html; charset=iso-8859-1
\n";
$mail_header .= 'From: " [email protected]" < [email protected]>'. "\n";
$mail_header .= 'Reply-To: "' [email protected]" < [email protected]>' . "\n";
$mail_header .= 'Return-Path: " [email protected]" < [email protected]>';
$mail_header .= "\n";
mail($destinatario,$mail_oggetto,$messaggio,$header,"-f [email protected]");

Per essere certi che l’invio venga eseguito. Controlliamo il file di log di postfix.

Eseguiamo questo comando che ci permetterà di visualizzare a schermo le operazioni di invio.

tail -f /var/log/mail.log

Se ci si ritrova in una rete con Nat,Firewall, o semplicemente restrinzioni del nostro provider, possiamo comunque aggirare il problema di invio utilizzando SMTP esterni.

Apriamo il file di configurazione di postfix main.cf


sudo nano /etc/postfix/main.cf

Andiamo sulla riga contenente
relayhost =

Adesso a seconda del provider utilizzato per l’invio della posta inseriamo il server smtp. Se non siete sicuri di quale sia qui troverete una lista dei provider Smtp italiani. Nel nostro esempio utilizziamo out.tin.it come provider.
relayhost = out.tin.it

Riavviamo il servizio postfix.
sudo /etc/init.d/postfix restart

Riproviamo a inviare la mail dal nostro form tenendo sotto controllo i log di postfix. A questo punto dovrebbe essere tutto ok. Se il vostro provider richiede l’autentificazione tramite user e password allora il nostro lavoro non è ancora terminato.

Vi rimando alla guida successiva, sulla configurazione di smtp esterni.