WordPress用wp_mail发HTML邮件时<link>标签被移除如何解决?
WordPress wp_mail发送HTML邮件时保留标签的解决方法
问题原因
你遇到的标签被移除,本质是两个层面的问题:
- 如果你是通过
strip_tags或者WordPress内置的wp_kses系列函数过滤邮件内容,未将<link>标签及其需要的rel、href属性加入允许列表时,标签会被自动过滤。 - 补充注意:就算成功保留
<link>标签,绝大多数主流邮件客户端(Gmail、Outlook、国内邮箱等)都默认屏蔽外部CSS资源引入,样式依然不会生效,这是HTML邮件的通用兼容性规则,和wp_mail本身无关。
解决步骤
1. 优先推荐:替换外部为内联样式
这是兼容性最高的方案,完全避免标签被过滤的问题,同时适配所有邮件客户端:
- 把
normal.css中的所有样式直接复制到邮件<head>的<style>块内 - 更稳妥的方式是直接将所有样式转换为标签的行内
style属性,完全不依赖外部或头部样式
修正后的发件代码示例:
$emailTo = 'abc@abc.com'; $subject = 'Updated about the process'; $headers = array( 'Content-Type: text/html; charset=UTF-8', 'From: xyz@xyz.com' ); $body = '<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style> /* 此处粘贴normal.css中所有邮件相关的样式 */ .flrow { /* 原有样式 */ } .lar_overflow { /* 原有样式 */ } .flexooa.lar-line-header { /* 原有样式 */ } </style> </head> <body>'; $body .= '<div class="flrow lar_overflow">'; $body .= '<div class="flexooa lar-line-header">Recent History</div>'; $body .= '<div class="flexiia lar-line-header"></div>'; $body .= '<div class="flexooa lar-line-header hlast"></div>'; $body .= '</body></html>'; // 不需要重复设置内容类型,headers中已经声明即可 wp_mail($emailTo, $subject, $body, $headers);
2. 如必须保留标签的解决方法
如果确实需要保留外部CSS引入的标签,按以下步骤调整:
- 检查自定义的
wpse_allowedtags()函数,确保已经添加<link>标签及其所需属性,示例配置:
function wpse_allowedtags() { return array( 'div' => array( 'class' => array() ), 'h3' => array(), // 添加link标签和允许的属性 'link' => array( 'rel' => array(), 'href' => array() ), // 其他你需要保留的HTML标签 ); }
- 排查是否有其他主题、插件挂载了
wp_mail相关的过滤器,对邮件内容做了额外的安全过滤,导致标签被移除。 - 修正现有代码的语法错误:原代码中
$body=$body.$'<div...多了多余的$符号,改为$body .= '<div...即可。
内容的提问来源于stack exchange,提问作者adang
相关产品推荐
相关产品推荐

