it-swarm.com.de

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

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

17
Eugene Manuilov

Wenn wir uns zunächst die Implementierung der Funktion wp_mail ansehen, werden wir feststellen, dass diese Funktion PHPMailer class zum Senden von E-Mails verwendet. Wir konnten auch feststellen, dass es einen fest codierten Funktionsaufruf $phpmailer->IsMail(); gibt, der die Funktion mail() von PHP verwendet. Dies bedeutet, dass wir keine SMTP-Einstellungen verwenden können. Wir müssen die Funktion isSMTP der Klasse PHPMailer aufrufen. Und wir müssen auch unsere SMTP-Einstellungen vornehmen.

Um dies zu erreichen, müssen wir auf die Variable $phpmailer zugreifen. Und hier kommen wir zu phpmailer_init action, die aufgerufen wird, bevor eine E-Mail gesendet wird. Wir können also tun, was wir brauchen, indem wir unseren Action-Handler 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 = '[email protected]'; // 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.

30
Eugene Manuilov

Zusatz zu @EugeneManuilov Antwort.

SMTP-Einstellungen

Standardmäßig können diese nur - wie @EugeneManuilov bereits beantwortet hat - während eines Rückrufs gesetzt werden, der an eine do_action_ref_array() angehängt ist. Quelle/Kern .

<?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 WordPress keine Debug-Ausgabe aus. Stattdessen wird nur FALSE zurückgegeben, wenn ein Fehler aufgetreten ist. Hier ist ein kleines Plugin, um dies zu beheben:

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) PHPMailer Exceptions & SMTP
 * Description: WordPress by default returns <code>FALSE</code> instead of an <code>Exception</code>. 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. Sie sollten also die Plugins von dort aus überprüfen, um Updates zu erhalten.

7
kaiser

Bei den anderen Antworten auf diesen Beitrag handelt es sich zwar um eine funktionierende Lösung, es geht jedoch nicht um das Sicherheitsproblem beim Speichern Ihrer SMTP-Anmeldeinformationen in einer Plugin-Datei oder in functions.php. In einigen Fällen mag dies in Ordnung sein, aber die Best Practices schreiben eine sicherere Speicherung dieser Informationen vor. Es gibt wirklich keinen guten Grund, sich beim Schutz Ihrer Anmeldeinformationen nicht an bewährte Methoden zu halten.

Einige schlagen vor, es als Option in der Datenbank zu speichern, bieten jedoch auch die gleichen Sicherheitsprobleme, abhängig von der Anzahl der administrativen Benutzer auf Ihrer Site und davon, ob diese Benutzer diese Anmeldeinformationen sehen können sollen. Dies ist auch der gleiche Grund, kein Plugin dafür zu verwenden.

Der beste Weg, dies zu tun, besteht darin, Konstanten für die phpmailer-Informationen 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 eigentliche Verbesserung akzeptiert. Sie können dies jedoch selbst tun, indem Sie der Datei wp-config.php Folgendes hinzufügen:

/**
 * Set the following constants in wp-config.php
 * These should be added somewhere BEFORE the
 * constant ABSPATH is defined.
 */
define( 'SMTP_USER',   '[email protected]' );    // 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',   '[email protected]' ); // SMTP From email address
define( 'SMTP_NAME',   'e.g 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 wp-config.php definiert sind, können sie mit der definierten Konstante überall verwendet werden. 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 zu diesem in diesem Beitrag und einem Gist on Github hier .

3
butlerblog