Cách dễ nhất để thiết lập cài đặt SMTP theo lập trình là gì?


18

Giả sử chúng tôi có trang WP trống và chúng tôi muốn thiết lập cài đặt SMTP theo chương trình trong plugin hoặc chủ đề của chúng tôi. Cách dễ nhất để làm điều đó mà không thay đổi các tập tin cốt lõi là gì?

Câu trả lời:


31

Trước hết, nếu chúng ta xem xét việc thực hiện wp_mailchức năng, chúng ta sẽ thấy rằng hàm này sử dụng PHPMailerlớp để gửi email. Ngoài ra, chúng ta có thể nhận thấy rằng có một lệnh gọi hàm được mã hóa cứng $phpmailer->IsMail();, thiết lập để sử dụng mail()hàm của PHP . Điều đó có nghĩa là chúng ta không thể sử dụng cài đặt SMTP với nó. Chúng ta cần gọi isSMTPchức năng của PHPMailerlớp. Và chúng ta cũng cần phải thiết lập cài đặt SMTP của mình.

Để đạt được nó, chúng ta cần có quyền truy cập vào $phpmailerbiến. Và ở đây chúng tôi đi đến phpmailer_inithành động được gọi trước khi gửi email. Vì vậy, chúng tôi có thể làm những gì chúng tôi cần bằng cách viết trình xử lý hành động của chúng tôi:

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

Và đó là tất cả.


Những thứ tốt đẹp, Eugene, thx! Tôi đoán 10 dòng mã này có thể thay thế toàn bộ plugin SMTP ... (?)
brasofilo

@brasofilo thx! Tôi nghĩ rằng nó không thể thay thế một plugin SMTP, bởi vì plugin cho phép bạn định cấu hình cài đặt tại bảng quản trị. Đoạn mã này chỉ là cách thực hành tốt nhất về "cách thay đổi cài đặt email theo chương trình" mà không phá vỡ các tệp cốt lõi hoặc không có wp_mailchức năng viết lại .
Eugene Manuilov

2
Mã này nên được đặt ở đâu? Tôi muốn làm cho tất cả các chủ đề của mình sử dụng cùng một máy chủ SMTP.
Anjan

1
WP rất lạ không làm điều này dễ dàng hơn vì bạn nghĩ nó sẽ là phổ biến để sửa đổi điều này.
Carson Rebke

1
nó hoạt động với tôi, @JackNicholson bạn cũng nên kiểm tra nó.
Eugene Manuilov

7

Ngoài câu trả lời @EugeneManuilov.

Cài đặt SMTP

Theo mặc định, những người chỉ có thể nhận được - như @EugeneManuilov đã trả lời - được đặt trong khi gọi lại được đính kèm do_action_ref_array(). Nguồn / lõi .

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

Ngoại lệ SMTP

Mỗi mặc định WordPress không cung cấp cho bạn bất kỳ đầu ra gỡ lỗi nào. Thay vào đó, nó chỉ trả về FALSEnếu xảy ra lỗi. Đây là plugin nhỏ để khắc phục điều này:

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

Kho

Các plugin đều có sẵn trong GistHub này trên GitHub , vì vậy hãy xem xét việc kiểm tra các plugin đó từ đó để lấy bất kỳ bản cập nhật nào.


3

Các câu trả lời khác cho bài đăng này, trong khi cung cấp giải pháp hoạt động, không giải quyết vấn đề bảo mật lưu trữ thông tin đăng nhập SMTP của bạn trong tệp plugin hoặc hàm.php. Trong một số trường hợp có thể ổn, nhưng thực tiễn tốt nhất sẽ ra lệnh lưu trữ thông tin này theo cách an toàn hơn. Thực sự không có lý do chính đáng để không tuân theo các thực tiễn tốt nhất khi nói đến việc bảo vệ thông tin đăng nhập của bạn.

Một số người đề nghị lưu nó vào DB dưới dạng tùy chọn, nhưng cũng cung cấp các vấn đề bảo mật tương tự tùy thuộc vào số lượng người dùng quản trị trang web của bạn và liệu những người dùng đó có thể xem các thông tin đăng nhập này hay không. Đây cũng là lý do tương tự để không sử dụng plugin cho việc này.

Cách tốt nhất để làm điều này là xác định các hằng số cho thông tin phpmailer trong tệp wp-config.php của bạn. Điều này thực sự đã được thảo luận như là một tính năng trong Thành phần Thư , nhưng chưa được chấp nhận như là một cải tiến thực tế tại thời điểm này. Nhưng bạn có thể tự làm điều đó bằng cách thêm phần sau vào 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

Khi chúng được định nghĩa trong wp-config.php, chúng có thể được sử dụng ở bất cứ đâu bằng cách sử dụng hằng số được xác định. Vì vậy, bạn có thể sử dụng những người trong một tập tin plugin hoặc trong hàm.php. (Cụ thể đối với OP, sử dụng tệp 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;
}

Có một chi tiết nhỏ hơn về điều này trong bài viết này và một ý chính trên github ở đây .


Một giải pháp thực sự tốt!
Phill Healey

1
Bổ sung nhỏ: Không cần phải nói, không lưu trữ thông tin đăng nhập trong kiểm soát phiên bản. Sử dụng .envtập tin gitignored thay thế. Nhưng không ai đặt bất cứ điều gì nhạy cảm vào wp-config.phpviệc sử dụng kiểm soát phiên bản, dù sao thì
jsphpl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.