You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:36:18