Quel est le moyen le plus simple de configurer les paramètres SMTP par programme?

17

Supposons que nous ayons un site WP vide et que nous souhaitons configurer les paramètres SMTP par programme dans notre plugin ou thème. Quelle est la façon la plus simple de le faire sans changer les fichiers de base?

    
posée Eugene Manuilov 13.12.2012 - 09:48

3 réponses

29

Tout d'abord, si nous examinons l'implémentation de la fonction wp_mail , nous verrons que cette fonction utilise PHPMailer pour envoyer des courriers électroniques. Nous avons également remarqué qu'il existe une fonction codée, appelée $phpmailer->IsMail(); , qui définit l'utilisation de la fonction mail() de PHP. Cela signifie que nous ne pouvons pas utiliser les paramètres SMTP avec. Nous devons appeler isSMTP function de PHPMailer class. Nous devons également définir nos paramètres SMTP.

Pour y parvenir, nous devons avoir accès à la variable $phpmailer . Et nous arrivons à phpmailer_init action qui est appelée avant d’envoyer un email. Nous pouvons donc faire ce dont nous avons besoin en écrivant notre gestionnaire d’actions:

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();
}

Et c'est tout.

    
réponse donnée Eugene Manuilov 13.12.2012 - 09:48
7

Ajout à la réponse @EugeneManuilov.

Paramètres SMTP

Par défaut, ceux-ci ne peuvent être définis - comme @EugeneManuilov l’a déjà répondu - lors d’un rappel attaché à un do_action_ref_array() . Source / noyau .

<?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
}

Exceptions SMTP

Par défaut, WordPress ne vous donne aucune sortie de débogage. Au lieu de cela, il renvoie simplement FALSE si une erreur survient. Voici un petit plugin pour résoudre ce problème:

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

Référentiel

Les plug-ins sont tous deux disponibles dans ce Gist sur GitHub . Par conséquent, envisagez de vérifier ces plug-ins à partir de là. pour récupérer les mises à jour.

    
réponse donnée kaiser 22.06.2013 - 12:17
3

Les autres réponses à ce message, tout en offrant une solution efficace, ne traitent pas du problème de sécurité lié au stockage de vos informations d'identification SMTP dans un fichier plug-in ou un fichier functions.php. Dans certains cas, cela peut convenir, mais les meilleures pratiques dicteraient le stockage de ces informations de manière plus sécurisée. Il n'y a vraiment pas de bonne raison de ne pas suivre les meilleures pratiques en matière de protection de vos informations d'identification.

Certains suggèrent de l'enregistrer dans la base de données en option, mais soulèvent également les mêmes problèmes de sécurité en fonction du nombre d'utilisateurs administratifs de votre site et de la possibilité pour ces utilisateurs de voir ces informations de connexion. C’est aussi la même raison pour ne pas utiliser de plugin pour cela.

La meilleure façon de faire est de définir des constantes pour les informations de phpmailer dans votre fichier wp-config.php. Cela a en fait été discuté en tant que fonctionnalité du composant Mail , mais n'a pas été accepté comme une amélioration réelle sur cette fois. Mais vous pouvez le faire vous-même en ajoutant ce qui suit à wp-config.php:

/**
 * 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

Une fois que ceux-ci sont définis dans wp-config.php, ils peuvent être utilisés n’importe où en utilisant la constante définie. Donc, vous pouvez utiliser ceux-ci dans un fichier plugin ou dans votre functions.php. (Spécifique à l'OP, utilisez un fichier plugin.)

/**
 * 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;
}

Il existe un peu plus de détails sur ce dans cet article et un mention générique sur github ici .

    
réponse donnée butlerblog 10.08.2017 - 17:57

Lire d'autres questions sur les étiquettes