问题描述

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