如何将标题添加到外发电子邮件?


8

我想在网站上的外发电子邮件中添加其他标头,以便可以轻松确定哪个网站发送了给定的电子邮件。(我在所有站点上都安装了标准功能插件,因此这样做很容易,并且配置电子邮件客户端以进行过滤并以其他方式对此标头进行操作将节省大量时间。)

我以为插入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));
}

在这里,我的数组优先于修改邮件设置的其他任何内容(例如Gravity Forms),因此HTML电子邮件开始显示为裸HTML且格式不正确。这是有道理的,因为GF添加的Content-type:标头已清除。但是我的标头已添加到电子邮件中。由于其他人也依赖于收到漂亮的电子邮件(我敢肯定,我所有网站的内容开发人员和最终用户都是如此),所以这是不可接受的。

然后,我的一位同事建议通过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);
}

这样,就好像我的功能不存在一样-我的标头没有添加,但其他人的标头和邮件设置也没有删除。

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


如果您想使用简单的解决方案,请使用电子邮件页眉页脚免费Wordpress插件
Prashant Baldha,2016年

该插件实际上并不能解决问题。它在WordPress生成的电子邮件正文中添加了“标头”;我试图添加一个SMTP标头,这是完全不同的事情。
David E. Smith,

Answers:


7

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

现在,我已经重新实现了该功能:

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 )使我相信标题component可以是数组,也可以是大字符串,或者可能是两者的可怕混搭,但是使用数组可能是更安全/更正确的选择。

我确实喜欢各种phpmailer答案,但是尝试使用WordPress的内置功能似乎更干净一些。


6

这是一种直接使用实例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 ) 
    );  
} );

很高兴知道这个答案:)但是我很好奇,如果有人$args['headers'] = 'key: value'通过WP过滤器设置它会产生什么影响?
Sumit

据我所知,该phpmailer_init钩子的触发时间比wp_mail应用过滤器时触发的时间晚,并且还通过该AddCustomHeader()方法添加了该过滤器的自定义标头。@sumit
birgire

3

PHP headers是字符串。您不能将它们解析为数组。您需要添加其他标头作为字符串,\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


1
我仔细研究了wp_mail()的来源,显然可以将标头接受为数组或大块文本,有时还可以将两者混合在一起。通常不建议这样做,但这始终是一个选择。
David E. Smith,

@ DavidE.Smith是正确的。wp_mail接受标头参数组成的数组,WP将负责添加\ r \ n
Jan Beck

请注意,我没有提到接受PHP headers什么wp_mail。最后,标题是字符串。wp_mail接受什么不是问题!@JanBeck
Sumit

1
是的,这就是问题。为什么要显示PHP标头?
Jan Beck 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.