Как программно настроить SMTP


Предположим, у нас есть пустой WP-сайт, и мы хотим программно настроить параметры SMTP в нашем плагине или теме. Какой самый простой способ сделать это без изменения основных файлов?

Author: butlerblog, 2012-12-13

3 answers

Прежде всего, если мы посмотрим на реализацию функции wp_mail, мы увидим, что эта функция использует PHPMailer класс для отправки электронных писем. Также мы могли заметить, что существует жестко запрограммированный вызов функции $phpmailer->IsMail();, который устанавливает использование функции PHP mail(). Это означает, что мы не можем использовать с ним настройки SMTP. Нам нужно вызвать функцию isSMTP класса PHPMailer. А также нам также нужно установить наши настройки SMTP.

Для этого нам нужно получить доступ к переменной $phpmailer. И здесь мы подходим к действию phpmailer_init, которое вызывается перед отправкой электронного письма. Таким образом, мы можем сделать то, что нам нужно, написав наш обработчик действий:

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

И это все.

 34
Author: Eugene Manuilov, 2013-01-15 11:23:30

Дополнение к ответу @Eugenemanuilov.

Настройки SMTP

По умолчанию они могут быть установлены только - как уже ответил @Eugenemanuilov - во время обратного вызова, прикрепленного к do_action_ref_array(). Источник/ядро.

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

По умолчанию WordPress не предоставляет вам никаких отладочных выходных данных. Вместо этого он просто возвращает FALSE, если произошла ошибка. Вот небольшой плагин, чтобы исправить это:

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

Хранилище

Оба плагина доступны в этом Суть на GitHub, поэтому подумайте о том, чтобы проверить эти плагины оттуда, чтобы получить какие-либо обновления.

 8
Author: kaiser, 2014-12-09 11:32:12

Другие ответы на этот пост, предоставляя рабочее решение, не решают проблему безопасности хранения ваших учетных данных SMTP в файле плагина или functions.php . В некоторых случаях это может быть нормально, но лучшие практики требуют более безопасного хранения этой информации. На самом деле нет веской причины не следовать рекомендациям, когда дело доходит до защиты ваших учетных данных.

Некоторые предложили бы сохранить его в БД в качестве опции, но также предоставляют то же самое проблемы безопасности в зависимости от количества пользователей с правами администратора на вашем сайте и от того, должны ли эти пользователи видеть эти учетные данные для входа. Это также та же причина, по которой не следует использовать плагин для этого.

Лучший способ сделать это - определить константы для информации о phpmailer в вашем wp-config.php файл. На самом деле это обсуждалось как функция в почтовом компоненте, но в настоящее время не было принято в качестве фактического улучшения. Но вы можете сделать это сами, добавление следующего к 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

Как только они будут определены в wp-config.php , их можно использовать в любом месте, используя определенную константу. Таким образом, вы можете использовать их в файле плагина или в своем functions.php . (Для конкретной операции используйте файл плагина.)

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

Немного подробнее об этом в этом посте и суть на github здесь.

 5
Author: butlerblog, 2017-08-10 15:57:05