WordPress si rifiuta di inviare email, "...il tuo host potrebbe aver disabilitato la funzione mail()"
Ho recentemente implementato un'area commenti sul mio sito web e ho cercato di far funzionare le notifiche via email. Sembra che non voglia inviare notifiche via email quando vengono inseriti nuovi commenti.
Solo per verificare se PHP può inviare email, ho provato a reimpostare la password (poiché si riceve una nuova password via email), e ho ricevuto il messaggio:
L'e-mail non può essere inviata. Possibile motivo: il tuo host potrebbe aver disabilitato la funzione mail()
Ho controllato le caselle in Impostazioni -> Discussione, e l'email è valida, quindi non è un problema di impostazioni. Ho provato a creare un file PHP e inviare usando mail()
, e l'invio è avvenuto con successo. Quindi deve esserci qualcosa di strano che succede con WordPress.
Qualche idea?
Passo dopo passo: Per prima cosa trova il file in cui appare il messaggio di errore. Io uso Notepad++ e il comando CTRL + F per cercare nei file. È una buona idea cercare solo le prime parole del messaggio di errore, perché alcuni messaggi sono combinazioni di diversi messaggi.
Il tuo messaggio di errore appare in wp-login.php
e per fortuna solo lì. Quindi diamo un'occhiata al perché potrebbe verificarsi questo errore.
if ( $message && !wp_mail($user_email, $title, $message) )
Ci sono due condizioni. $message
deve essere true (non una stringa vuota, non false, non null, ecc.). E wp_mail()
non dovrebbe restituire false.
Una riga sopra, c'è un filtro $message = apply_filters('retrieve_password_message', $message, $key);
, quindi è possibile che un plugin (o tema) utilizzi questo filtro e restituisca un valore che non sia true (stringa vuota, false, null, ecc.).
Ma è molto più semplice verificare se wp_mail()
funziona o meno. Scrivi un piccolo plugin per inviarti una mail di test:
<?php
/**
* Plugin Name: Stackexchange Testplugin
* Plugin URI: http://yoda.neun12.de
* Description: Inviami una email di test
* Version: 0.1
* Author: Ralf Albert
* Author URI: http://yoda.neun12.de
* Text Domain:
* Domain Path:
* Network:
* License: GPLv3
*/
namespace WordPressStackexchange;
add_action( 'init', __NAMESPACE__ . '\plugin_init' );
function plugin_init(){
$to = 'il-tuo-indirizzo-email@qualche-dominio.tld';
$subject = 'Email di test';
$message = 'FooBarBaz La mail di test funziona';
wp_mail( $to, $subject, $message );
}
(Questo è codice PHP5.3. Se stai usando PHP5.2, rimuovi le parti relative al namespace)
Il plugin dovrebbe inviare una mail di test immediatamente dopo l'attivazione. In caso contrario, accedere ad alcune pagine di backend (es. la dashboard) dovrebbe farlo.
Se la mail di test non arriva, allora probabilmente hai un problema con wp_mail()
. Quindi attiva il debug:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
@ini_set( 'display_errors',1 );
Inserisci questo codice nel tuo wp-config.php
e riprova a inviarti una mail di test. Ora dovresti ottenere alcuni messaggi di errore e questi dovrebbero essere registrati anche in wp-content/debug.log
(Il log di debug può diventare molto grande se ci sono altri errori causati da plugin e/o temi).
A questo punto, hai buone informazioni se wp_mail()
fallisce e, in caso affermativo, perché. Se wp_mail()
funziona correttamente e la mail di test è arrivata, torna all'inizio e scopri perché $message
non è true.
Se hai problemi con wp_mail()
, tieni presente che wp_mail()
non utilizza la funzione mail()
di PHP. WordPress utilizza una classe PHP (PHPMailer). Forse hai solo bisogno di un plugin per usare SMTP invece di sendmail. O il problema si trova in un altro posto. Non lo sappiamo. Devi investigare.

Sì, ho provato a scavare nel core e mi ha portato anche a PHPMailer, e in effetti utilizza la funzione mail()
di PHP. Almeno in alcuni casi (vedi riga 732 in wp-includes/class-phpmailer.php
). Al momento non ho accesso all'FTP ma proverò i tuoi suggerimenti appena possibile. Sicuramente questo mi porterà da qualche parte. Grazie mille!

Ho testato wp_mail()
e sembra funzionare bene, ho ricevuto la mail come previsto. Tuttavia WP ancora non inviava le email di commento/reset password, e non ho ricevuto nulla nel file di log (che non è stato creato), quindi ho provato a installare un plugin SMTP per la posta e ho configurato un nuovo account email per Wordpress. Ora funziona ma ancora non capisco perché prima non riuscisse a inviare. Grazie!

Questo è un messaggio di errore estremamente fastidioso perché potrebbe essere molte cose, e non rivela l'errore effettivo (che spesso viene silenziato in altre parti del codice).
Questo errore appare quando la funzione wp_mail()
restituisce false, il che a sua volta può succedere se phpmailer->Send()
restituisce false o solleva un'eccezione.
Come visualizzare i warning dalla funzione mail()
di PHP
Questi sono normalmente silenziati di default, ma sfortunatamente WordPress non li cattura mai. Per mostrarli, basta rimuovere i simboli @
da @mail(...
nel file wp-includes/class-phpmailer.php
nella funzione mailPassthru()
:
if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
$rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header);
} else {
$rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header, $params);
}
Come individuare altre possibili cause:
Aggiungi una singola riga alla fine di
wp_mail()
in/wp-includes/pluggable.php
:// Invia! try { return $phpmailer->Send(); } catch ( phpmailerException $e ) { //------------- Questa prossima riga è quella da aggiungere ------------------- if (WP_DEBUG) echo '<pre>' . esc_html(print_r($e, TRUE)) . '</pre>'; return false; }
Dumpa tutti i dettagli di dove è stata sollevata l'eccezione. Sfortunatamente a volte include questo messaggio di eccezione poco utile: "Impossibile istanziare la funzione mail". Grazie WordPress, davvero utile.
Guardando l'eccezione puoi trovare il numero di riga dell'errore, e sperabilmente risalire attraverso il codice per trovare la causa reale.
Buona fortuna. Speriamo che WordPress migliori la gestione degli errori email in futuro.

Ho avuto lo stesso problema con un server Ubuntu su Amazon EC2. Ho riscontrato problemi utilizzando il link per reimpostare la password e anche altre email di notifica non funzionavano.
Quindi ecco le soluzioni che hanno funzionato per me. WordPress utilizza la funzione wp_mail()
per inviare email, la quale necessita della classe PHPMailer
che a sua volta utilizza il mailer PHP memorizzato in /usr/sbin/sendmail
.
Per prima cosa, usa questa semplice funzione PHP per verificare il funzionamento della mail in PHP
<?php
$to = "example@gmail.com";
$subject = "Test Email Function";
$txt = "Hello world!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: xyz@example.com";
mail($to,$subject,$txt,$headers);
?>
Se questo non funziona, allora devi installare il mailer PHP. Usa questo comando per installare il mailer PHP sul server Ubuntu.
sudo apt-get install sendmail
Poi verifica le funzioni di invio email di WordPress.

Se le altre ottime risposte qui non aiutano, prova questo:
Mi sono imbattuto nello stesso problema e nulla di ciò che ho trovato tra i suggerimenti per WordPress lo ha risolto per me.
Poi ho iniziato a indagare se fosse l'installazione PHP stessa ad aver disabilitato la funzione mail, ma neanche questo ha funzionato. Tutto sembrava configurato correttamente.
Tutti questi problemi sono iniziati per me quando ho aggiornato il server a CentOS 7 che utilizza SELinux (Security Enhanced Linux) e ciò che ho imparato nelle ultime settimane con SELinux è che se qualcosa non funziona, ma tutto sembra dovrebbe funzionare... significa che SELinux ti sta bloccando silenziosamente e segretamente in background.
E voilà.
Se stai eseguendo un sistema operativo che utilizza SELinux, esegui semplicemente il seguente comando come root:
setsebool -P httpd_can_sendmail=1
C'è un'impostazione di sicurezza che impedisce intrinsecamente al webserver di inviare email. Quando attivi quell'opzione e dici a SELinux che è ok per il webserver inviare email, tutto improvvisamente funziona.

Mi sono imbattuto in questo problema oggi; nel mio caso la situazione si è verificata perché il file hosts del server aveva lo stesso nome di dominio dell'indirizzo email, puntando a localhost. Il record mx puntava a un server diverso, ma il file hosts stava sovrascrivendo il DNS e WordPress stava cercando di consegnare l'email localmente. Rimuovere il dominio dal file hosts e riavviare sendmail ha risolto il problema.

Non so se questo sia ancora rilevante per te o meno, ma visto che non è stata scelta alcuna risposta, ho pensato di fare un tentativo.
In realtà, ho affrontato esattamente lo stesso problema quando il mio host OpenShift improvvisamente ha smesso di inviare email oggi. Analizzando il codice e il codex, ho scoperto la funzione wp_mail() e alla fine Google mi ha portato qui, dove ho visto come poterla sovrascrivere.
Basandomi sulla risposta di @Ralf912, ho modificato leggermente lo script in modo che il codice utilizzi l'API web di sendgrid.com per inviare email invece di quella predefinita di WordPress (che presumo):
<?php
function sendgridmail($to, $subject, $message, $headers)
{
$url = 'https://api.sendgrid.com/';
//$user = 'yourUsername';
//$pass = 'yourPassword';
$params = array(
'api_user' => $user,
'api_key' => $pass,
'to' => $to,
'subject' => $subject,
'html' => '',
'text' => $message,
'from' => 'abc@hotmail.com',
);
$request = $url.'api/mail.send.json';
// Generate curl request
$session = curl_init($request);
// Tell curl to use HTTP POST
curl_setopt ($session, CURLOPT_POST, true);
// Tell curl that this is the body of the POST
curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
// Tell curl not to return headers, but do return the response
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
// obtain response
$response = curl_exec($session);
curl_close($session);
// print everything out
//print_r($response);
}
//only for testing:
/*$to = 'abc@yahoo.com';
$subject = 'Testemail';
$message = 'It works!!';
echo 'To is: ' + $to;
#wp_mail( $to, $subject, $message, array() );
sendgridmail($to, $subject, $message, $headers);
print_r('Just sent!');*/
if (!function_exists('wp_mail')) {
function wp_mail($to, $subject, $message, $headers = '', $attachments = array())
{
// use the PHP GnuPG library here to send mail.
sendgridmail($to, $subject, $message, $headers);
}
}
function plugin_init()
{
/* $to = 'xyz@yahoo.com';
$subject = 'Testemail';
$message = 'It works Live!';
//echo 'To is: ' + $to;
wp_mail( $to, $subject, $message, array() );
//print_r('Just sent!');*/
}
E ha funzionato!

Ho avuto lo stesso errore, entrambe le funzioni (mail e wp_mail) funzionavano, ma continuavo ad avere questo fastidioso errore. La soluzione era molto semplice, ma mi ci sono volute alcune ore per trovare la ragione. Condividerò qui la mia soluzione al problema che potrebbe essere (o non essere) lo stesso del vostro.
Ho provato la funzione mail() e funzionava, ma quando la testi non specifichi l'ultimo parametro chiamato 'parameters' nella funzione mail(). E WordPress lo utilizza.
@mail("example@exmaple.com",$title,$body,$headers,"-fexample@exmaple.com");
Quindi, fondamentalmente, questo parametro ("-fexample@exmaple.com") con il flag "-f" fa sì che la funzione mail() verifichi se l'indirizzo email "example@exmaple.com" è presente nella lista "email attendibili".
Quindi se non c'è, restituisce false, il che fa sì che wp_mail() restituisca false e porti al messaggio di errore.
La soluzione è chiedere all'hosting di farlo per voi, oppure se usate cPanel, basta aggiungere un account email per questo indirizzo e verrà automaticamente aggiunto alla "lista attendibile".

Si chiama "Gestione degli indirizzi email registrati per l'invio di email tramite script (es. WordPress)"
- Accedi al tuo cPanel.
- Vai alla sezione Email > quindi clicca su Indirizzi Email Registrati.
- Aggiungi (wordpress@tudominio.com) o dove è ospitato il tuo WordPress, ad esempio (wordpress@blog.tudominio.com). Poi invia, ci vorranno alcuni minuti per l'attivazione (aspetta da 15 minuti a 1 ora a seconda del tuo hosting provider), poi funzionerà.

Ho avuto questo errore per molto tempo e ho provato tante soluzioni che non hanno funzionato. Ho un'installazione personalizzata di WordPress su AWS EC2. Prima di tutto assicurati che la tua mail AWS SES sia abilitata tramite il supporto, devono essere nella stessa (o vicina) regione in SES e EC2.
Ho utilizzato Google Suite (gsuite) per la posta elettronica per ricevere/inviare mail.
Assicurati che l'email di test venga inviata in AWS SES e Gsuite.
Installa il plugin WordPress WP Mail SMTP, usa l'opzione "Altro SMTP", prendi le tue credenziali SMTP da AWS SES, è qui che mi sono bloccato.
Devi abilitare la casella di spunta "SSL" per la crittografia, questo cambia la porta in 465 per me. Finalmente il mio test email è stato inviato con successo da WordPress.

Ho risolto questo problema modificando l'"Email del mittente" nel mio ambiente di test locale, cambiandola da wordpress@localhost a wordpress@localhost.localdomain, ad esempio utilizzando un plugin WordPress come "WP Mail SMTP" e selezionando il mailer PHP predefinito invece di utilizzare SMTP.
Il problema si verificava anche con tutti gli altri plugin disabilitati e non avevo riscontrato questo problema in passato. Il problema inoltre non è presente quando si utilizza direttamente la funzione PHP mail, quindi forse è accaduto a causa di una recente modifica di WordPress.
Ho inviato e ricevuto email sul mio computer locale utilizzando Postfix.
