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