Як встановити SMTP програмно


18

Припустимо, що у нас є порожній WP-сайт, і ми хочемо програмно налаштувати параметри SMTP у нашому плагіні чи темі. Що найпростіше зробити це без зміни основних файлів?

Відповіді:


31

Перш за все, якщо ми подивимось на реалізацію wp_mailфункції, то побачимо, що ця функція використовує PHPMailerклас для надсилання електронних листів. Також ми могли помітити, що існує жорсткий зашифрований виклик функції $phpmailer->IsMail();, який встановлює використання mail()функції PHP . Це означає, що ми не можемо використовувати параметри 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 = 'your_username@example.com'; // 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();
}

І це все.


Гарні речі, Євгене, THX! Я думаю, що ці 10 рядків коду можуть замінити весь плагін SMTP ... (?)
brasofilo

@brasofilo thx! Я думаю, що він не може замінити плагін SMTP, оскільки плагін дозволяє налаштувати налаштування на панелі адміністратора. Цей фрагмент є лише найкращою практикою щодо того, як "змінити налаштування електронної пошти програмно", не порушуючи основні файли або не перезаписуючи wp_mailфункцію.
Євген Мануїлов

2
Де цей код слід розмістити? Я хочу змусити всі мої теми використовувати однакові SMTP-сервери.
Анян

1
Дуже дивно, що WP не робить це простіше, як ви могли б подумати, було б звичайним змінити це.
Карсон Рейнке

1
це працює для мене, @JackNicholson ви також повинні перевірити це на своєму кінці.
Євген Мануїлов

7

Доповнення до відповіді @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()
        );
}

Сховище

Обидва плагіни доступні в цьому Gist на GitHub , тому розгляньте можливість перевірити ці додатки, щоб отримати оновлення.


3

Інші відповіді на цю публікацію, надаючи робоче рішення, не вирішуйте питання безпеки зберігання ваших облікових записів SMTP у файлі плагіна або function.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',   'user@example.com' );    // 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',   'website@example.com' ); // 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, їх можна використовувати в будь-якому місці, використовуючи визначену константу. Таким чином, ви можете використовувати їх у файлі плагіна або у вашій функції.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 тут .


По-справжньому гарне рішення!
Філл Хелі

1
Невелике доповнення: Потрібно говорити, що не зберігайте облікові дані в контролі версій. Використовуйте натомість gitignored .envфайл. Але ніхто, хто не ставить нічого чутливого, wp-config.phpне використовує керування версіями…
jsphpl,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.