問題描述
我想在我的網站上傳送電子郵件新增一個標題,所以我可以很容易地確定哪個站點傳送給定的電子郵件。 (我在我所有的網站上放置了一個標準的功能外掛,所以這很簡單,配置我的電子郵件客戶端過濾,否則在這個標題上行事將是一個驚人的 time-saver) 。
我以為這將是插入 wp_mail 功能的一個簡單的事情,但顯然不是。
首先,我試過這個:
add_filter('wp_mail', 'ws_add_site_header');
function ws_add_site_header() {
return array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST));
}
在這裡,我的陣列優先於修改郵件設定的任何東西 (比如重力窗體),所以 HTML 電子郵件開始顯示為裸 HTML 而不是 nicely-formatted 。有意義的,因為 GF 被新增的 Content-type:標題被擦除。但是我的標題已新增到電子郵件中。由於其他人還依賴於收到漂亮的電子郵件 (我所有的網站的內容開發人員和 end-users 等),這是不可接受的。
我的同事之一建議透過 wp_parse_args() 路由我的東西,因此:
add_filter('wp_mail', 'ws_add_site_header');
function ws_add_site_header($args) {
$new_header = array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST));
return wp_parse_args($args, $new_header);
}
這樣,就好像我的功能不存在 – 我的標題沒有被新增,但是他人的標題和郵件設定都沒有被剝離。
向傳送電子郵件新增標題的正確方法是什麼,而不排除可能存在的任何其他過濾器?
最佳解決方案
這是一個直接使用 PHPMailer 例項的 AddCustomHeader 方法的替代方法:
/**
* Add a custom header.
* $name value can be overloaded to contain
* both header name and value (name:value)
* @access public
* @param string $name Custom header name
* @param string $value Header value
* @return void
*/
public function addCustomHeader($name, $value = null)
{
if ($value === null) {
// Value passed in as name:value
$this->CustomHeader[] = explode(':', $name, 2);
} else {
$this->CustomHeader[] = array($name, $value);
}
}
這裡我們可以看到有兩種方法可以使用它:
示例 1:
這裡我們只傳遞 $name 輸入字串中的標題資訊,它與: 分開
add_action( 'phpmailer_init', function( $phpmailer )
{
$phpmailer->AddCustomHeader(
'X-WU-Site: ' . parse_url( get_site_url(), PHP_URL_HOST )
);
} );
示例#2:
以下是 $name 和 $value non-empty:
add_action( 'phpmailer_init', function( $phpmailer )
{
$phpmailer->AddCustomHeader(
'X-WU-Site', parse_url( get_site_url(), PHP_URL_HOST )
);
} );
次佳解決方案
感謝上述,我已經意識到我的中心錯誤 – 我沒有意識到傳入的引數是一個 multi-dimensional 陣列。
現在我已經有了 re-implemented 的功能:
function ws_add_site_header($email) {
$email['headers'][] = 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST) ;
return $email;
}
我讀過的這個 wp_mail() 原始碼 (參見:https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/pluggable.php#L235) 讓我相信頭部元件可以是一個陣列或一個大字串,或者可能是兩個可怕的 mish-mash,但使用陣列可能是更安全/更正確的選項。
我喜歡各種 phpmailer 的答案,但它似乎有點乾淨,嘗試使用 WordPress’ 內建 s 做的事情。
第三種解決方案
PHP headers 是字串。您無法將其解析為陣列。您需要使用 rn 將附加標題新增為字串,以確保在下一行新增。
例:
add_filter('wp_mail', 'ws_add_site_header', 99);
function ws_add_site_header($args) {
$args['headers'] .= !empty($args['headers']) ? "rn" : '';
$args['headers'] .= 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST);
return $args;
}
還請注意,最後新增附加標題,優先順序為 99,所以沒有其他外掛可以替換它,如果它不檢查頭已經存在。如果需要,使其成為 999 。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。