web-dev-qa-db-fra.com

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

Supposons que nous ayons un site WP vierge et que nous souhaitons configurer les paramètres SMTP par programme dans notre plug-in ou notre thème. Quelle est la façon la plus simple de le faire sans modifier les fichiers principaux?

17
Eugene Manuilov

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

Pour y parvenir, nous devons avoir accès à la variable $phpmailer. Et nous arrivons à l’action phpmailer_init qui est appelée avant d’envoyer un courrier électronique. 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.

30
Eugene Manuilov

Ajout à la réponse de @EugeneManuilov.

Paramètres SMTP

Par défaut, ceux-ci ne peuvent être configurés que - @EugeneManuilov ayant déjà été répondus - lors d'un rappel attaché à un do_action_ref_array(). Source/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
}

Exceptions SMTP

Par défaut, WordPress ne vous donne aucune sortie de débogage. Au lieu de cela, il retourne 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()
        );
}

Dépôt

Les plugins sont tous deux disponibles dans ce Gist sur GitHub , alors pensez à vérifier ces plugins à partir de là pour récupérer les mises à jour.

7
kaiser

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 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 d'identification 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 phpmailer dans votre fichier wp-config.php. Ceci a en fait été discuté comme une fonctionnalité du composant Mail , mais n’a pas été accepté comme une amélioration réelle pour le moment. 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 de 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 y a un peu plus de détails sur ceci dans ce post et un Gist sur github ici .

3
butlerblog