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

9

Ich habe kürzlich einen Kommentarbereich auf meiner Website implementiert und versucht, die E-Mail-Benachrichtigung zum Laufen zu bringen. Es scheint keine E-Mail-Benachrichtigungen senden zu wollen, wenn neue Kommentare abgegeben werden.

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

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

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

Irgendwelche Ideen?

QWERTY
quelle
Bitte geben Sie Debugging-Informationen
s_ha_dum

Antworten:

9

Schritt für Schritt: Suchen Sie zuerst die Datei, in der die Fehlermeldung angezeigt wird. Ich benutze Notepad ++ und den Befehl CTRL+ F, um in Dateien zu suchen. Es ist eine gute Idee, nur die ersten paar Wörter der Fehlermeldung zu durchsuchen, da einige Fehlermeldungen aus verschiedenen Meldungen kombiniert werden.

Ihre Fehlermeldung erscheint in wp-login.phpund 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. $messagemüssen wahr sein (keine leere Zeichenfolge, nicht falsch, nicht null usw.). Und wp_mail()sollte nicht falsch zurückgeben.

In einer Zeile darüber befindet sich ein Filter $message = apply_filters('retrieve_password_message', $message, $key);. Daher ist es möglich, 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()es 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-Elemente.)

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 ankommt, haben Sie wahrscheinlich ein Problem mit wp_mail(). Aktivieren Sie also das Debuggen:

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

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

Zu diesem Zeitpunkt haben Sie gute Informationen erhalten, wenn dies wp_mail()fehlschlägt und wenn ja, warum. Wenn es wp_mail()richtig funktioniert und die Testmail eingetroffen ist, gehen Sie zurück nach oben und finden Sie heraus, warum dies $messagenicht der Fall ist.

Wenn Sie Probleme mit haben wp_mail(), denken Sie daran, dass wp_mail()die PHP- mail()Funktion nicht verwendet wird . WordPress verwendet eine PHP-Klasse ( PHPMailer ). Möglicherweise benötigen Sie nur ein Plugin, um SMTP anstelle von sendmail zu verwenden. Oder das Problem liegt an einem anderen Ort. Wir wissen es nicht. Du musst nachforschen.

Ralf912
quelle
Ja, ich habe versucht, mich in den Kern zu vertiefen, und es hat mich auch zu PHPMailer geführt, und es werden tatsächlich PHPs verwendet mail(). Zumindest in einigen Fällen (siehe Zeile 732 in wp-includes/class-phpmailer.php. Ich habe keinen Zugriff auf die FTP-Atm, aber ich werde Ihre Vorschläge so schnell wie möglich versuchen. Dies muss mich sicherlich irgendwohin führen. Vielen Dank!
qwerty
Ich habe getestet wp_mail()und es scheint gut zu funktionieren, ich habe die Mail wie erwartet erhalten. WP würde die E-Mails zum Zurücksetzen von Kommentaren / Passwörtern immer noch nicht senden, und ich habe nichts in der Protokolldatei erhalten (sie wurde nicht erstellt), also habe ich versucht, ein SMTP-Mail-Plugin zu installieren und ein neues E-Mail-Konto für einzurichten Wordpress. Es funktioniert jetzt, aber ich verstehe immer noch nicht, warum es vorher nicht senden konnte. Vielen Dank!
QWERTY
Ich bekomme keinen Fehler und auch keine Mail
Baldraider
2

Dies ist eine sehr ärgerliche Fehlermeldung, da es sich um viele Dinge handeln kann und der tatsächliche Fehler nicht angezeigt wird (der in anderen Teilen des Codes häufig zum Schweigen gebracht wird).

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


So zeigen Sie Warnungen aus der PHP- mail()Funktion an

Diese werden normalerweise standardmäßig stummgeschaltet, aber WordPress erfasst sie leider nie. Um zu zeigen , sie einfach die entfernen @Zeichen von @mail(...in wp-includes/class-phpmailer.phpder mailPassthru()Funktion:

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 hinzu /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. Es werden alle Details darüber ausgegeben, wo die Ausnahme ausgelöst wurde. Leider enthält es manchmal die nicht hilfreiche Ausnahmemeldung: " Mail-Funktion konnte nicht instanziiert werden ". Ja danke WordPress, das ist wirklich 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 irgendwann in der Zukunft die Behandlung von E-Mail-Fehlern.

Simon East
quelle
2

Ich habe das gleiche Problem mit dem Ubuntu-Server unter Amazon EC2. Ich bekomme ein Problem, wenn ich den Link zum Zurücksetzen des Passworts verwende und auch andere Benachrichtigungs-E-Mails nicht funktionieren.

Hier sind also Lösungen, die für mich wp_mail()funktioniert haben. Word-Press verwendet die Funktion zum Senden von E-Mails, die eine PHPMailerKlasse benötigen , in der PHP-Mailer gespeichert sind /usr/sbin/sendmail.

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 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 E-Mail-Funktionen für WordPress.

CyberAbhay
quelle
Diese Antwort ist diejenige, die jeder vor allen anderen Antworten versuchen sollte. Dies ist der
richtige
1

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

Ich bin auf dasselbe Problem gestoßen und nichts, was ich in einem der Vorschläge 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 aktualisierte, das SELinux (Security Enhanced Linux) verwendet. In den letzten Wochen habe ich mit SELinux gelernt, dass etwas nicht funktioniert, aber alles so aussieht es sollte funktionieren ... das heißt, SELinux blockiert Sie still und heimlich im Hintergrund.

Und Bratsche.

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

setsebool -P httpd_can_sendmail=1

Es gibt eine Sicherheitseinstellung, die den Webserver von Natur aus daran hindert, E-Mails zu senden. Wenn Sie diesen Schalter umlegen und SELinux mitteilen, dass der Webserver E-Mails senden kann, funktioniert plötzlich alles.

Kenny Wyland
quelle
0

Ich bin heute darauf gestoßen; In meinem Fall ist die Situation aufgetreten, weil die Hosts-Datei des Servers denselben Domainnamen wie die E-Mail-Adresse hat und auf localhost verweist. 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.

user16081
quelle
0

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 keine E-Mails mehr verschickte. Beim Durchstöbern des Codes und des Codex lernte ich die Funktion wp_mail () kennen und schließlich führte mich Google hierher und ich sah, wie sie überschrieben werden konnte.

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-API 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!

Prahlad Yeri
quelle
0

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 Problem identisch sein könnte (oder auch nicht).

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

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

Grundsätzlich bewirkt dieser Parameter ("[email protected]") mit dem Flag "-f", 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 darin, den Hoster zu bitten, dies für Sie zu tun. 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.

user3696815
quelle
0

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

  1. Melden Sie sich bei Ihrem Cpanel an.
  2. Gehen Sie zum Abschnitt E-Mail> und klicken Sie dann auf Registrierte E-Mail-IDs.
  3. Fügen Sie dann hinzu ([email protected]) oder wo Ihr WordPress gehostet hat. dh ([email protected]). Nach dem Absenden dauert es einige Minuten, um die Wartezeit zu aktivieren. Abhängig von Ihrem Hosting-Anbieter dauert es 15 Minuten bis 1 Stunde. Dann funktioniert es.
Amrit Bhandari
quelle
0

Ich hatte diesen Fehler seit Ewigkeiten und habe so viele Lösungen ausprobiert, die nicht funktionierten. Ich habe eine benutzerdefinierte Wordpress-Installation auf AWS EC2. Stellen Sie zunächst sicher, dass Ihre AWS SES-E-Mails durch Support aktiviert sind. Sie müssen sich in SES und EC2 in derselben (oder einer geschlossenen) Region befinden. Ich habe Google Suite (gsuite) für E-Mails zum Empfangen / Senden von E-Mails verwendet.

Stellen Sie sicher, dass die Test-E-Mail in AWS SES und Gsuite gesendet wird.

Installieren Sie das Wordpress-Plugin WP Mail SMTP, verwenden Sie die Option "Anderes SMTP", holen Sie sich Ihre SMTP-Anmeldeinformationen von AWS SES, hier steckte ich fest.

Sie müssen das Kontrollkästchen "SSL" für die Verschlüsselung aktivieren. Dadurch wird der Port für mich auf 465 geändert. Endlich wurde mein E-Mail-Test von Worpdress erfolgreich gesendet.

Archie Butler
quelle