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.
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.
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' ) ?? ''; } }