問題描述
假設我們有空白的 WP 站點,我們要以程式設計方式在我們的外掛或主題中設定 SMTP 設定。在不改變核心檔案的情況下,最簡單的方法是什麼?
最佳解決方案
首先,如果我們來看看 wp_mail 函式的實現,我們將看到這個函式使用 PHPMailer 類來傳送電子郵件。另外我們可以注意到有硬編碼函式呼叫 $phpmailer->IsMail();,它設定為使用 PHP 的 mail()函式。這意味著我們無法使用 SMTP 設定。我們需要呼叫 PHPMailer 類的 isSMTP 函式。而且我們也需要設定我們的 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();
}
就這樣。
次佳解決方案
加上 @EugeneManuilov 答案。
SMTP 設定
預設情況下,只有在 @EugeneManuilov 已經應答的情況下,才能在 do_action_ref_array()的回撥期間設定。 Source/core 。
<?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()
);
}
Repository
這個外掛都可以在這個 Gist on GitHub 中使用,所以請考慮從那裡檢查那些外掛以獲取任何更新。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。