Was ist der einfachste Weg, SMTP-Einstellungen programmgesteuert einzurichten?

Angenommen, wir haben eine leere WP-Site und möchten die SMTP-Einstellungen programmatisch in unserem Plugin oder Theme einrichten. Was ist der einfachste Weg, um coredateien zu ändern?

Solutions Collecting From Web of "Was ist der einfachste Weg, SMTP-Einstellungen programmgesteuert einzurichten?"

Wenn wir uns zunächst die Implementierung der wp_mail function wp_mail , werden wir sehen, dass diese function die PHPMailer class zum Senden von E-Mails verwendet. Außerdem konnten wir feststellen, dass es einen fest codierten functionsaufruf $phpmailer->IsMail(); , die die Verwendung der PHP-function mail() festlegt. Das bedeutet, dass wir die SMTP-Einstellungen nicht verwenden können. Wir müssen die isSMTP function der PHPMailer class PHPMailer . Und wir müssen auch unsere SMTP-Einstellungen einstellen.

Um dies zu erreichen, müssen wir Zugriff auf die Variable $phpmailer . Und hier kommen wir zu phpmailer_init action, die vor dem Versenden einer Email aufgerufen wird. So können wir tun, was wir brauchen, indem wir unseren Aktionshandler schreiben:

 add_action( 'phpmailer_init', 'wpse8170_phpmailer_init' ); function wpse8170_phpmailer_init( PHPMailer $phpmailer ) { $phpmailer->Host = 'your.smtp.server.here'; $phpmailer->Port = 25; // could be different $phpmailer->Username = 'your_username@example.com'; // if required $phpmailer->Password = 'yourpassword'; // if required $phpmailer->SMTPAuth = true; // if required // $phpmailer->SMTPSecure = 'ssl'; // enable if required, 'tls' is another possible value $phpmailer->IsSMTP(); } 

Und das ist alles.

Ergänzung zu @EugeneManuilov Antwort.

SMTP-Einstellungen

Standardmäßig können diese nur während eines an do_action_ref_array() angehängten Callbacks aktiviert werden, da @EugeneManuilov bereits beantwortet wurde. Quelle / core .

 < ?php defined( 'ABSPATH' ) OR exit; /** * Plugin Name: (WCM) PHPMailer SMTP Settings * Description: Enables SMTP servers, SSL/TSL authentication and SMTP settings. */ add_action( 'phpmailer_init', 'phpmailerSMTP' ); function phpmailerSMTP( $phpmailer ) { # $phpmailer->IsSMTP(); # $phpmailer->SMTPAuth = true; // Authentication # $phpmailer->Host = ''; # $phpmailer->Username = ''; # $phpmailer->Password = ''; # $phpmailer->SMTPSecure = 'ssl'; // Enable if required - 'tls' is another possible value # $phpmailer->Port = 26; // SMTP Port - 26 is for GMail } 

SMTP-Ausnahmen

Standardmäßig gibt Ihnen WordPress keine Debug-Ausgabe. Stattdessen wird nur FALSE wenn ein Fehler aufgetreten ist. Hier ist ein kleines Plugin, um das zu beheben:

 < ?php defined( 'ABSPATH' ) OR exit; /** * Plugin Name: (WCM) PHPMailer Exceptions & SMTP * Description: WordPress by default returns FALSE instead of an Exception. This plugin fixes that. */ add_action( 'phpmailer_init', 'WCMphpmailerException' ); function WCMphpmailerException( $phpmailer ) { if ( ! defined( 'WP_DEBUG' ) OR ! WP_DEBUG ) { $phpmailer->SMTPDebug = 0; $phpmailer->debug = 0; return; } if ( ! current_user_can( 'manage_options' ) ) return; // Enable SMTP # $phpmailer->IsSMTP(); $phpmailer->SMTPDebug = 2; $phpmailer->debug = 1; // Use `var_dump( $data )` to inspect stuff at the latest point and see // if something got changed in core. You should consider dumping it during the // `wp_mail` filter as well, so you get the original state for comparison. $data = apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) ); current_user_can( 'manage_options' ) AND print htmlspecialchars( var_export( $phpmailer, true ) ); $error = null; try { $sent = $phpmailer->Send(); ! $sent AND $error = new WP_Error( 'phpmailerError', $sent->ErrorInfo ); } catch ( phpmailerException $e ) { $error = new WP_Error( 'phpmailerException', $e->errorMessage() ); } catch ( Exception $e ) { $error = new WP_Error( 'defaultException', $e->getMessage() ); } if ( is_wp_error( $error ) ) return printf( "%s: %s", $error->get_error_code(), $error->get_error_message() ); } 

Repository

Die Plugins sind beide in diesem Gist auf GitHub verfügbar, also überprüfst du diese Plugins von dort, um Updates zu erhalten.

Die anderen Antworten auf diesen Beitrag bieten zwar eine funktionierende Lösung, behandeln jedoch nicht das Sicherheitsproblem beim Speichern Ihrer SMTP-Anmeldeinformationen in einer Plugin-Datei oder functions.php. In einigen Fällen mag das in Ordnung sein, aber die besten Praktiken würden das Speichern dieser Informationen in einer sichereren Weise diktieren. Es gibt wirklich keinen guten Grund, den Best Practices beim Schutz Ihrer Anmeldeinformationen nicht zu folgen.

Einige empfehlen, sie in der database als Option zu speichern, bieten aber dieselben Sicherheitsprobleme, je nachdem, wie viele administrative Benutzer Ihre Site hat und ob diese Benutzer diese Anmeldedaten sehen können. Dies ist auch der Grund, kein Plugin dafür zu verwenden.

Der beste Weg dies zu tun ist, Konstanten für die phpmailer info in Ihrer wp-config.php Datei zu definieren. Dies wurde tatsächlich als Feature in der Mail-Komponente diskutiert , wurde aber zu diesem Zeitpunkt noch nicht als tatsächliche Erweiterung akzeptiert. Aber Sie können es selbst tun, indem Sie wp-config.php hinzufügen:

 /** * Set the following constants in wp-config.php * These should be added somewhere BEFORE the * constant ABSPATH is defined. */ define( 'SMTP_USER', 'user@example.com' ); // Username to use for SMTP authentication define( 'SMTP_PASS', 'smtp password' ); // Password to use for SMTP authentication define( 'SMTP_HOST', 'smtp.example.com' ); // The hostname of the mail server define( 'SMTP_FROM', 'website@example.com' ); // SMTP From email address define( 'SMTP_NAME', 'eg Website Name' ); // SMTP From name define( 'SMTP_PORT', '25' ); // SMTP port number - likely to be 25, 465 or 587 define( 'SMTP_SECURE', 'tls' ); // Encryption system to use - ssl or tls define( 'SMTP_AUTH', true ); // Use SMTP authentication (true|false) define( 'SMTP_DEBUG', 0 ); // for debugging purposes only set to 1 or 2 

Sobald diese in der wp-config.php definiert sind, können sie überall verwendet werden, indem die definierte Konstante verwendet wird. Sie können diese also in einer Plugin-Datei oder in Ihrer functions.php verwenden. (Verwenden Sie für das OP eine Plugin-Datei.)

 /** * This function will connect wp_mail to your authenticated * SMTP server. Values are constants set in wp-config.php */ add_action( 'phpmailer_init', 'send_smtp_email' ); function send_smtp_email( $phpmailer ) { $phpmailer->isSMTP(); $phpmailer->Host = SMTP_HOST; $phpmailer->SMTPAuth = SMTP_AUTH; $phpmailer->Port = SMTP_PORT; $phpmailer->Username = SMTP_USER; $phpmailer->Password = SMTP_PASS; $phpmailer->SMTPSecure = SMTP_SECURE; $phpmailer->From = SMTP_FROM; $phpmailer->FromName = SMTP_NAME; } 

Es gibt ein wenig mehr Details dazu in diesem Post und ein Git auf Github hier .