Indice dei contenuti
La possibilità di inviare e-mail con PHP è una funzionalità utilizzata da una grandissima quantità di software opensource scritto utilizzando il linguaggio di scripting più famoso del web: da phpBB a WordPress, da Joomla a Drupal, da MantisBT a MediaWiki non c'è Forum, CMS, progetto o piattaforma di lavoro collaborativo che non abbia bisogno di comunicare con i propri utenti tramite l'invio di e-mail. Senza contare, ovviamente, le necessità di qualsiasi progetto realizzato in autonomia che contempli qualsiasi sorta di registrazione, newsletter o altra interazione con gli utenti.
Il modo più semplice per inviare e-mail tramite PHP è l'utilizzo della funzione mail(), disponibile fin da PHP4 e che consente di risolvere tutto con una semplice chiamata a metodo nel seguente modo:
1 |
$result = mail($to, $subject, $message, $additional_headers, $additional_parameters); |
I parametri di configurazione relativi al server SMTP a cui connettersi per l'invio, e relativa porta da utilizzare, vanno inseriti nel php.ini, il file di configurazione generale di PHP e sono i seguenti:
1 2 3 4 5 |
mail.add_x_header "0" mail.log NULL mail.force_extra_parameters NULL SMTP "localhost" smtp_port "25" |
I valori indicati sono quelli predefiniti: per maggiori dettagli su ciascuno di essi, leggete qui.
Salta subito all'occhio una importante limitazione: non c'è infatti alcun modo per specificare un username e una password di autenticazione per il server SMTP, condizione ormai indispensabile nella quasi totalità dei server messi a disposizione dei provider italiani e internazionali, nonché assolutamente obbligatoria nel caso in cui volessimo fare uso di un server che accetti unicamente connessioni protette tramite secure layer SSL/TLS.
A conti fatti, la funzionalità nativa di PHP consente di connettersi soltanto a un server SMTP che consenta l'utilizzo senza autenticazione. La domanda, nonché il motivo per cui vi siete imbattuti in questo articolo, è dunque: come fare per risolvere questo problema? In questo articolo analizzeremo una serie di possibilità, ciascuna con i suoi pro e contro.
PHPMailer
Nel caso in cui il codice dell'applicazione PHP sia stato scritto o modificato da voi, la soluzione migliore per risolvere il problema è smettere di utilizzare le funzionalità native PHP offerte dalla funzione mail() in favore di uno strumento più potente e dotato di caratteristiche più evolute: tra i tanti presenti sul mercato mi permetto di consigliare l'ottimo PHPMailer, una libreria open-source che svolge egregiamente tutte le funzionalità collegate all'invio di e-mail tramite PHP e che non vi farà mai rimpiangere la limitatissima funzione mail().
Per installarla è sufficiente includere le sue classi nel vostro progetto mediante Composer/Packagist oppure, più tradizionalmente, scaricare l'ultima versione dal repository GitHub ed effettuare un include puntuale dell'apposita classe Autoload:
1 2 3 4 5 6 |
<?php require 'PHPMailerAutoload.php'; $mail = new PHPMailer; // your code here ?> |
Per maggiori informazioni sull'installazione e sull'utilizzo di PHPMailer vi consiglio di fare riferimento alla documentazione ufficiale.
Sendmail (Linux)
Se avete la necessità assoluta di inviare e-mail tramite la funzione mail() - ad esempio perché avete uno o più software scritti in PHP che non può farne assolutamente a meno e/o non prevede possibilità di invio alternative - il metodo più semplice è installare SendMail, un programma open-source installabile su tutte le principali distribuzioni Linux con il seguente comando:
1 |
sudo apt-get install sendmail |
e facilmente integrabile nel php.ini con la seguente riga di configurazione:
1 |
Una volta installato, SendMail può essere configurato tramite un pratico wizard testuale, accessibile digitando il comando sudo sendmailconfig , oppure modificando manualmente le impostazioni presenti nel file di configurazione /etc/mail/sendmail.conf: in entrambi i modi sarà possibile specificare eventuali credenziali per l'accesso al server, superando così le limitazioni imposte dalla funzionalità PHP nativa.
Per maggiori informazioni sul progetto SendMail consiglio di dare un'occhiata al sito ufficiale.
sSMTP e Postfix
Nel caso in cui vogliate provare un'alternativa più semplice da configurare rispetto a Sendmail potete utilizzare sSMTP, un MTA agent "minimalista" che può essere installato e configurato come un drop-in di Sendmail, ovvero facendone le veci ed ereditandone i medesimi comandi: pur avendo alcune limitazioni rispetto al fratello maggiore, sSMTP è sicuramente più facile e veloce da configurare. Per saperne di più, consigliamo di recuperare un articolo pubblicato alcuni mesi fa che parlava proprio di come configurare sSMTP per inviare E-Mail su Linux.
Viceversa, se siete alla ricerca di un servizio più potente di Sendmail potete dare un'occhiata a Postfix, un altro drop-in di Sendmail con una serie di funzionalità avanzate e parametri di sicurezza aggiuntivi rispetto al fratello minore.
Fake Sendmail (Windows)
E se non avete un sistema basato su Linux? Niente paura, potete utilizzare un metodo analogo a quello descritto nel paragrafo precedente anche su un server Windows grazie a un tool fatto apposta per emulare le funzionalità di Sendmail. Il suo nome è Fake Sendmail ed è disponibile gratuitamente a questo indirizzo. Nonostante l'autore (Byron Jones) non stia più sviluppando il progetto, l'ultima versione disponibile (realizzata con Delphi 2007 e datata 2011) funziona perfettamente su tutte le versioni principali di Windows Server, incluso Windows Server 2012 R2.
Per installare Fake Sendmail è sufficiente seguire le istruzioni descritte nel sito ufficiale: scaricate l'ultima versione del programma e scompattate l'archivio in una cartella a vostra scelta (ad es. C:\PHP\fake_sendmail\ ): aprite il file di configurazione sendmail.ini con un editor di testo e configuratelo con i parametri del servizio SMTP a cui volete connettervi:
1 2 3 4 5 6 7 |
[sendmail] smtp_server=<smtp_server_address> smtp_port=25 smtp_ssl=auto error_logfile=error.log auth_username="<SMTP_username>" auth_password="<SMTP_password>" |
Una volta fatto questo, non dovrete far altro che impostare l'apposito parametro presente nel php.ini indicando il path dell'eseguibile nel seguente modo:
1 |
sendmail_path = "C:\Programmi\PHP\fake_sendmail\sendmail.exe -t" |
Per maggiori informazioni sul parametro, consultare la documentazione ufficiale.
IMPORTANTE: Su piattaforme Windows 8, 8.1, 10 e Windows Server 2012, potrebbe essere necessario configurare l'eseguibile di Fake Sendmail in modo tale che venga eseguito dal sistema con privilegi di amministratore. Per far questo, è sufficiente fare click con il tasto destro sul file sendmail.exe e, nella tab Compatibilità, impostare la modalità di compatibilità Windows XP Service Pack 3 e attivare la checkbox Esegui come amministratore. Ricordate inoltre di aggiungere ai permessi di sicurezza della cartella gli utenti IUSR, IIS_IUSRS e/o Network Service - a seconda di come avete configurato IIS - in lettura e in scrittura.
SMTP Server interno
Se, come sopra, avete necessità di utilizzare la funzione nativa mail() e non volete utilizzare il metodo descritto in precedenza, potete sempre configurare un SMTP sul vostro ambiente locale ad uso interno, che potrete utilizzare per inviare direttamente le e-mail. Se utilizzate Windows non posso che consigliarvi hMailServer, un ottimo server SMTP open-source per Windows che abbiamo ampiamente trattato in questo articolo.
A prescindere dal Mail Server che andrete a utilizzare, il servizio dovrà essere configurato per accettare connessioni prive di autenticazione su richieste di invio provenienti dagli IP locali della vostra web farm (o, se installato sulla stessa macchina che ospita il Web Server, da localhost). In tal modo avrete un sistema "aperto" (per PHP) ma al tempo stesso sicuro, in quanto tale apertura non riguarderà eventuali accessi provenienti da IP esterni.
Conclusioni
Termina qui la nostra panoramica sulle possibili alternative alla funzione mail() di PHP: come sempre, la scelta migliore dipende unicamente dalle necessità specifiche della vostra configurazione e dalle caratteristiche dei prodotti PHP in esercizio sulla vostra macchina. La scelta di adottare librerie come PHPMailer è senz'altro la migliore quando si ha il controllo del codice sorgente, mentre la configurazione di Sendmail/Fake Sendmail è più indicata se avete installati prodotti "intoccabili" come WordPress o Joomla. Ovviamente - qualora vogliate avere il massimo controllo possibile su invii e ricezioni - la scelta di dotarvi di un SMTP server interno è senz'altro la più indicata, a patto di avere le conoscenze tecniche necessarie e disporre di un sistema sufficientemente affidabile.
Per il momento è tutto... felice invio!
One Comment on “Inviare E-Mail con PHP tramite SMTP: PHPMailer, SendMail, Fake SendMail e altri metodi Un breve tutorial che spiega come inviare messaggi di posta elettronica con PHP utilizzando SMTP autenticati: PHPMailer, SendMail, Fake SendMail e altri metodi.”