WordPress: Mailversand per SMTP

Es kommt durchaus mal vor, dass man WordPress auf einem Server einsetzt, der keinen Mailversand über die PHP-Funktion mail() zulässt. In solchen Fällen muss man auf den Mailversand per SMTP zurückgreifen. Leider bietet WordPress nicht die Möglichkeit, die SMTP-Konfiguration direkt vorzunehmen. Das ist sehr schade, denn eigentlich wäre es kein großer Aufwand, dies bereitzustellen. Folgendermaßen muss man vorgehen, um WordPress dazu zu bringen, Mails via SMTP zu verschicken.

Zuerst einmal müsst ihr die SMTP-Konfiguration irgendwo hinterlegen. Ich dazu die wp-config.php ausgewählt, da dort sowieso auch alle anderen, fest verdrahteten Informationen abgelegt sind. Dort habe ich die Funktion smtp_wp_mail() hinterlegt, die wie folgt aussieht:

1
2
3
4
5
6
7
8
9
10
11
//!!! use SMTP
function smtp_wp_mail($phpmailer) {
  $phpmailer->IsSMTP(); // telling the class to use SMTP

  $phpmailer->Host       = "smtp.example.com";      // set the SMTP server host
  $phpmailer->Port       = 465;                     // set the SMTP server port
  $phpmailer->SMTPSecure = "ssl";                   // enable SMTP via SSL
  $phpmailer->SMTPAuth   = true;                    // enable SMTP authentication
  $phpmailer->Username   = "wordpress@example.com"; // set the SMTP account username
  $phpmailer->Password   = "SECRETPASSWORD";        // set the SMTP account password
}

Wie man sieht, wird hier kein Stückchen Logik benötigt, sondern einfach nur reine Konfigurationseinstellungen. Das hat einen einfachen Grund: WordPress verwendet intern für den Mailversand die Funktion wp_mail(), die wiederum die Klasse PHPMailer kapselt. Oder anders ausgedrückt: Die Funktionalität ist bereits vorhanden, sie müsste nur genutzt werden.

Um das nun auch zu tun, muss noch die Funktion wp_mail(), die sich in der Datei wp-includes/pluggable.php befindet, angepasst werden. In ihr gibt den folgenden Codeblock:

1
2
// Set to use PHP's mail()
$phpmailer->IsMail();

Dieser muss wie folgt abgeändert werden. Dadurch wird das interne Mailobjekt an unsere oben geschriebene Funktion übergeben, dort für den Mailversand per SMTP umkonfiguriert und danach mit dem Mailversand in der Funktion wp_mail() weitergemacht.

1
2
3
4
5
// Set to use PHP's mail()
// $phpmailer->IsMail();

//!!! use SMTP
smtp_wp_mail($phpmailer);

Das war es auch schon! Ich weiß, es gibt auch Plugins dafür, wie z.B. WP Mail SMTP oder Configure SMTP aber wenn ich ehrlich sein soll, finde ich diese viel zu überladen für die paar gerade gezeigten Codezeilen.
Update:
Wie Oliver gezeigt hat, kann man sich die Änderung der pluggable.php auch sparen und stattdessen den Hook "phpmailer_init" verwenden. So könnte man z.B. ein Plugin schreiben, das einfach nur folgendes macht:

1
add_action("phpmailer_init", "smtp_wp_mail");

Mailende Grüße, Kenny

14 Kommentare » Schreibe einen Kommentar

  1. Cool, direkt mal abgespeichert, denn auf einen unserer Hoster ist das selbe Problem.

    Dürfte ja noch immer ohne Probleme klappen oder ?

    Grüße
    Marc

  2. Hallo,
    ich habe auch schon die Erfahrung gemacht das bei WP immer alles wie du schon schreibst "gekapselt" wird. Dein Tutorial hat mir aber gerade sehr weitergeholfen, da ich WP für einen Bekannten installierre und dessen Server genau dieses Problem hat. Viele Grüße, Daniel

  3. Pingback: Wordpress sendet keine Mails – Lösung › Nicht spurlos

  4. hallo,
    ich habe gerade das gleiche problem mit wordpress.
    ich bin bei 1&1 und nutze das plugin "configure smtp".
    ich habe jetzt schon alle port probiert, aber wordpress verbindet sich einfach nicht mit dem server von 1&1.

    der vorteil an dem plugin ist, das ich eine testmail versenden kann und omit gleich sehe, ob die einstellungen funktioniert.
    ich traue mir nicht so richtig zu, die einzelnen php dateien in wordpress zu editieren.
    kann das problem nicht von 1&1 gelöst werden, indem sie den smtp versand einfach erlauben?
    ich habe schon mit dem 1&1 support telefoniert und die meinten, das von deren seite alles erlaubt ist und der fehler bei wordpress liegt.
    tja,...ich habe auch keine andere antwort erwarte.
    ich google jetzt seit 4 stunden nach dem problem und wäre dankbar, wenn ihr mir die einstellungen oder alternativen nochmal für anfänger erklärt.
    lieben gruß
    frank

    • Hallo Frank, leider kann man mit den gegebenen Infos noch nicht sooo viel anfangen. Läuft dein WordPress auf einem separaten Server (evtl. sogar von dir gehostet) oder auf dem von 1und1, der auch für SMTP zuständig ist?

  5. Hey,

    ich nutze WP Mail SMTP ich verstehe nicht, was der Vorteil sein soll ? Vielleicht kannst du mir das ja noch mal kurz erklären.

    Danke dir.

    Grüße Henning.

    • Für den normalen Anwender gibt es keinen Vorteil.

      Es geht hier eher darum, die eigene Webseite nicht mit unnötig viel fehleranfälligen Code vollzuladen. Deshalb bevorzuge ich gerne kleine, schlanke Lösungen.

  6. Das war es auch schon! Ich weiß, es gibt auch Plugins dafür, wie z.B. WP Mail SMTP oder Configure SMTP aber wenn ich ehrlich sein soll, finde ich diese viel zu überladen für die paar gerade gezeigten Codezeilen.

    Ja, nur nach nem Update ist alles wieder weg bei Dir. Übrigens signieren geht auch mit sowas. 🙂

    • Zum Teil - die Änderung in der pluggable.php muss man erneut vornehmen. Die Funktion smtp_wp_mail() sollte aus dem Grund in der wp-config.php hinterlegt werden. 😀

          • 1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            <?php
            /*
            Plugin Name: SMTP Mail
            Description: Mails schicken
            Version: 1.0
            */

            function smtp_mail( $phpmailer ) {
                $phpmailer->IsSMTP();
                $phpmailer->Host        = 'mail.anonsphere.com';
                $phpmailer->SMTPAuth        = true;
                $phpmailer->Username        = 'support@mail.anonsphere.com';
                $phpmailer->Password        = 'XXXXXXXXXXXXXX';
            }
            add_action( 'phpmailer_init', 'smtp_mail' );

            Fertig 🙂

            • Funktioniert doch auch ganz gut ohne HTML-Tags. 😀

              Danke für den Hinweis auf "phpmailer_init". Mir ist der Hook zwar schon ein paar Mal über den Weg gelaufen, eine echte dazu Beschreibung hatte ich jedoch leider nicht gefunden. :-/

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.