PHPMailer发送含@media媒体查询的HTML邮件时代码被移除如何解决?
解决方案
1. 优先处理Tiny编辑器的过滤规则
Tiny默认会拦截@media等非行内样式代码,先修改编辑器初始化配置,放开样式过滤:
tinymce.init({ // 保留你原有配置,新增以下内容 extended_valid_elements: 'style[media|type]', valid_children: '+head[style],+html[head]', verify_html: false });
配置修改后重新编辑邮件正文,存入数据库前先打印输出$mail_body,确认媒体查询代码已经完整写入数据库。
2. 排除内容读取转义问题
从数据库读取邮件正文后,先打印$row['description'],确认媒体查询代码正常读出,没有被PHP默认转义或者数据库转义吃掉,如有转义则用htmlspecialchars_decode()处理:
$mail_body = htmlspecialchars_decode($row['description']);
3. 修正PHPMailer配置
PHPMailer 5.2本身不会主动过滤HTML内容,你当前的配置只需要调整赋值顺序即可:把$mail->IsHTML(true)放在$mail->Body赋值前面,避免内容被当成纯文本处理:
$mail->IsHTML(true); // 先声明是HTML内容 $mail->Body = $msg; // 再赋值正文
4. 兼容备选方案
如果仍有客户端过滤媒体查询,改用邮件通用适配方案:
- 所有核心样式全部写在行内,这是所有邮件客户端兼容性最好的写法
- 容器宽度用
width:100%;max-width:600px的写法,不需要媒体查询即可实现基础自适应 - 隐藏内容用
mso-hide:all等邮件专属兼容属性实现,避免依赖媒体查询
内容的提问来源于stack exchange,提问作者Mantykora 7
相关产品推荐
相关产品推荐

