java - Java Mail 中的内联链接在邮件客户端中不起作用

标签 java html email jakarta-mail

我正在尝试添加内联链接(# 链接到 HTML 正文内的内联表),通过它我可以在我的电子邮件中导航。 我将 javax.mail API 与 text/html 一起使用。 问题是链接在 outlook 等电子邮件客户端中打开时不起作用。 如果邮件是在浏览器中打开的(通过电子邮件客户端中的“在浏览器中查看选项”),那么链接就可以正常工作。

请协助解决这个问题(我怎样才能在邮件客户端中拥有有效的内联链接)。 下面是我用来发送邮件的类。

import java.io.UnsupportedEncodingException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.afl.crawler.exceptions.CrawlerException;

public class EmailTestClass {

    private static StringBuilder message = new StringBuilder();

    public static void main(String[] args) throws CrawlerException {
        LocalDate today = LocalDate.now();
        List<LocalDate> dateList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            dateList.add(today.minusDays(i));
        }

        configureAndSendMail(dateList);
    }

    private static void configureAndSendMail(List<LocalDate> dateList) throws CrawlerException {

        try {

            Properties smtpProps = new Properties();
            smtpProps.put("mail.smtp.starttls.enable", "true");
            smtpProps.put("mail.smtp.host", "smtp.gmail.com");
            smtpProps.put("mail.smtp.port", "587");
            smtpProps.put("mail.smtp.auth", "true");

            Authenticator auth = new Authenticator() {
                @Override
                public PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("me@gmail.com", "myP@ssword");
                }
            };

            Session session = Session.getInstance(smtpProps, auth);
            Message msg = new MimeMessage(session);

            InternetAddress[] toAddrs = { new InternetAddress("someone@example.com") };

            msg.setFrom(new InternetAddress("me@gmail.com", "Test Account"));
            msg.setRecipients(Message.RecipientType.TO, toAddrs);
            msg.setSubject("Test EMail Links");
            msg.setSentDate(new Date());
            msg.setContent(getMailContent(dateList), "text/html; charset=utf-8");

            Transport.send(msg);

        } catch (MessagingException | UnsupportedEncodingException ex) {
            throw new CrawlerException("Failed to process Email", ex);
        }
    }

    private static Object getMailContent(List<LocalDate> dateList) {

        message.append("<html><head></head><body bgcolor=\"#E1E1E1\" leftmargin=\"0\" marginwidth=\"0\" topmargin=\"0\" marginheight=\"0\" offset=\"0\"><center>");

//      Prepare the Navigation links
        message.append("<div style=\"width: 200px;\"><h2>Navigation Links:</h2><ul>");
        dateList.forEach(date -> {
            message.append("<li><a href=\"#")
            .append(date.toEpochDay())
            .append("\" target=\"_self\">")
            .append(date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy")))
            .append("</a></li>");
        });
        message.append("</ul></div>");

//      Prepare the data Tables 
        builddataTables(dateList);

        message.append("</center></body></html>");

        return message.toString();
    }

    private static void builddataTables(List<LocalDate> dateList) {

        dateList.forEach(date -> {
            message.append("<table ")
            .append("id=\"")
            .append(date.toEpochDay())
            .append("\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"width:500px;background-color: #cedbf3;border: 1px solid rgba(19, 14, 14, 0.56);padding:15px;\"><tr><td colspan=\"2\" style=\"background-color: #5ab4ff;color:#ffffff;line-height:100%;font-family:Helvetica,Arial,sans-serif;font-size:20px;font-weight:400;margin-bottom:5px;text-align:center;\">")
            .append(date.format(DateTimeFormatter.ofPattern("cccc, dd MMMM yyyy")))
            .append("</td></tr><tr><td style=\"width:30%;\">Key Dat1</td><td style=\"width:70%;\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent ac mi eu lorem sagittis lacinia vel ac metus</td></tr><tr><td>Key Data2</td><td>Cras lobortis consectetur mi a porttitor. Vestibulum blandit urna et elit sollicitudin</td></tr></table>");
        });
    }

}

最佳答案

按照 Aaron 指出的链接,我将详细信息表包含在一个命名的 anchor 标记中。 它已经在 GmailOutlook 2016 客户端上进行了测试,并且按预期工作。 现在builddataTables方法实现如下。

private static void builddataTables(List<LocalDate> dateList) {
    dateList.forEach(date -> {
        message.append("<a name=\"")
        .append(date.toEpochDay())
        .append("\" id=\"")
        .append(date.toEpochDay())
        .append("\"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"width:500px;background-color: #cedbf3;border: 1px solid rgba(19, 14, 14, 0.56);padding:15px;\"><tr><td colspan=\"2\" style=\"background-color: #5ab4ff;color:#ffffff;line-height:100%;font-family:Helvetica,Arial,sans-serif;font-size:20px;font-weight:400;margin-bottom:5px;text-align:center;\">")
        .append(date.format(DateTimeFormatter.ofPattern("cccc, dd MMMM yyyy")))
        .append("</td></tr><tr><td style=\"width:30%;\">Key Dat1</td><td style=\"width:70%;\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent ac mi eu lorem sagittis lacinia vel ac metus</td></tr><tr><td>Key Data2</td><td>Cras lobortis consectetur mi a porttitor. Vestibulum blandit urna et elit sollicitudin</td></tr></table></a>");
    });
}

关于java - Java Mail 中的内联链接在邮件客户端中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44584842/

相关文章:

java - 如何向 list 文件添加权限(Java Applet)

java - Java 加密与 And .NET 的十六进制生成问题

html - 当图像 float 到它们的左侧时,p 标签不会中断

html - Safari 中不显示背景图片

jquery - HTML5 Bootstrap - 将文本保存在图像中的 div 中

java - 发送邮件时出错

电子邮件字符集的 Magento 问题

java - 在 spring XML 中使用 Java8 Lambda 函数

java - 随时将变量传递到线程中?

php - 诈骗邮件被发送到我的分类海报