WP_MAIL mit einer SMTP-Verbindung verschicken (via PHPMailer)

Oft ist sinnvoll wp_mail()'s nicht direkt vom Webserver verschicken zu lassen. Mails vom Webserver landen schnell im Spam, weil sie nicht verifiziert werden können, oder die eigentliche E-Mails auf einem anderem System liegen. Daher ist es nützlich sich eine gesonderte E-Mail-Adresse einzurichten und das Wordpress dann per SMTP verbinden zu lassen.

In Wordpress werden E-Mail über die Library PHPMailer verschickt, und die kommt von Haus aus mit einer Möglichkeit eine SMTP-Verbindung herzustellen.

Das ist ein einfacher Beispiel Code wie man ohne Plugin eine SMTP Verbindung in Wordpress herstellen kann:

<?php 
namespace theme_setup;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
 
/**----------------------------------------
 * SMTP Verbindungsdaten einrichten
 *  ----------------------------------------
 * 
 * Richtet für wp_mail SMTP-Verbindungsdaten 
 * im PHPMailer ein. WP-Mail ist ein normaler
 * PHPMailer im Hintergrund.
 * 
 * PHPMailer Documentaion:
 * @link https://github.com/PHPMailer/PHPMailer
 */
add_action( 'phpmailer_init', ['theme_setup\MailViaSMTP', 'do_configure_phpmailer'] );
final class MailViaSMTP
{
	// --- Default Konfiguration
	private static $Host     = 'smtp.dein-server.de';
	private static $SMTPAuth = true;
	private static $Port     = 465;
	private static $Username = 'deine@mail.adresse';
	private static $Password = '-dein-passwort-zur-mail-adresse-';
	private static $From     = 'deine@mail.adresse';
	private static $FromName = 'Dein Name';
 
	// --- Nur für Debuggen
	private static $debug_output = false; // Wenn true, dann echo'd der PHPMailer eine Log Ausgabe aller Schritte
 
	// --- Konfigruations für WP/PHPMailer setzen
	public static function do_configure_phpmailer( PHPMailer $phpmailer )
	{
		if( self::$debug_output ){
			$phpmailer->SMTPDebug = SMTP::DEBUG_SERVER; 
		}
 
		$phpmailer->isSMTP();
		$phpmailer->Host       = self::$Host;
		$phpmailer->SMTPAuth   = self::$SMTPAuth;
		$phpmailer->Port       = self::$Port;
		$phpmailer->Username   = self::$Username;
		$phpmailer->Password   = self::$Password;
		$phpmailer->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
		$phpmailer->From       = self::$From;
		$phpmailer->FromName   = self::$FromName;
	}
}

Eine einfachere Version des Codes gibt es hier im Blog von media-techport.

Hinweis zur SMPTSecure Einstellung

An dieser stelle wird eine Konstante übergeben, die auch in standard Systemen mit dem Port zusammen hängt:

	PHPMailer::ENCRYPTION_SMTPS » Port 465
	PHPMailer::ENCRYPTION_STARTTLS » Port 587

Man muss jedoch nicht die Konstanten des PHPMailers nutzen, mann kann auch Strings hinterlegen

	$phpmailer->SMTPSecure = 'ssl'; // gleiche wie» PHPMailer::ENCRYPTION_SMTPS;
	$phpmailer->SMTPSecure = 'tls'; // gleiche wie» PHPMailer::ENCRYPTION_STARTTLS;

Das zeigt ein Blick in die PHPMailer-Klasse auf Github.

SMTP Klasse nutzen um Auth-Daten von ACF zu bekommen

Ich schreibe solche Konfigurationen gerne in statische Klassen. Das hat den Vorteil, dass ich mir die SMTP-Verbindungsdaten auch z.B. von einer ACF-Options-Page ziehen kann. Oder halt einer eigenen Settings-Seite.

In diesem erweiterten Beispiel, ziehe ich die SMTP-Konfiguration von einer ACF-Seite. Dadurch kann ich im Backend die SMTP-Daten eingeben, immer ändern und brauche nicht in den Quellcode gehen.

<?php 
namespace theme\functions\theme_setup;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
 
/**----------------------------------------
 * SMTP Verbindungsdaten einrichten
 * ----------------------------------------
 * 
 * Richtet für wp_mail SMTP-Verbindungsdaten 
 * im PHPMailer ein. WP-Mail ist ein normaler
 * PHPMailer im Hintergrund.
 * 
 * PHPMailer Documentaion:
 * @link https://github.com/PHPMailer/PHPMailer
 */
add_action( 'phpmailer_init', ['theme\functions\theme_setup\MailViaSMTP', 'do_configure_phpmailer'] );
final class MailViaSMTP
{
	// --- Default Konfiguration
	private static $use_smtp = false;
	private static $Host     = '';
	private static $Port     = 0;
	private static $Username = '';
	private static $Password = '';
	private static $From     = '';
	private static $FromName = '';
 
	// --- Nur für Debuggen
	private static $debug_output = false; // Wenn true, dann echo'd der PHPMailer eine Log Ausgabe
 
	// --- Konfigruations für WP/PHPMailer setzen
	public static function do_configure_phpmailer( PHPMailer $phpmailer )
	{
		self::set_private_smtp_parameters();
 
		// Exit falls SMTP gar nicht gewünscht ist, via ACF Optionen
		if( !self::$use_smtp){
			return; 
		}
 
		// Echo Ausgabe vom PHPMailer zum debuggen
		if( self::$debug_output ){
			$phpmailer->SMTPDebug = SMTP::DEBUG_SERVER; 
		}
 
		// Konfiguration des PHPMailers
		$phpmailer->isSMTP();
		$phpmailer->Host       = self::$Host;
		$phpmailer->SMTPAuth   = true;
		$phpmailer->Port       = self::$Port;
		$phpmailer->Username   = self::$Username;
		$phpmailer->Password   = self::$Password;
		$phpmailer->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
		$phpmailer->From       = self::$From;
		$phpmailer->FromName   = self::$FromName;
	}
 
	// --- SMTP Settings von ACF Option Page bekommen 
	private static function set_private_smtp_parameters()
	{
		self::$use_smtp = get_field( 'acf_option_use_smpt',  'options' ) ?? false;
		self::$Host     = get_field( 'acf_option_smpt_host', 'options' ) ?? '';
		self::$Port     = get_field( 'acf_option_smpt_port', 'options' ) ?? '';
		self::$Username = get_field( 'acf_option_smpt_user', 'options' ) ?? '';
		self::$Password = get_field( 'acf_option_smpt_pass', 'options' ) ?? '';
		self::$From     = get_field( 'acf_option_smpt_from', 'options' ) ?? '';
		self::$FromName = get_field( 'acf_option_smpt_name', 'options' ) ?? '';
	}
}

Page Tools