Web应用邮件通知长列表格式丢失问题求助
邮件列表条目达17-18条时格式失效问题排查
问题现象
Web应用发送含列表的邮件通知,条目较少时格式正常;条目数达到17-18条左右时,HTML和纯文本格式均完全失效。
已做排查动作
- 采用内联CSS样式
- 用PHP
wordwrap($text, 70, "\r\n")控制每行字符数≤70 - 确认DOM结构完整,所有标签均正确闭合
- 通过JS
replace(/[^a-zа-яё0-9()\s]/gi, ' ')移除特殊字符 - 测试HTML格式和纯文本空格分隔两种方式,问题均出现
- 同一服务器下,发送复杂大表格的邮件脚本运行正常
失效邮件源码
From () 2022-07-18 17:50:57 +0000 Received: from myt5-173186d592cd.qloud-c.yandex.net (myt5-173186d592cd.qloud-c.yandex.net [2a02:6b8:c12:1723:0:640:1731:86d5]) by g3osc2prw3r22pij.myt.yp-c.yandex.net with LMTP id gBanqaR2b3-SCZ0KBY0 for <mailbox@yandex.ru>; Mon, 18 Jul 2022 20:50:57 +0300 Received: from web-relay.nicmail.ru (web-relay.nicmail.ru [91.189.116.19]) by myt5-173186d592cd.qloud-c.yandex.net (mxfront/Yandex) with ESMTP id znqnbd3WFP-oueeu90s; Mon, 18 Jul 2022 20:50:56 +0300 Return-Path: mailbox@server.ru X-Yandex-Fwd: 1 Authentication-Results: myt5-173186d592cd.qloud-c.yandex.net; spf=pass (myt5-173186d592cd.qloud-c.yandex.net: domain of server.ru designates 91.189.116.19 as permitted sender, rule=[ip4:91.189.116.0/24]) smtp.mail=mailbox@server.ru X-Yandex-Spam: 1 X-Yandex-Uid-Status: 1 1561449865 X-DKIM: Exim 4.94.2 on web-relay.nicmail.ru Received: from [10.1.115.211] (port=52242 helo=server.ru) by web-relay.nicmail.ru with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from <mailbox@server.ru>) id 1oDUtU-0005Kq-7k for mailbox@yandex.ru; Mon, 18 Jul 2022 20:50:56 +0300 Received: from admin by server.ru with local (Exim 4.94.2) (envelope-from <mailbox@server.ru>) id 1oDUtU-000Gc7-0a for mailbox@yandex.ru; Mon, 18 Jul 2022 20:50:56 +0300 To: Денис Петров — УК <mailbox@yandex.ru> Subject: Заказ на продукты и расходные материалы MIME-Version: 1.0 Content-type: text/html; charset=utf-8 From: Моя пекарня <noreply@server.ru> Message-Id: <E1oDUtU-000Gc7-0a@server.ru> Date: Mon, 18 Jul 2022 20:50:56 +0300 X-KLMS-AntiSpam-Auth: dkim=none X-MS-Exchange-Organization-SCL: -1 X-Yandex-Forward: a022c9e0e9760536b4202c7f58420048 <html style="background-image: url(http://server.ru/.../images/satin.jpg); padding: 0 0 20pt 0; margin: 0; width: 100%;"><body style="background-image: url(http://server.ru/.../images/0066-512x512.jpg); border: 2px solid black; font-family: monospace; color: #555; margin: 10pt auto 80pt auto; padding: 20pt 5pt 20pt 5pt; max-width: 500px; width: 70%; box-shadow: 4px 4px 8px 0px rgba(34, 60, 60, 0.55); -webkit-mask: linear-gradient(#000 0 0) center/100% calc(100% - 8px) no-repeat, radial-gradient(circle 2px at 75% 0%,#0000 98%,#000) 50% 2px/8px 2px repeat-x, radial-gradient(circle closest-side at 25% 50%,#000 99%,#0000 101%) top/8px 4px repeat-x, radial-gradient(circle 2px at 75% 100%,#0000 98%,#000) 50% calc(100% - 2px)/8px 2px repeat-x, radial-gradient(circle closest-side at 25% 50%,#000 99%,#0000 101%) bottom/8px 4px repeat-x; mask: linear-gradient(#000 0 0) center/100% calc(100% - 8px) no-repeat, radial-gradient(circle 2px at 75% 0%,#0000 98%,#000) 50% 2px/8px 2px repeat-x, radial-gradient(circle closest-side at 25% 50%,#000 99%,#0000 101%) top/8px 4px repeat-x,radial-gradient(circle 2px at 75% 100%,#0000 98%,#000) 50% calc(100% - 2px)/8px 2px repeat-x, radial-gradient(circle closest-side at 25% 50%,#000 99%,#0000 101%) bottom/8px 4px repeat-x;"><table style="width: 100%; margin: 20pt 0pt 0pt 0pt;"><tr><td rowspan="2" style="text-align: center; vertical-align: middle; width:40pt; height:27pt;"><span style="display:inline-block; border-radius: 30pt; padding: 0pt 10pt; background-color:#000000; color: white; font-size:30pt; font-family: monospace;">И</span></td> <td style="font-family:monospace; padding-left:20pt; color: #555; font-weight: bolder;">Заказ на ингредиенты, инвентарь</td></tr> <tr><td style="font-family:monospace; padding-left:20pt; color: #555; font-weight: bolder;">и расходные материалы</td></tr></table> <table style="width: 100%; margin: 20pt 0pt 0pt 0pt;"><tr><td style="padding: 20pt 0pt 0pt 20pt; font-weight: bold; font-size: 150%;">«Таврия»</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Сосиски</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Ветчина</td></tr><tr><td style="padding: 20pt 0pt 0pt 20pt; font-weight: bold; font-size: 150%;">«Гранат»</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Смесь компотная</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Грецкий орех</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Арахис</td></tr><tr><td style="padding: 20pt 0pt 0pt 20pt; font-weight: bold; font-size: 150%;">«Ашан»</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Фарш мясной</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Тоник для лимонада</td></tr><tr><td style="padding: 20pt 0pt 0pt 20pt; font-weight: bold; font-size: 150%;">ИП Архипов</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Филе горбуши</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Майонез</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Масло подсолнечное</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Огурцы маринованные</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Яйцо</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Мука пшеничная</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Мука ржаная</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Сахар песок</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Кетчуп</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Какао-порошок (простой)</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Дрожжи</td></tr><tr><td style="padding: 20pt 0pt 0pt 20pt; font-weight: bold; font-size: 150%;">«Продсервис»</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Начинка маковая</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Начинка йогуртовая</td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Начинка яблочная </td></tr><tr><td style="padding: 0pt 0pt 0pt 40pt; ">Начинка персиковая</td></tr></table><br><p style="font-family: monospace; text-align: center; color: #1482b5;"></p><br><p style="font-size:70%; text-align: center;">Кассир: Иван Иванов</p></body></html>
解决思路与方案
1. 修复HTML换行干扰
wordwrap可能在HTML标签内部插入换行,导致解析器误判格式。先压缩HTML内容再做换行处理:
// 保留标签结构,压缩标签间的多余空格和换行 $html = preg_replace('/>\s+</', '><', $html); $html = wordwrap($html, 70, "\r\n");
2. 检查服务器邮件传输限制
对比正常与失效邮件的大小,若失效邮件接近服务器邮件大小阈值(如Exim的message_size_limit),需调整配置解除隐性截断。
3. 规避反垃圾邮件机制篡改
邮件头显示X-Yandex-Spam: 1,说明被标记为垃圾邮件,部分服务商对垃圾邮件会强制转纯文本或篡改格式:
- 移除非标准CSS属性(如
mask/-webkit-mask),简化邮件样式 - 配置DKIM/DMARC认证(当前邮件DKIM为none),提升邮件可信度
- 优化主题与内容匹配度,避免触发垃圾邮件关键词
4. 修正特殊字符过滤逻辑
当前JS过滤规则可能破坏HTML结构,改用PHP的htmlspecialchars()处理用户输入:
$itemText = htmlspecialchars($item, ENT_QUOTES, 'UTF-8');
内容的提问来源于stack exchange,提问作者Denis Petrov
相关产品推荐
相关产品推荐

