在电子邮件 html 中附加到 href 的额外文本

Extra text being appended to href in email html

提问人:pbuchheit 提问时间:10/21/2023 最后编辑:pbuchheit 更新时间:10/23/2023 访问量:40

问:

我正在开发一个需要每天发送电子邮件的 java 应用程序。我正在使用 Thymeleaf 从模板构建消息正文,将结果添加到 mime BodyPart,然后将该部分设置为消息的内容。目标是有一个目录,其中每个项目都是指向消息部分的链接。不幸的是,当我在 gmail 中查看生成的电子邮件时,没有一个链接有效。

我输入了一些日志记录并验证了 html 是否正确生成。在目录中,我有一些html,例如:

<ul id="titles_6e8c478e-aabe-4789-ab22-8092e19c2dde"  style="list-style: none; margin: 0 0 10px 0; padding-left: 15px; font-size: 13px;">
    <li><a href="#message_2401_6e8c478e-aabe-4789-ab22-8092e19c2dde">A display test</a></li>
    <li><a href="#message_2383_6e8c478e-aabe-4789-ab22-8092e19c2dde">Testing individual</a></li>
</ul>

其中 href 是基于消息中的一些 id 数据构建的。再往下看,目标 html 如下所示:

<table 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 id="message_2401_6e8c478e-aabe-4789-ab22-8092e19c2dde"></a>
                <span ><strong>A display test</strong></span><br/>
                                                
                <p><a href="#pagetop">Top</a></p>
             </td>
          </tr>
         </table>
         <table 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 id="message_2383_6e8c478e-aabe-4789-ab22-8092e19c2dde"></a>
                    <span ><strong>Testing individual</strong></span><br/>
                                                
                    <p><a href="#pagetop">Top</a></p>
                 </td>
           </tr>
</table>

目前为止,一切都好。问题是,我的html在构建和发送消息期间的某个时候被修改了。当我检查收到的电子邮件的 html 时,我的 href 标签现在的格式如下:

<a href="#m_-2166845457075511738_message_2401_6e8c478e-aabe-4789-ab22-8092e19c2dde">A display test</a>

注意到已添加的额外前缀吗?就其本身而言,这不是问题,但是当我查看目标html时,它现在看起来像:

<a id="m_-2166845457075511738message_2401_6e8c478e-aabe-4789-ab22-8092e19c2dde"></a>

如果它们匹配,额外的前缀就无关紧要了,但缺少下划线意味着所有这些链接现在都已损坏。

如果有帮助,我负责构建和发送电子邮件的代码如下所示:

public SimpleResponse sendEmail(List<String> toAddresses, String subject) throws IOException {
Properties prop = new Properties();
        prop.put("mail.smtp.host", host);
        prop.put("mail.smtp.port", port);
        prop.put("mail.smtp.starttls.enable", "true");
        prop.put("mail.smtp.auth", "false");
        prop.put("mail.smtp.socketFactory.port", port);
        prop.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

        Session session = Session.getInstance(prop);
        Message message = new MimeMessage(session);
        Multipart multipart = new MimeMultipart();
        try {
            logger.info("Attempting to send email, " + subject + " to: " + recipients);         
            message.setFrom(new InternetAddress("[email protected]"));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
            
            message.setSubject(subject);

            //generate the html content of the email from a thymeleaf template
            String digestHtml = generateDailyDigestFromTemplate(learnerEmail, subscribedMessages);
            //this line outputs the html and everything looks as expected
            System.out.println(digestHtml);
            BodyPart dailyDigestBody = new MimeBodyPart();
            dailyDigestBody.setContent(digestHtml, "text/html");
            multipart.addBodyPart(bodyPart);        
            message.setContent(multipart);

            Transport.send(message);
        } catch (MessagingException e) {
            logger.error("Failed to send email", e);
            return new SimpleResponse("sendEmail: " + subject, false,
                    "Failed to sent email to: " + toAddresses + " with error: " + e.getMessage());
        }

        logger.info("Successfully sent email, " + subject + " to: " + recipients);          
        return new SimpleResponse("sendEmail: " + subject, true, "Successfully sent email to: " + toAddresses);
}

在这一点上,我有点卡住了。知道是什么原因造成的吗?我该怎么做才能解决它?

更新:我已经设法缩小了问题的原因,但我仍然不确定如何解决它。问题出在Gmail客户端。如果我单击“更多”菜单并选择“显示原始内容”,html 看起来非常好。只有当我在客户端中检查它时,才会添加额外的文本。

java html 电子邮件 thymeleaf href

评论


答:

0赞 Syed Bilal 10/21/2023 #1

电子邮件链接具有额外前缀时,您面临的问题与 Gmail 在呈现电子邮件时如何修改电子邮件的 HTML 内容有关。

若要解决此问题并确保链接正常工作,可以考虑以下选项:

使用绝对 URL: 您可以使用绝对 URL,而不是使用相对锚链接(例如,href=“#message_2401_6e8c478e-aabe-4789-ab22-8092e19c2dde”)。这些是完整的 URL,其中包含电子邮件中目标的完整地址。Gmail 修改绝对网址的可能性较小。例如:

<a href="https://www.yourwebsite.com#message_2401_6e8c478e-aabe-4789-ab22-8092e19c2dde">A display test</a>

最小化 JavaScript 和事件属性

避免在电子邮件中使用基于 JavaScript 的操作,因为这可能会触发 Gmail 进行其他修改。同样,尽量减少事件属性(如 onclick)的使用,这在电子邮件客户端中可能会有问题。

如果它解决了您的问题,请将其标记为答案。谢谢。

评论

0赞 pbuchheit 10/21/2023
我没有使用任何 javascript,所以我认为这不是问题所在。我也不能使用绝对 URL。这些只是文档中的导航链接。
0赞 pbuchheit 10/23/2023 #2

我能够找到解决方法,但我仍然不清楚导致此问题的原因。如果我在目标元素中使用“name”属性代替“id”,则生成的前缀匹配并且我的链接有效。所以

<a id="message_2383_6e8c478e-aabe-4789-ab22-8092e19c2dde"></a>

相反,将如下所示:

<a name="message_2383_6e8c478e-aabe-4789-ab22-8092e19c2dde"></a>