WordPress rifiuta di inviare posta, "... il tuo host potrebbe aver disabilitato la funzione mail ()"


9

Di recente ho implementato un'area di commento sul mio sito Web e ho cercato di far funzionare la notifica e-mail. Non sembra voler inviare notifiche e-mail quando vengono fatti nuovi commenti.

Solo per vedere se PHP può inviare e-mail, ho provato a reimpostare la password (perché otterrai una nuova password via mail) e ho ricevuto il messaggio:

Non è stato possibile inviare l'e-mail. Possibile motivo: l'host potrebbe aver disabilitato la funzione mail ()

Ho selezionato le caselle di controllo in Impostazioni -> Discussione e l'e-mail è valida, quindi non è un problema di impostazione. Ho provato a creare un file PHP e inviarlo utilizzando mail()e ha inviato correttamente. Quindi ci deve essere qualcosa di strano in WordPress.

Qualche idea?


Risposte:


9

Passo dopo passo: trova prima il file in cui appare il messaggio di errore. Uso Notepad ++ e il comando CTRL+ Fper cercare nei file. È una buona idea cercare solo le prime parole del messaggio di errore, poiché alcuni messaggi di errore sono combinati con messaggi diversi.

Il tuo messaggio di errore appare wp-login.phpe buona fortuna, solo lì. Quindi diamo un'occhiata al motivo per cui questo errore potrebbe verificarsi.

if ( $message && !wp_mail($user_email, $title, $message) )

Vi sono due condizioni. $messagedeve essere vero (non una stringa vuota, non falsa, non nulla, 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) usi questo filtro e restituisca un valore che non è vero (stringa vuota, falso, null, ecc.).

Ma è molto più facile controllare se wp_mail()funziona o no. Scrivi un piccolo plug-in per inviare una mail di prova a te stesso:

<?php
/**
 * Plugin Name: Stackexchange Testplugin
 * Plugin URI:  http://yoda.neun12.de
 * Description: Send me a test email
 * 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      = 'your-email-adress@some-domain.tld';
    $subject = 'Testemail';
    $message = 'FooBarBaz Testmail is working';

    wp_mail( $to, $subject, $message );
}

(Questo è il codice PHP5.3. Se stai eseguendo PHP5.2, rimuovi le cose dello spazio dei nomi)

Il plugin dovrebbe inviare un testmail immediatamente dopo l'attivazione. In caso contrario, chiamare alcune pagine di back-end (ad esempio dashboard) dovrebbe farlo.

Se testmail 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.phpe riprova inviandoti un testmail. Ora dovresti ricevere alcuni messaggi di errore e anche loro dovrebbero essere registrati wp-content/debug.log(il registro di debug può diventare molto grande se ci sono più errori causati da plugin e / o temi).

A questo punto, hai buone informazioni se wp_mail()fallisce e, in tal caso, perché. Se wp_mail()funziona correttamente e testmail è arrivato, torna all'inizio e scopri perché $messagenon è vero.

In caso di problemi wp_mail(), tieni presente che wp_mail()non utilizza la mail()funzione 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.


Si ho provato scavare nel nucleo e anche mi portano a PHPMailer, e in realtà lo fa uso di php mail(). Almeno in alcuni casi (vedere la riga 732 in wp-includes/class-phpmailer.php. Non ho accesso al ftp atm ma cercherò i tuoi suggerimenti appena posso. Sicuramente questo deve portarmi da qualche parte. Grazie mille!
qwerty

Ho provato wp_mail()e sembra funzionare bene, ho ricevuto la posta come previsto. Tuttavia, WP non avrebbe inviato le e-mail di commento / reimpostazione della password e non ho ricevuto nulla nel file di registro (non è stato creato), quindi ho provato a installare un plug-in di posta SMTP e impostare un nuovo account di posta elettronica per Wordpress. Funziona ora ma ancora non capisco perché non sia stato possibile inviare prima. Grazie!
qwerty

Non ricevo alcun errore e nemmeno la posta
baldraider il

2

Questo è un messaggio di errore super fastidioso in quanto potrebbe essere molte cose e non rivela l'errore reale (che è spesso messo a tacere in altre parti del codice).

Questo errore appare quando la wp_mail()funzione restituisce false, che a sua volta potrebbe verificarsi se phpmailer->Send()restituisce false o genera un'eccezione.


Come visualizzare gli avvisi dalla mail()funzione di PHP

Questi sono normalmente messi a tacere di default, ma sfortunatamente WordPress non li cattura mai. Per mostrarli, è sufficiente rimuovere i @segni da @mail(...dentro wp-includes/class-phpmailer.phpnella mailPassthru()funzione:

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 dare la caccia ad altre possibili cause:

  1. Aggiungi una riga alla fine di wp_mail()in /wp-includes/pluggable.php:

    // Send!
    try {
        return $phpmailer->Send();
    } catch ( phpmailerException $e ) {
        //------------- This next line is the one to add -------------------
        if (WP_DEBUG) echo '<pre>' . esc_html(print_r($e, TRUE)) . '</pre>';
        return false;
    }
  2. Scaricherà tutti i dettagli di dove è stata sollevata l'eccezione. Purtroppo a volte include questo inutile messaggio di eccezione: " Impossibile creare un'istanza della funzione di posta ". Sì grazie WordPress, è davvero utile.

  3. Osservando l'eccezione è possibile trovare il numero di riga dell'errore e si spera di poterlo rintracciare attraverso il codice per trovare la vera causa.

In bocca al lupo. Eventualmente WordPress migliora la gestione degli errori di posta elettronica in futuro.


2

Ho lo stesso problema con il server Ubuntu su Amazon EC2. Ottengo problemi durante l'utilizzo del collegamento reimposta password e anche altre e-mail di notifica non funzionavano.

Quindi ecco le soluzioni che hanno funzionato per me.Word-press ha usato la wp_mail()funzione per inviare e-mail che necessitano di una PHPMailerclasse in cui sono stati archiviati php mailer /usr/sbin/sendmail.

Utilizzare prima questa semplice funzione php per controllare la posta 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, devi installare php mailer. Utilizzare questo comando per installare la posta php sul server Ubuntu.

sudo apt-get install sendmail

Quindi controlla le funzioni e-mail di word-press.


questa risposta è quella che chiunque dovrebbe provare prima di qualsiasi altra risposta, questa è la strada da percorrere
hatenine

1

Se le altre ottime risposte qui non aiutano, prova questo:

Ho riscontrato questo stesso problema e nulla di ciò che ho trovato in nessuno dei suggerimenti per WordPress lo ha risolto per me.

Poi ho iniziato a indagare se era stata la stessa installazione di PHP a disabilitare la funzione di posta, ma nessuna di queste ha funzionato. Sembrava che tutto fosse configurato correttamente.

Tutti questi problemi sono iniziati per me una volta che ho aggiornato il mio server a CentOS 7 che utilizza SELinux (Security Enhanced Linux) e quello che ho imparato nelle ultime due settimane con SELinux è che se qualcosa non funziona, ma tutto sembra dovrebbe funzionare ... ciò significa che SELinux ti sta bloccando silenziosamente e segretamente in background.

E viola.

Se sei in esecuzione e un sistema operativo che utilizza SELinux, esegui il seguente comando come root:

setsebool -P httpd_can_sendmail=1

Esiste un'impostazione di sicurezza che impedisce intrinsecamente al server web di inviare e-mail. Quando si attiva questo interruttore e si dice a SELinux che il server web può inviare e-mail, tutto all'improvviso funziona.


0

Mi sono imbattuto in questo oggi; nel mio caso la situazione si è verificata perché il file hosts del server ha lo stesso nome di dominio dell'indirizzo e-mail, che punta a localhost. Il record mx punta a un altro server, ma il file hosts ha la precedenza su DNS e WP sta tentando di recapitare l'e-mail localmente. La rimozione del dominio dal file hosts e il riavvio di sendmail hanno risolto questo problema.


0

Non so se questo sia ancora rilevante per te o no, ma poiché non è stata scelta alcuna risposta, ho pensato di lasciarmi provare una volta.

In realtà, avevo affrontato lo stesso identico problema da quando il mio host openshift all'improvviso ha lasciato il posto oggi e ha smesso di inviare mail. Scorrendo il codice e il codice, sono venuto a conoscenza della funzione wp_mail () e finalmente google mi ha portato qui e ho visto come poteva essere sostituito.

Basandomi sulla risposta di @ Ralf912, ho modificato un po 'lo script in modo che il codice utilizzi l'API Web di sendgrid.com per inviare e-mail anziché 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!


0

Ho avuto lo stesso errore, entrambe le funzioni (mail e wp_mail) hanno funzionato, ma ho ancora questo fastidioso errore. La correzione è stata molto semplice, ma mi ci sono volute alcune ore per trovare il motivo. Quindi condividerò qui la mia soluzione sul problema che potrebbe essere (o non essere) uguale al tuo.

Ho provato la funzione mail () e ha funzionato, ma quando lo collaudi non specifichi l'ultimo parametro chiamato 'parametri' nella funzione mail (). E WP lo usa.

@mail("example@exmaple.com",$title,$body,$headers,"-fexample@exmaple.com");

Quindi, in pratica, questo parametro ("-fexample@exmaple.com") con flag "-f" consente alla funzione mail () di verificare se l'indirizzo e-mail "esempio@exmaple.com" è elencato nell'elenco "e-mail attendibili".

Quindi, se non lo fa, restituisce false, il che rende wp_mail () restituisce false e porta al messaggio di errore.

Quindi, la soluzione è chiedere a hoster di fare questo per te, o se stai usando cPanel, aggiungi semplicemente un account di posta elettronica per questo indirizzo e lo aggiungerà automaticamente alla "lista di fiducia".


0

ha chiamato -Gestire gli ID e-mail registrati per l'invio di e-mail tramite script, ad es. (Wordpress)

  1. Accedi al tuo Cpanel.
  2. Vai alla sezione Email> quindi fai clic su ID email registrati.
  3. quindi aggiungi (wordpress@tuodominio.com) o dove ha ospitato il tuo wordpress. cioè (wordpress@blog.tuodominio.com). quindi invia, bastano pochi minuti per l'attivazione attendere 15 minuti a 1 ora a seconda del provider di hosting, quindi funzionerà.

0

Ho avuto questo errore per anni e ho provato così tante soluzioni che non funzionavano. Ho un'installazione personalizzata di Wordpress su AWS EC2. Prima di tutto assicurati che la tua posta AWS SES sia abilitata tramite il supporto, devono essere nella stessa (o chiusa) regione in SES ed EC2. Ho usato Google suite (gsuite) per l'email per ricevere / inviare posta.

Assicurati che l'email di prova invii 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.

È necessario abilitare la casella "SSL" per la crittografia, questo cambia la porta a 465 per me. Finalmente il mio test e-mail inviato da Worpdress con successo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.