問題描述

我想在我的網站上發送電子郵件添加一個標題,所以我可以很容易地確定哪個站點發送給定的電子郵件。 (我在我所有的網站上放置了一個標準的功能插件,所以這很簡單,配置我的電子郵件客户端過濾,否則在這個標題上行事將是一個驚人的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。