SMTP प्रोग्रामेटिकली कैसे सेट करें


18

मान लें कि हमारे पास रिक्त WP साइट है और हम SMTP सेटिंग्स को अपने प्लगइन या थीम में प्रोग्रामेटिक रूप से सेटअप करना चाहते हैं। कोर फ़ाइलों को बदलने के बिना इसे करने का सबसे आसान तरीका क्या है?

जवाबों:


31

सबसे पहले, यदि हम 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 = '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! मुझे लगता है कि यह एसएमटीपी प्लगइन को स्थानापन्न नहीं कर सकता, क्योंकि प्लगइन आपको व्यवस्थापक पैनल पर सेटिंग्स कॉन्फ़िगर करने की अनुमति देता है। यह स्निपेट केवल कोर फ़ाइलों को तोड़ने के बिना या पुनर्लेखन 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 अपवाद

डिफ़ॉल्ट रूप से वर्डप्रेस आपको कोई डीबग आउटपुट नहीं देता है। इसके बजाय 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 पर इस Gist में प्लगइन्स दोनों उपलब्ध हैं , इसलिए किसी भी अपडेट को हथियाने के लिए उन प्लगइन्स को वहां से चेक करने पर विचार करें।


3

इस पोस्ट के अन्य उत्तर, कार्यशील समाधान प्रदान करते समय, आपके SMTP क्रेडेंशियल्स को एक प्लगइन फ़ाइल या फ़ंक्शन में संग्रहीत करने के सुरक्षा मुद्दे को संबोधित नहीं करते हैं। कुछ मामलों में जो ठीक हो सकते हैं, लेकिन सर्वोत्तम अभ्यास इस जानकारी को अधिक सुरक्षित तरीके से संग्रहीत करते हैं। जब आपके क्रेडेंशियल्स की रक्षा करने की बात आती है तो वास्तव में सर्वोत्तम प्रथाओं का पालन नहीं करने का एक अच्छा कारण नहीं है।

कुछ लोग इसे एक विकल्प के रूप में DB में सहेजने का सुझाव देंगे, लेकिन आपकी साइट पर जितने भी प्रशासनिक उपयोगकर्ता हैं, और उन उपयोगकर्ताओं को इन लॉगिन क्रेडेंशियल्स को देखने में सक्षम होना चाहिए, इस पर निर्भर करता है। इसके लिए प्लगइन का उपयोग न करने का भी यही कारण है।

इसका सबसे अच्छा तरीका है कि आप अपनी wp-config.php फ़ाइल में phpmailer जानकारी के लिए स्थिरांक को परिभाषित करें। यह वास्तव में मेल घटक में एक विशेषता के रूप में चर्चा की गई है , लेकिन इस समय एक वास्तविक वृद्धि के रूप में स्वीकार नहीं किया गया है। लेकिन आप इसे 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 में परिभाषित हो जाते हैं, तो उन्हें परिभाषित स्थिरांक का उपयोग करके कहीं भी उपयोग किया जा सकता है। तो आप एक प्लगइन फ़ाइल में या अपने कार्यों में उपयोग कर सकते हैं। (ओपी के लिए विशिष्ट, एक प्लगइन फ़ाइल का उपयोग करें।)

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

इस पोस्ट में इस पर थोड़ा और विस्तार है और यहाँ जीथब पर एक जिस्ट


एक बहुत अच्छा समाधान!
फिल हिले

1
छोटा जोड़: कहने की जरूरत नहीं, संस्करण नियंत्रण में क्रेडेंशियल्स को संग्रहीत न करें। .envइसके बजाय gitignored फ़ाइल का उपयोग करें । लेकिन कोई भी जो कुछ भी संवेदनशील नहीं रखता है wp-config.phpवह संस्करण नियंत्रण का उपयोग कर रहा है, वैसे भी ...
jsphpl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.