วิธีการตั้งค่า 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();
}

และนั่นคือทั้งหมดที่


สิ่งที่ดียูจีนขอบคุณ! ฉันเดานี้ 10 บรรทัดของรหัสที่สามารถใช้แทนปลั๊กอิน SMTP ทั้งหมด ... (?)
brasofilo

@ brasofilo ขอบคุณ! ฉันคิดว่ามันไม่สามารถแทนที่ปลั๊กอิน SMTP ได้เพราะปลั๊กอินช่วยให้คุณกำหนดการตั้งค่าที่แผงควบคุมระบบ ตัวอย่างนี้เป็นวิธีปฏิบัติที่ดีที่สุดเกี่ยวกับ "วิธีเปลี่ยนการตั้งค่าอีเมลโดยทางโปรแกรม" โดยไม่ทำให้ไฟล์หลักแตกหรือไม่มีwp_mailฟังก์ชันการเขียนใหม่
Eugene Manuilov

2
ควรวางรหัสนี้ไว้ที่ไหน ฉันต้องการทำให้ธีมทั้งหมดของฉันใช้เซิร์ฟเวอร์ SMTP เดียวกัน
Anjan

1
WP ที่แปลกมากไม่ได้ทำให้เรื่องนี้ง่ายขึ้นอย่างที่คิด
Carson Reinke

1
มันใช้งานได้สำหรับฉัน @JackNicholson คุณควรตรวจสอบเมื่อสิ้นสุดของคุณด้วย
Eugene Manuilov

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 พวกเขาสามารถใช้ที่ใดก็ได้โดยใช้ค่าคงที่ที่กำหนดไว้ ดังนั้นคุณสามารถใช้สิ่งเหล่านั้นในไฟล์ปลั๊กอินหรือใน functions.php ของคุณ (เฉพาะสำหรับ OP ให้ใช้ไฟล์ปลั๊กอิน)

/**
 * 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 ที่นี่


ทางออกที่ดีจริงๆ!
Phill Healey

1
เพิ่มเติมเล็กน้อย: ไม่จำเป็นต้องพูดอย่าเก็บข้อมูลรับรองไว้ในการควบคุมเวอร์ชัน ใช้.envไฟล์gitignored แทน แต่ไม่มีใครทำอะไรที่ไวต่อความรู้สึกได้wp-config.phpคือใช้การควบคุมเวอร์ชันแล้ว ...
jsphpl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.