Sebbene ci siano parti di questa risposta che si applicano solo all'utilizzo dimail()
funzione stessa, molti di questi passaggi per la risoluzione dei problemi possono essere applicati a qualsiasi sistema di posta PHP.
Esistono diversi motivi per cui il tuo script sembra non inviare e-mail. È difficile diagnosticare queste cose a meno che non ci sia un evidente errore di sintassi. Senza uno è necessario scorrere l'elenco di controllo qui sotto per trovare eventuali insidie che potresti incontrare.
Assicurarsi che la segnalazione errori sia abilitata e impostata per segnalare tutti gli errori
La segnalazione degli errori è essenziale per eliminare i bug nel codice e gli errori generali riscontrati da PHP. La ricezione degli errori deve essere abilitata per ricevere questi errori. Posizionare il seguente codice nella parte superiore dei file PHP (o in un file di configurazione principale) consentirà la segnalazione degli errori.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
Vedi Come posso ottenere utili messaggi di errore in PHP? - questa risposta per maggiori dettagli al riguardo.
Assicurarsi che la mail()
funzione sia chiamata
Può sembrare sciocco ma un errore comune è dimenticare di inserire effettivamente la mail()
funzione nel codice. Assicurati che sia lì e non commentato.
Assicurarsi che la mail()
funzione sia chiamata correttamente
bool mail (stringa $ a, stringa $ oggetto, stringa $ messaggio [, stringa $ additional_headers [, stringa $ additional_parameters]])
La funzione mail accetta tre parametri richiesti e, facoltativamente, un quarto e un quinto. Se la tua chiamata a mail()
non ha almeno tre parametri fallirà.
Se la tua chiamata a mail()
non ha i parametri corretti nell'ordine corretto, fallirà anche.
Controlla i log di posta del server
Il tuo server web dovrebbe registrare tutti i tentativi di invio di e-mail attraverso di esso. La posizione di questi registri varierà (potrebbe essere necessario chiedere all'amministratore del server dove si trovano) ma è possibile trovarli comunemente nella directory principale di un utente in logs
. All'interno ci saranno messaggi di errore segnalati dal server, se presenti, relativi ai tuoi tentativi di invio di e-mail.
Verificare la connessione alla porta non riuscita
Il blocco delle porte è un problema molto comune che la maggior parte degli sviluppatori deve affrontare mentre integra il proprio codice per recapitare le e-mail tramite SMTP. E questo può essere facilmente rintracciato nei maillog del server (la posizione del server del registro di posta può variare da server a server, come spiegato sopra). Nel caso in cui ci si trovi su un server di hosting condiviso, le porte 25 e 587 rimangono bloccate per impostazione predefinita. Questo blocco è stato fatto di proposito dal tuo provider di hosting. Questo è vero anche per alcuni server dedicati. Quando queste porte sono bloccate, prova a connetterti utilizzando la porta 2525. Se trovi che anche quella porta è bloccata, l'unica soluzione è contattare il tuo provider di hosting per sbloccare queste porte.
La maggior parte dei provider di hosting blocca queste porte e-mail per proteggere la propria rete dall'invio di e-mail di spam.
Utilizzare le porte 25 o 587 per connessioni semplici / TLS e la porta 465 per connessioni SSL. Per la maggior parte degli utenti, si consiglia di utilizzare la porta 587 per evitare limiti di velocità stabiliti da alcuni provider di hosting.
Non utilizzare l'operatore di soppressione degli errori
Quando l' operatore di soppressione degli errori@
viene anteposto a un'espressione in PHP, tutti i messaggi di errore che potrebbero essere generati da tale espressione verranno ignorati. Ci sono circostanze in cui è necessario l'uso di questo operatore ma l'invio di posta non è uno di questi.
Se il tuo codice contiene, @mail(...)
potresti nascondere importanti messaggi di errore che ti aiuteranno a eseguire il debug. Rimuovere il @
e vedere se vengono segnalati errori.
È consigliabile solo quando si verificaerror_get_last()
subito dopo la presenza di guasti concreti.
Controlla il mail()
valore di ritorno
La mail()
funzione:
Restituisce TRUE
se la posta è stata accettata correttamente per la consegna, FALSE
altrimenti. È importante notare che solo perché la posta è stata accettata per la consegna, NON significa che la posta raggiungerà effettivamente la destinazione prevista.
Questo è importante notare perché:
- Se ricevi un
FALSE
valore di ritorno, sai che l'errore risiede nel fatto che il tuo server accetta la tua posta. Questo probabilmente non è un problema di codifica ma un problema di configurazione del server. Devi parlare con l'amministratore di sistema per scoprire perché ciò sta accadendo.
- Se ricevi un
TRUE
valore di ritorno, ciò non significa che la tua email verrà sicuramente inviata. Significa semplicemente che l'email è stata inviata con successo al rispettivo gestore sul server da PHP. Esistono ancora più punti di errore al di fuori del controllo di PHP che possono impedire l'invio dell'e-mail.
Quindi, FALSE
vi aiuterà a puntare nella giusta direzione, mentre TRUE
non non necessariamente significa che il vostro email è stata inviata con successo. Questo è importante da notare!
Assicurati che il tuo provider di hosting ti consenta di inviare e-mail e non limiti l'invio di e-mail
Molti webhost condivisi, in particolare i provider di web hosting gratuiti, non consentono l'invio di e-mail dai loro server o limitano l'importo che può essere inviato durante un determinato periodo di tempo. Ciò è dovuto ai loro sforzi per impedire agli spammer di usufruire dei loro servizi più economici.
Se ritieni che il tuo host abbia limiti di email o blocchi l'invio di email, controlla le loro FAQ per vedere se elencano tali limitazioni. In caso contrario, potrebbe essere necessario contattare il loro supporto per verificare se esistono restrizioni in merito all'invio di e-mail.
Controlla le cartelle spam; impedire che le e-mail vengano contrassegnate come spam
Spesso, per vari motivi, le e-mail inviate tramite PHP (e altri linguaggi di programmazione lato server) finiscono nella cartella spam di un destinatario. Controlla sempre lì prima di risolvere il codice.
Per evitare che la posta inviata tramite PHP venga inviata alla cartella spam di un destinatario, ci sono varie cose che puoi fare, sia nel tuo codice PHP che in altro modo, per ridurre al minimo le possibilità che le tue e-mail vengano contrassegnate come spam. I buoni consigli di Michiel de Mare includono:
- Utilizzare metodi di autenticazione e-mail, come SPF e DKIM per dimostrare che le e-mail e il nome del dominio appartengono insieme e per impedire lo spoofing del nome del dominio. Il sito Web SPF include una procedura guidata per generare le informazioni DNS per il tuo sito.
- Controlla il tuo DNS inverso per assicurarti che l'indirizzo IP del tuo server di posta punti al nome di dominio che usi per inviare la posta.
- Assicurati che l'indirizzo IP che stai utilizzando non sia su una lista nera
- Assicurarsi che l'indirizzo di risposta sia un indirizzo valido ed esistente.
- Utilizza il nome reale completo del destinatario nel campo A, non solo l'indirizzo e-mail (ad es
"John Smith" <john@blacksmiths-international.com>
.).
- Monitora i tuoi account sugli abusi, come abuse@tuodominio.com e postmaster@tuodominio.com. Ciò significa: assicurati che questi account esistano, leggi cosa viene loro inviato e agisci in caso di reclami.
- Infine, lo rendono davvero facile da annullare l'iscrizione. Altrimenti, i tuoi utenti annulleranno l'iscrizione premendo il pulsante spam e ciò influenzerà la tua reputazione.
Vedi Come assicurarti che le email che invii a livello di codice non vengano automaticamente contrassegnate come spam? per ulteriori informazioni su questo argomento.
Assicurati che siano fornite tutte le intestazioni della posta
Alcuni software di spam rifiuteranno la posta se mancano le intestazioni comuni come "Da" e "Rispondi a":
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
Assicurarsi che le intestazioni della posta non presentino errori di sintassi
Le intestazioni non valide sono altrettanto dannose di non avere intestazioni. Un carattere errato potrebbe essere tutto ciò che serve per far deragliare la tua email. Ricontrolla per assicurarti che la sintassi sia corretta poiché PHP non rileverà questi errori per te.
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
Non usare un From:
mittente falso
Mentre la posta deve avere un mittente From: non puoi semplicemente usare qualsiasi valore. In particolare, gli indirizzi mittente inviati dall'utente sono un modo infallibile per bloccare la posta:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
Motivo: il tuo server di posta web o di invio non è autorizzato dalla SPF / DKIM a far finta di essere responsabile degli indirizzi @hotmail o @gmail. Potrebbe anche eliminare silenziosamente le e-mail con From:
domini mittente per i quali non è configurato.
Assicurarsi che il valore del destinatario sia corretto
A volte il problema è semplice come avere un valore errato per il destinatario dell'e-mail. Ciò può essere dovuto all'uso di una variabile errata.
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
Un altro modo per testarlo è codificare il valore del destinatario nella mail()
chiamata di funzione:
mail('user@example.com', $subject, $message, $headers);
Questo può applicarsi a tutti i mail()
parametri.
Invia a più account
Per aiutare a escludere i problemi relativi agli account e-mail, invia la tua e-mail a più account e-mail presso diversi provider di posta elettronica . Se le tue e-mail non arrivano all'account Gmail di un utente, invia le stesse e-mail a un account Yahoo, un account Hotmail e un normale account POP3 (come il tuo account e-mail fornito dall'ISP).
Se le e-mail arrivano a tutti o ad alcuni degli altri account e-mail, sai che il tuo codice sta inviando e-mail, ma è probabile che il provider dell'account e-mail li stia bloccando per qualche motivo. Se l'e-mail non arriva a nessun account e-mail, è più probabile che il problema sia correlato al tuo codice.
Assicurarsi che il codice corrisponda al metodo del modulo
Se hai impostato il metodo del modulo su POST
, assicurati di utilizzare $_POST
per cercare i valori del modulo. Se è stato impostato su GET
o non è stato impostato affatto, assicurarsi di utilizzare $_GET
per cercare i valori del modulo.
Assicurarsi che il action
valore del modulo punti nella posizione corretta
Assicurati che l' action
attributo del modulo contenga un valore che punta al tuo codice postale PHP.
<form action="send_email.php" method="POST">
Assicurarsi che l'host Web supporti l'invio di e-mail
Alcuni provider di hosting Web non consentono o abilitano l'invio di e-mail attraverso i loro server. I motivi di ciò possono variare, ma se hanno disabilitato l'invio di posta sarà necessario utilizzare un metodo alternativo che utilizza una terza parte per inviare tali e-mail.
Un'e-mail al loro supporto tecnico (dopo un viaggio al loro supporto online o FAQ) dovrebbe chiarire se le funzionalità e-mail sono disponibili sul tuo server.
Assicurarsi che il localhost
server di posta sia configurato
Se stai sviluppando sulla tua workstation locale usando WAMP, MAMP o XAMPP, probabilmente sulla tua workstation non è installato un server di posta elettronica. Senza uno, PHP non può inviare la posta per impostazione predefinita.
È possibile superare questo installando un server di posta di base. Per Windows è possibile utilizzare la Mercury Mail gratuita .
Puoi anche utilizzare SMTP per inviare le tue e-mail. Guarda questa fantastica risposta di Vikas Dwivedi per imparare a farlo.
Abilita personalizzato di PHP mail.log
Oltre al file di registro di MTA e PHP, è possibile abilitare in modo specifico la registrazione per la mail()
funzione . Non registra l'interazione SMTP completa, ma almeno i parametri di chiamata delle funzioni e lo script di invocazione.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
Vedi http://php.net/manual/en/mail.configuration.php per i dettagli. (È meglio abilitare queste opzioni nel php.ini
o .user.ini
o .htaccess
forse.)
Verificare con un servizio di test della posta
Esistono vari servizi di consegna e controllo dello spam che è possibile utilizzare per testare la configurazione del proprio MTA / server web. In genere si invia un probe di posta a: il loro indirizzo, quindi si ottiene un rapporto di consegna e ulteriori errori o analisi concrete in seguito:
Usa un altro mailer
La mail()
funzione integrata di PHP è utile e spesso fa il lavoro ma ha i suoi difetti . Fortunatamente ci sono alternative che offrono maggiore potenza e flessibilità, inclusa la gestione di molti dei problemi sopra descritti:
Tutto ciò può essere combinato con un server SMTP / fornitore di servizi professionale. (Perché i tipici piani di webhosting 08/15 condivisi sono incerti o meno quando si tratta di impostazione / configurabilità della posta elettronica.)