iOS原生邮件客户端中Thymeleaf模板邮件内容缩小问题求助
iOS原生邮件客户端中Thymeleaf邮件内容缩小问题解决
问题描述
我用Thymeleaf构建Java应用发送每日邮件摘要,多数环境渲染正常,但iOS原生邮件客户端里内容被缩小,文字小到无法阅读。之前给内容标签加style="white-space: pre-wrap"曾有效,但现在问题复现,找不到原因。
iOS端显示截图:
原模板代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Message Center Digest</title> <style>a {color:#007aae !important;} </style> </head> <body> <table id="main" width="100%" cellpadding="0" cellspacing="0"> <tr> <td bgcolor="#003575"> <table id="header" width="90%" border="0" cellpadding="0" cellspacing="0" align="center"> <tr> <td width="35%"> <a href="https://www.foo.edu"><img alt="My Logo" width="100px" border="0" src="https://www.foo.edu/sites/logo_white.png" /></a></td> <td width="65%"> <h1 style="color: #ffffff; font-family: helvetica, arial, sans-serif; font-weight: normal; font-size: 30px; margin: 0;">Message Center Digest</h1> <h2 style="margin: 0; font-weight: normal; font-family: Helvetica, Arial, sans-serif; color: #ffffff; font-size: 24px;">For <span th:text="${data.day}">Some day</span>, <a href="#" style="color: #ffffff !important; text-decoration: none;"><span th:text="${data.date}">01/01/1970</span></a></h2> </td> </tr> </table> </td> </tr> <tr> <td bgcolor="#EAEEF1"> <table width="90%" id="content" bgcolor="#ffffff" align="center" border="0" cellpadding="15" cellspacing="0" style="font-family: Arial, Helvetica, sans-serif;"> <tr> <td> <a name="pagetop"></a> <h3 style="font-size: 18px; margin: 0 0 5px 0;">Table of Contents</h3> <h4 style="margin: 0 0 10px 0; font-size: 13px;"><a href="https://www1.foo.edu/script/LogList.asp">Campus Crime and Fire Safety Logs</a></h4> <div th:each="entry, stats : ${messageMap}" th:with="channelMessage=${entry.value}"> <h4 th:attr="id=${'header_' + channelMessage.channelId}" th:text="${entry.key}" style="margin: 0; font-size: 13px;">Category</h4> <ul th:attr="id=${'titles_' + channelMessage.channelId}" id="titles" style="list-style: none; margin: 0 0 10px 0; padding-left: 15px; font-size: 13px;"> <li th:attr="id=${'t_' + message.id + '_' + channelMessage.channelId}" th:each="message : ${channelMessage.messages}"><a th:text="${message.title}" th:href="${'#message_' + message.id + '_' + channelMessage.channelId}">Title 1 </a></li> </ul> </div> <table th:each="entry, stats : ${messageMap}" th:with="channelMessage=${entry.value}" class="category" width="100%" border="0" align="center" cellpadding="10" cellspacing="0"> <tr> <td> <h2 th:attr="id='category_'+${channelMessage.channelId}" th:text="'Category: ' + ${entry.key}" style="color: #00397C; margin: 0;">Category: Unknown</h2> <table th:each="message : ${channelMessage.messages}" class="message" width="100%" align="center" cellpadding="0" cellspacing="0" border="0" style="border-bottom: solid #ccc 1px;"> <tr> <td style="font-size: 13px; color: #333333; padding-left: 15px; padding-bottom: 15px; padding-top: 15px;"> <a th:attr="name=${'message_' + message.id + '_' + channelMessage.channelId}" id="message1"></a> <span th:attr="id=${'title_' + message.id + '_' + channelMessage.channelId}" ><strong th:text="${message.title}">A title</strong></span><br/> <span th:attr="id=${'from_' + message.id + '_' + channelMessage.channelId}"><strong th:inline="text">[['From: ' + ${message.creatorName} + ' ']]<a th:href="@{mailto:{to}(to=${message.creatorEmail},subject='Re: '+ ${message.title}) }" th:text="'<'+${message.creatorEmail} + '>'">foo@gmail.com</a></strong></span><br/><br /> <div th:switch="${message.isHtml}"> <p style="white-space: pre-wrap" th:attr="id=${'body_' + message.id + '_' + channelMessage.channelId}" th:case="true" th:utext="${message.body}">HTML text</p> <p style="white-space: pre-wrap" th:attr="id=${'body_' + message.id + '_' + channelMessage.channelId}" th:case="*" th:text="${message.body}">Standard text</p> </div> <p><a href="#pagetop">Top</a></p> </td> </tr> </table> </td> </tr> </table> <br /> <br /> <br /> <p align="center" style="font-size: 13px;"><em>Update how you receive messages by visiting the Message Center. For help using the Message Center, email: <a href="mailto:foo@bar.edu">foo@bar.edu</a> or call 555-123-4567.</em></p> </td> </tr> </table> </td> </tr> </table> </body> </html>
解决方案
iOS邮件客户端对HTML邮件的渲染有特殊限制,尤其是视口和表格宽度处理,以下是几个必试的修复手段:
添加视口元标签:在
<head>里加入适配移动设备的视口设置,强制邮件按设备宽度渲染:<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">锁定外层表格宽度:修改最外层的
#main表格,添加最大宽度和固定布局样式,避免内容被无限制撑开:<table id="main" width="100%" cellpadding="0" cellspacing="0" style="max-width: 600px; margin: 0 auto; table-layout: fixed;">统一盒模型:在全局样式中添加
box-sizing:border-box,确保内边距和边框不会额外增加元素宽度:* {box-sizing: border-box;}处理长文本换行:给内容段落添加
word-break:break-all,防止超长无换行文本撑大容器导致整体缩小:<p style="white-space: pre-wrap; word-break: break-all;" ...>...</p>
修改后的完整模板
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Message Center Digest</title> <style> a {color:#007aae !important;} * {box-sizing: border-box;} </style> </head> <body style="margin: 0; padding: 0;"> <table id="main" width="100%" cellpadding="0" cellspacing="0" style="max-width: 600px; margin: 0 auto; table-layout: fixed;"> <tr> <td bgcolor="#003575"> <table id="header" width="90%" border="0" cellpadding="0" cellspacing="0" align="center"> <tr> <td width="35%"> <a href="https://www.foo.edu"><img alt="My Logo" width="100px" border="0" src="https://www.foo.edu/sites/logo_white.png" /></a></td> <td width="65%"> <h1 style="color: #ffffff; font-family: helvetica, arial, sans-serif; font-weight: normal; font-size: 30px; margin: 0;">Message Center Digest</h1> <h2 style="margin: 0; font-weight: normal; font-family: Helvetica, Arial, sans-serif; color: #ffffff; font-size: 24px;">For <span th:text="${data.day}">Some day</span>, <a href="#" style="color: #ffffff !important; text-decoration: none;"><span th:text="${data.date}">01/01/1970</span></a></h2> </td> </tr> </table> </td> </tr> <tr> <td bgcolor="#EAEEF1"> <table width="90%" id="content" bgcolor="#ffffff" align="center" border="0" cellpadding="15" cellspacing="0" style="font-family: Arial, Helvetica, sans-serif;"> <tr> <td> <a name="pagetop"></a> <h3 style="font-size: 18px; margin: 0 0 5px 0;">Table of Contents</h3> <h4 style="margin: 0 0 10px 0; font-size: 13px;"><a href="https://www1.foo.edu/script/LogList.asp">Campus Crime and Fire Safety Logs</a></h4> <div th:each="entry, stats : ${messageMap}" th:with="channelMessage=${entry.value}"> <h4 th:attr="id=${'header_' + channelMessage.channelId}" th:text="${entry.key}" style="margin: 0; font-size: 13px;">Category</h4> <ul th:attr="id=${'titles_' + channelMessage.channelId}" id="titles" style="list-style: none; margin: 0 0 10px 0; padding-left: 15px; font-size: 13px;"> <li th:attr="id=${'t_' + message.id + '_' + channelMessage.channelId}" th:each="message : ${channelMessage.messages}"><a th:text="${message.title}" th:href="${'#message_' + message.id + '_' + channelMessage.channelId}">Title 1 </a></li> </ul> </div> <table th:each="entry, stats : ${messageMap}" th:with="channelMessage=${entry.value}" class="category" width="100%" border="0" align="center" cellpadding="10" cellspacing="0"> <tr> <td> <h2 th:attr="id='category_'+${channelMessage.channelId}" th:text="'Category: ' + ${entry.key}" style="color: #00397C; margin: 0;">Category: Unknown</h2> <table th:each="message : ${channelMessage.messages}" class="message" width="100%" align="center" cellpadding="0" cellspacing="0" border="0" style="border-bottom: solid #ccc 1px;"> <tr> <td style="font-size: 13px; color: #333333; padding-left: 15px; padding-bottom: 15px; padding-top: 15px;"> <a th:attr="name=${'message_' + message.id + '_' + channelMessage.channelId}" id="message1"></a> <span th:attr="id=${'title_' + message.id + '_' + channelMessage.channelId}" ><strong th:text="${message.title}">A title</strong></span><br/> <span th:attr="id=${'from_' + message.id + '_' + channelMessage.channelId}"><strong th:inline="text">[['From: ' + ${message.creatorName} + ' ']]<a th:href="@{mailto:{to}(to=${message.creatorEmail},subject='Re: '+ ${message.title}) }" th:text="'<'+${message.creatorEmail} + '>'">foo@gmail.com</a></strong></span><br/><br /> <div th:switch="${message.isHtml}"> <p style="white-space: pre-wrap; word-break: break-all;" th:attr="id=${'body_' + message.id + '_' + channelMessage.channelId}" th:case="true" th:utext="${message.body}">HTML text</p> <p style="white-space: pre-wrap; word-break: break-all;" th:attr="id=${'body_' + message.id + '_' + channelMessage.channelId}" th:case="*" th:text="${message.body}">Standard text</p> </div> <p><a href="#pagetop">Top</a></p> </td> </tr> </table> </td> </tr> </table> <br /> <br /> <br /> <p align="center" style="font-size: 13px;"><em>Update how you receive messages by visiting the Message Center. For help using the Message Center, email: <a href="mailto:foo@bar.edu">foo@bar.edu</a> or call 555-123-4567.</em></p> </td> </tr> </table> </td> </tr> </table> </body> </html>
内容的提问来源于stack exchange,提问作者pbuchheit
相关产品推荐
相关产品推荐

