问题描述
我想在我的网站上发送电子邮件添加一个标题,所以我可以很容易地确定哪个站点发送给定的电子邮件。 (我在我所有的网站上放置了一个标准的功能插件,所以这很简单,配置我的电子邮件客户端过滤,否则在这个标题上行事将是一个惊人的 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。