Java邮件中的内联链接在邮件客户端中不起作用
我正在尝试添加内联链接(HTML正文中内联表的链接),通过这些链接我可以在电子邮件中导航。 我正在使用Java邮件中的内联链接在邮件客户端中不起作用,java,html,email,jakarta-mail,Java,Html,Email,Jakarta Mail,我正在尝试添加内联链接(HTML正文中内联表的链接),通过这些链接我可以在电子邮件中导航。 我正在使用javax.mailAPI和text/html。 问题是,当链接在电子邮件客户端(如outlook)中打开时,它们不起作用。 如果邮件是在浏览器中打开的(从“电子邮件客户端”中的“在浏览器中查看选项”),则链接可以正常工作 请协助解决此问题(我如何在邮件客户端中拥有可用的内联链接)。 下面是我用来发送邮件的课程 import java.io.UnsupportedEncodingExceptio
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>");
});
}
}
import java.io.UnsupportedEncodingException;
导入java.time.LocalDate;
导入java.time.format.DateTimeFormatter;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.List;
导入java.util.Properties;
导入javax.mail.Authenticator;
导入javax.mail.Message;
导入javax.mail.MessaginException;
导入javax.mail.PasswordAuthentication;
导入javax.mail.Session;
导入javax.mail.Transport;
导入javax.mail.internet.InternetAddress;
导入javax.mail.internet.mimessage;
导入com.afl.crawler.exceptions.CrawlerException;
公共类EmailTestClass{
私有静态StringBuilder消息=新建StringBuilder();
公共静态void main(字符串[]args)引发爬虫异常{
LocalDate today=LocalDate.now();
List dateList=new ArrayList();
对于(int i=0;i<10;i++){
日期列表。添加(今天。天数(i));
}
配置和发送邮件(日期列表);
}
私有静态void configureAndSendMail(列表日期列表)引发爬虫异常{
试一试{
属性smtpProps=新属性();
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=新的验证器(){
@凌驾
公共密码身份验证getPasswordAuthentication(){
返回新密码身份验证(“me@gmail.com", "myP@ssword");
}
};
Session Session=Session.getInstance(smtpProps,auth);
Message msg=新的mimessage(会话);
InternetAddress[]ToAddress={新的InternetAddress(“someone@example.com") };
msg.setFrom(新的InternetAddress(“me@gmail.com“,”测试账户“);
msg.setRecipients(Message.RecipientType.TO,toAddrs);
msg.setSubject(“测试电子邮件链接”);
msg.setSentDate(新日期());
msg.setContent(getMailContent(dateList),“text/html;charset=utf-8”);
发送(msg);
}捕获(消息异常|不支持编码异常ex){
抛出新的爬虫异常(“无法处理电子邮件”,例如);
}
}
私有静态对象getMailContent(列表日期列表){
消息。追加(“”);
//准备导航链接
附加(“导航链接:”);
dateList.forEach(日期->{
message.append(“”);
});
message.append(“
”);
//准备数据表
builddataTables(日期列表);
消息。追加(“”);
返回消息.toString();
}
私有静态void builddataTables(列表日期列表){
dateList.forEach(日期->{
message.append(“”)
.append(date.format(模式的DateTimeFormatter.of(“cccc,dd-MMMM-yyyy”))
.附加(“关键数据为同侧前庭、前庭、前庭、后庭和后庭的关键数据”);
});
}
}
根据Aaron指出的链接,我将详细信息表包含在一个命名的锚标记中。
它已经在Gmail和Outlook 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>");
});
}
私有静态void builddataTables(列表日期列表){
dateList.forEach(日期->{
message.append(“”)
.append(date.format(模式的DateTimeFormatter.of(“cccc,dd-MMMM-yyyy”))
.附加(“关键数据为同侧前庭、前庭、前庭、后庭和后庭的关键数据”);
});
}
如果您使用的是相对链接,则应该使用绝对链接。如何将绝对链接添加到动态创建的元素?我已删除了与OP的问题无关的答案(我以为链接应该指向一个Web应用程序),但我提供了一个相关链接,我将在此处复制:。这篇文章提到使用提到基于id
的锚应该可以在一些web客户端上工作。Pete,我不会发布另一个答案,因为我不打算测试这些文章中提供的信息,但既然你已经这样做了,你可以添加一个答案并接受它以供将来参考:)@Aaron done.)