¿Cuál es la forma más fácil de configurar los ajustes SMTP mediante programación?

17

Supongamos que tenemos un sitio WP en blanco y queremos configurar los ajustes SMTP mediante programación en nuestro complemento o tema. ¿Cuál es la forma más fácil de hacerlo sin cambiar los archivos principales?

    
pregunta Eugene Manuilov 13.12.2012 - 09:48

3 respuestas

29

En primer lugar, si echamos un vistazo a la implementación de la función wp_mail , veremos que esta función utiliza PHPMailer para enviar correos electrónicos. También pudimos notar que hay una función codificada de forma rígida llamada $phpmailer->IsMail(); , que establece el uso de la función mail() de PHP. Esto significa que no podemos usar la configuración SMTP con él. Necesitamos llamar a la función isSMTP de la clase PHPMailer . Y también tenemos que establecer nuestra configuración SMTP también.

Para lograrlo necesitamos obtener acceso a la variable $phpmailer . Y aquí llegamos a la acción phpmailer_init que se llama antes de enviar un correo electrónico. Así que podemos hacer lo que necesitamos escribiendo nuestro controlador de acción:

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

Y eso es todo.

    
respondido por el Eugene Manuilov 13.12.2012 - 09:48
7

Adición a la respuesta de @EugeneManuilov.

Configuración de SMTP

Por defecto, solo se pueden configurar, como @EugeneManuilov ya respondió, se pueden establecer durante una devolución de llamada asociada a 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
}

Excepciones SMTP

Por defecto, WordPress no le da ningún resultado de depuración. En su lugar, simplemente devuelve FALSE si se produce un error. Aquí hay un pequeño complemento para solucionar esto:

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

Repositorio

Los dos complementos están disponibles en este Gist en GitHub , así que considera la posibilidad de revisar esos complementos desde allí. para agarrar cualquier actualización.

    
respondido por el kaiser 22.06.2013 - 12:17
3

Las otras respuestas a esta publicación, mientras brindan una solución funcional, no abordan el problema de seguridad de almacenar sus credenciales SMTP en un archivo de plugin o functions.php. En algunos casos puede estar bien, pero las mejores prácticas dictarían almacenar esta información de una manera más segura. Realmente no hay una buena razón para no seguir las mejores prácticas cuando se trata de proteger sus credenciales.

Algunos sugerirían que lo guarden en la base de datos como una opción, pero también ofrece los mismos problemas de seguridad según la cantidad de usuarios administrativos que tenga su sitio y si esos usuarios deberían poder ver estas credenciales de inicio de sesión. Esta es también la misma razón para no usar un complemento para esto.

La mejor manera de hacer esto es definir constantes para la información phpmailer en su archivo wp-config.php. Esto en realidad se ha discutido como como una característica en el Componente de correo , pero no se ha aceptado como una mejora real en esta vez. Pero puede hacerlo usted mismo agregando lo siguiente a 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

Una vez que se definen en wp-config.php, se pueden usar en cualquier lugar utilizando la constante definida. Así que puedes usarlos en un archivo de complemento o en tus funciones.php. (Específico para el OP, use un archivo de complemento).

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

Hay un poco más de detalles sobre este en esta publicación y una gist en github aquí .

    
respondido por el butlerblog 10.08.2017 - 17:57

Lea otras preguntas en las etiquetas