如何在外发电子邮件中添加标题?

时间:2016-03-25 作者:David E. Smith

我想在我的网站上为发送的电子邮件添加一个额外的标题,以便我可以轻松确定哪个网站发送了给定的电子邮件。(我在我所有的网站上都放了一个标准的功能插件,所以这很容易做到,而配置我的电子邮件客户端来过滤和处理这个标题将是一个惊人的节省时间的方法。)

我想这将是一个插入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,并且格式不好。这很有意义,因为GF添加的内容类型:header已被删除。但我的标题被添加到了电子邮件中。由于其他人也依赖于收到漂亮的电子邮件(我相信我网站的所有内容开发人员和最终用户,以及其他人),这是不可接受的。

然后,我的一位同事建议通过wp\\u parse\\u 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);
}
这样一来,就好像我的函数不存在了——我的标题没有添加,但其他人的标题和邮件设置也没有被删除。

在不干扰任何其他可能存在的过滤器的情况下,向传出的电子邮件添加标题的正确方法是什么?

3 个回复
最合适的回答,由SO网友:David E. Smith 整理而成

由于上述原因,我意识到了我的中心错误——我没有完全意识到传入的参数是多维数组。

目前,我已经重新实现了该函数:

function ws_add_site_header($email) {
    $email[\'headers\'][] = \'X-WU-Site: \' . parse_url(get_site_url(), PHP_URL_HOST) ;
    return $email;               
}
我对wp\\u mail()源的读取(请参阅:https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/pluggable.php#L235) 这让我相信headers组件可以是一个数组,或者一个大字符串,或者可能是这两者的可怕混搭,但使用数组可能是更安全/更正确的选择。

我确实喜欢phpmailer的各种回答,但使用WordPress的内置功能似乎更简洁了一些。

SO网友:birgire

下面是一个直接使用AddCustomHeader 的方法PHPMailer 实例:

/**
 * 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 非空:

add_action( \'phpmailer_init\', function( $phpmailer )
{   
    $phpmailer->AddCustomHeader( 
       \'X-WU-Site\', parse_url( get_site_url(), PHP_URL_HOST ) 
    );  
} );

SO网友:Sumit

PHPheaders 是字符串。您不能将它们解析为数组。您需要添加额外的标题作为字符串\\r\\n 以确保它添加到下一行中。

示例:

add_filter(\'wp_mail\', \'ws_add_site_header\', 99);
function ws_add_site_header($args) {
    $args[\'headers\'] .= !empty($args[\'headers\']) ? "\\r\\n" : \'\';
    $args[\'headers\'] .= \'X-WU-Site: \' . parse_url(get_site_url(), PHP_URL_HOST);
    return $args;
}
另外请注意,最后请优先添加其他标题99 因此,如果没有检查标头是否已经存在,则没有其他插件可以替换它。如果需要,就做吧999.

相关推荐

WP_Query filters

这个问题可能看起来很愚蠢,但我真的没有找到有用的链接。我正在尝试做一个简单的查询,在这里我选择了最近的10篇文章,我希望能够在循环中只显示这10篇文章中的1篇我的代码看起来像 // Query latest 10 records $the_query = new WP_Query( array( \'post_type\' => \'post\', \"order\" => \"DESC\", \'posts_per_page