मान लें कि हमारे पास रिक्त WP साइट है और हम SMTP सेटिंग्स को अपने प्लगइन या थीम में प्रोग्रामेटिक रूप से सेटअप करना चाहते हैं। कोर फ़ाइलों को बदलने के बिना इसे करने का सबसे आसान तरीका क्या है?
मान लें कि हमारे पास रिक्त WP साइट है और हम SMTP सेटिंग्स को अपने प्लगइन या थीम में प्रोग्रामेटिक रूप से सेटअप करना चाहते हैं। कोर फ़ाइलों को बदलने के बिना इसे करने का सबसे आसान तरीका क्या है?
जवाबों:
सबसे पहले, यदि हम 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();
}
और बस यही।
wp_mail
समारोह के बिना "ईमेल सेटिंग्स को प्रोग्रामेटिक रूप से कैसे बदलें" के बारे में सबसे अच्छा अभ्यास है ।
@EugeneManuilov उत्तर के अलावा।
डिफ़ॉल्ट रूप से वे केवल प्राप्त कर सकते हैं - जैसा कि @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
}
डिफ़ॉल्ट रूप से वर्डप्रेस आपको कोई डीबग आउटपुट नहीं देता है। इसके बजाय 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 में प्लगइन्स दोनों उपलब्ध हैं , इसलिए किसी भी अपडेट को हथियाने के लिए उन प्लगइन्स को वहां से चेक करने पर विचार करें।
इस पोस्ट के अन्य उत्तर, कार्यशील समाधान प्रदान करते समय, आपके 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;
}
इस पोस्ट में इस पर थोड़ा और विस्तार है और यहाँ जीथब पर एक जिस्ट ।
.env
इसके बजाय gitignored फ़ाइल का उपयोग करें । लेकिन कोई भी जो कुछ भी संवेदनशील नहीं रखता है wp-config.php
वह संस्करण नियंत्रण का उपयोग कर रहा है, वैसे भी ...