wake-up-neo.com

WordPress weigert sich, E-Mails zu senden, "... Ihr Host hat möglicherweise die mail () -Funktion deaktiviert"

Ich habe kürzlich einen Kommentarbereich auf meiner Website implementiert und versucht, die E-Mail-Benachrichtigung funktionsfähig zu machen. Es scheint nicht zu wollen, E-Mail-Benachrichtigungen zu senden, wenn neue Kommentare abgegeben werden.

Um zu sehen, ob PHP E-Mails senden kann, habe ich versucht, das Kennwort zurückzusetzen (da Sie ein neues Kennwort per E-Mail erhalten), und ich habe die folgende Nachricht erhalten:

Die E-Mail konnte nicht gesendet werden. Möglicher Grund: Möglicherweise hat Ihr Host die mail () - Funktion deaktiviert

Ich habe die Kontrollkästchen unter Einstellungen -> Diskussion aktiviert und die E-Mail ist gültig, daher handelt es sich nicht um ein Einstellungsproblem. Ich habe versucht, eine PHP -Datei zu erstellen und sie mit mail() zu senden, und sie wurde erfolgreich gesendet. Es muss also etwas Seltsames mit WordPress los sein.

Irgendwelche Ideen?

9
qwerty

Schritt für Schritt: Suchen Sie zuerst die Datei, in der die Fehlermeldung angezeigt wird. Ich benutze Notepad ++ und das CTRL + F Befehl zum Suchen in Dateien. Es ist ratsam, nur die ersten Wörter der Fehlermeldung zu durchsuchen, da einige Fehlermeldungen aus verschiedenen Meldungen bestehen.

Ihre Fehlermeldung erscheint in wp-login.php und Heiliges Glück, nur dort. Schauen wir uns also an, warum dieser Fehler auftreten kann.

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

Es gibt zwei Bedingungen. $message muss true sein (keine leere Zeichenfolge, kein false, kein null usw.). Und wp_mail() sollte nicht false zurückgeben.

In einer Zeile darüber gibt es einen Filter $message = apply_filters('retrieve_password_message', $message, $key);, sodass es möglich ist, dass ein Plugin (oder Theme) diesen Filter verwendet und einen Wert zurückgibt, der nicht wahr ist (leere Zeichenfolge, falsch, null usw.).

Es ist jedoch viel einfacher zu überprüfen, ob wp_mail() funktioniert oder nicht. Schreiben Sie ein kleines Plugin, um eine Testmail an sich selbst zu senden:

<?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      = '[email protected]';
    $subject = 'Testemail';
    $message = 'FooBarBaz Testmail is working';

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

(Dies ist PHP5.3-Code. Wenn Sie PHP5.2 ausführen, entfernen Sie die Namespace-Dinge.)

Das Plugin sollte sofort nach der Aktivierung eine Testmail senden. Wenn nicht, sollten einige Backend-Seiten (z. B. Dashboard) aufgerufen werden.

Wenn die Testmail nicht eintrifft, liegt wahrscheinlich ein Problem mit wp_mail() vor. So aktivieren Sie das Debuggen:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
@ini_set( 'display_errors',1 );

Tragen Sie diesen Code in Ihren wp-config.php ein und versuchen Sie erneut, sich eine Testmail zu senden. Jetzt sollten Sie einige Fehlermeldungen erhalten und sie sollten auch in wp-content/debug.log angemeldet sein (Das Debug-Protokoll kann sehr groß werden, wenn durch Plugins und/oder Themes mehr Fehler verursacht werden).

Zu diesem Zeitpunkt haben Sie gute Informationen erhalten, wenn wp_mail() fehlschlägt, und wenn ja, warum. Wenn wp_mail() korrekt funktioniert und die Testmail angekommen ist, gehen Sie nach oben und finden Sie heraus, warum $message nicht wahr ist.

Wenn Sie Probleme mit wp_mail() haben, denken Sie daran, dass wp_mail() nicht die Funktion PHPs mail() verwendet. WordPress verwendet eine PHP Klasse ( PHPMailer ). Möglicherweise benötigen Sie nur ein Plugin zur Verwendung von SMTP anstelle von sendmail. Oder das Problem liegt an einer anderen Stelle. Wir wissen es nicht. Du musst nachforschen.

9
Ralf912

Dies ist eine sehr ärgerliche Fehlermeldung, da es sich um viele Dinge handeln könnte, und sie zeigt nicht den tatsächlichen Fehler an (der in anderen Teilen des Codes häufig stummgeschaltet wird).

Dieser Fehler tritt auf, wenn die Funktion wp_mail() false zurückgibt, was wiederum passieren kann, wenn phpmailer->Send() false zurückgibt oder eine Ausnahme auslöst.


So zeigen Sie Warnungen der Funktion mail() von PHP an

Diese sind normalerweise standardmäßig stummgeschaltet, aber leider werden sie von WordPress nie erfasst. Um sie anzuzeigen, entfernen Sie einfach die Zeichen @ von @mail(... in wp-includes/class-phpmailer.php in der Funktion 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);
}


So suchen Sie nach anderen möglichen Ursachen:

  1. Fügen Sie eine einzelne Zeile am Ende von wp_mail() in /wp-includes/pluggable.php ein:

    // 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. Es werden alle Details darüber ausgegeben, wo die Ausnahme ausgelöst wurde. Leider enthält es manchmal diese nicht hilfreiche Ausnahmemeldung: " Mail-Funktion konnte nicht instanziiert werden ". Ja danke WordPress, das ist sehr hilfreich.

  3. Wenn Sie sich die Ausnahme ansehen, können Sie die Zeilennummer des Fehlers finden und sie hoffentlich durch den Code zurückverfolgen, um die wahre Ursache zu finden.

Viel Glück. Hoffentlich verbessert WordPress zu einem späteren Zeitpunkt die Behandlung von E-Mail-Fehlern.

2
Simon East

Ich habe das gleiche Problem mit dem Ubuntu-Server auf Amazon EC2. Ich bekomme ein Problem, wenn der Link zum Zurücksetzen des Passworts verwendet wird und auch andere Benachrichtigungs-E-Mails funktionierten nicht.

Hier sind also Lösungen, die für mich funktionierten. WordPress verwendete die Funktion wp_mail(), um E-Mails zu senden, die die Klasse PHPMailer benötigen, die den in /usr/sbin/sendmail gespeicherten PHP-Mailer verwendet.

Verwenden Sie diese einfache PHP-Funktion zuerst, um PHP-Mails zu überprüfen

<?php
$to = "[email protected]";
$subject = "Test Email Function";
$txt = "Hello world!";
$headers = "From: [email protected]" . "\r\n" .
"CC: [email protected]";

mail($to,$subject,$txt,$headers);
?>

Wenn dies nicht funktioniert, müssen Sie den PHP-Mailer installieren. Verwenden Sie diesen Befehl, um PHP-Mail auf dem Ubuntu-Server zu installieren.

Sudo apt-get install sendmail

Überprüfen Sie dann die WordPress-E-Mail-Funktionen.

2
CyberAbhay

Wenn die anderen guten Antworten hier nicht helfen, versuchen Sie Folgendes:

Ich bin auf dasselbe Problem gestoßen und nichts, was ich in den Vorschlägen für WordPress finden konnte, hat es für mich gelöst.

Dann begann ich zu untersuchen, ob es die PHP -Installation selbst war, die die Mail-Funktion deaktiviert hatte, aber auch nichts davon funktionierte. Alles sah so aus, als wäre es richtig konfiguriert.

All diese Probleme begannen für mich, als ich meinen Server auf CentOS 7 aufrüstete, das SELinux (Security Enhanced Linux) verwendet. Was ich in den letzten Wochen bei SELinux gelernt habe, ist, dass etwas nicht funktioniert, aber alles so aussieht es sollte funktionieren ... das bedeutet, dass SELinux Sie still und heimlich im Hintergrund blockiert.

Und die Bratsche.

Wenn Sie ein Betriebssystem mit SELinux verwenden, führen Sie einfach den folgenden Befehl als root aus:

setsebool -P httpd_can_sendmail=1

Es gibt eine Sicherheitseinstellung, die von Natur aus verhindert, dass der Webserver E-Mails sendet. Wenn Sie diesen Schalter umlegen und SELinux mitteilen, dass der Webserver E-Mails senden darf, funktioniert plötzlich alles.

1
Kenny Wyland

Ich bin heute darauf gestoßen; In meinem Fall geschah dies, weil die Hosts-Datei des Servers denselben Domainnamen wie die E-Mail-Adresse hat und auf localhost zeigt. Der mx-Eintrag verweist auf einen anderen Server, aber die hosts-Datei überschreibt DNS und WP versucht, die E-Mail lokal zuzustellen. Durch Entfernen der Domäne aus der Hosts-Datei und Neustarten von sendmail wurde dieses Problem behoben.

0
user16081

Ich hatte den gleichen Fehler, beide Funktionen (mail und wp_mail) funktionierten, aber ich hatte immer noch diesen nervigen Fehler. Die Lösung war sehr einfach, aber ich habe einige Stunden gebraucht, um den Grund zu finden. Deshalb werde ich hier meine Lösung für das Problem mitteilen, das mit Ihrem identisch sein kann (oder nicht).

Ich habe die mail () - Funktion ausprobiert und sie hat funktioniert, aber wenn Sie sie testen, geben Sie nicht den letzten Parameter namens 'parameters' in der mail () - Funktion an. Und WP verwendet es.

@mail("[email protected]",$title,$body,$headers,"[email protected]");

Im Grunde führt dieser Parameter ("[email protected]") mit dem Flag "-f" dazu, dass die Funktion mail () überprüft, ob die E-Mail-Adresse "[email protected]" in der Liste "Vertrauenswürdige E-Mails" aufgeführt ist.

Wenn dies nicht der Fall ist, wird false zurückgegeben, wodurch wp_mail () false zurückgibt und zur Fehlermeldung führt.

Die Lösung besteht also darin, den Hoster zu bitten, dies für Sie zu tun, oder wenn Sie cPanel verwenden, fügen Sie einfach ein E-Mail-Konto für diese Adresse hinzu, und es wird automatisch in die "vertrauenswürdige Liste" aufgenommen.

0
user3696815

es heißt -Manage Registered Email-Ids für das Versenden von Mails über Skripte zB (Wordpress)

  1. Loggen Sie sich in Ihr Cpanel ein.
  2. Gehen Sie zum Abschnitt E-Mail> und klicken Sie auf Registrierte E-Mail-IDs.
  3. füge dann hinzu ([email protected]) oder wo dein WordPress gehostet hat. dh ([email protected]). Nach dem Abschicken dauert es einige Minuten, bis die Aktivierung abgeschlossen ist. Je nach Hosting-Provider dauert es 15 Minuten bis 1 Stunde, dann funktioniert es.
0
Amrit Bhandari

Ich weiß nicht, ob dies für Sie noch relevant ist oder nicht, aber da keine Antwort ausgewählt wurde, dachte ich, ich sollte es einmal versuchen.

Eigentlich hatte ich genau das gleiche Problem, seit mein OpenShift-Host heute plötzlich nachgab und aufhörte, Mails zu senden. Beim Durchstöbern von Code und Codex habe ich die Funktion wp_mail () kennengelernt und schließlich hat mich Google hierher geführt und ich habe gesehen, wie sie überschrieben werden kann.

Aufbauend auf der Antwort von @ Ralf912 habe ich das Skript ein wenig geändert, sodass der Code die Web-API von sendgrid.com verwendet, um E-Mails anstelle der WordPress-Standard-E-Mail zu senden (ich nehme an:

<?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'      => '[email protected]',
      );


    $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      = '[email protected]';
$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      = '[email protected]';
    $subject = 'Testemail';
    $message = 'It works Live!';
    //echo 'To is: ' + $to;
    wp_mail( $to, $subject, $message, array() );
    //print_r('Just sent!');*/
}

Und es hat funktioniert!

0
Prahlad Yeri