最近使用Javamail实现邮件重定向的过程中,发现有一部分邮件会出现正文缺失的问题,下面分享一个思路解决这个问题,欢迎讨论、提问。
具体步骤如下:
-
获取SMTP会话:使用
MailConn
对象获取一个SMTP会话(Session
),用于后续的邮件发送。 -
创建新的邮件消息:通过这个会话创建一个新的
MimeMessage
对象,作为要发送的邮件。 -
设置发件人:尝试使用原始邮件的发件人地址设置新邮件的发件人。如果原始邮件没有发件人信息,则使用传入的
from
参数作为发件人。 -
添加收件人、抄送人和密送人:根据传入的列表,解析并添加收件人(TO)、抄送人(CC)和密送人(BCC)到新邮件中。
-
设置邮件主题和发送时间:将原始邮件的主题复制到新邮件,并设置新邮件的发送时间为当前时间。
-
复制邮件内容:根据原始邮件的内容类型(是否为多部分
multipart/*
),复制内容到新邮件。如果是多部分内容,则遍历所有部分并添加到新邮件;如果不是,直接设置数据处理器。 -
保存更改并发送邮件:在新邮件对象上调用
saveChanges
方法保存所有更改,然后使用Transport
对象发送这封邮件。 -
异常处理:捕获并处理可能发生的异常,如发送邮件时遇到的问题,并记录错误信息。如果发送成功,返回
true
;如果发生异常,则返回false
。
public boolean redirectMail(MailConn conn, String from, List<String> toMail, List<String> ccEmail, List<String> bccEmail, MimeMessage originalMessage) {
boolean isFlag = false;
try {
Session transportSession = conn.getSmptSession();
MimeMessage message = new MimeMessage(transportSession);
// 使用原始邮件的发件人作为新邮件的发件人
Address[] originalFrom = originalMessage.getFrom();
if (originalFrom != null && originalFrom.length > 0) {
message.setFrom(originalFrom[0]);
} else {
message.setFrom(new InternetAddress(from)); // Fallback to provided 'from' if original does not have a sender
}
message.addRecipients(Message.RecipientType.TO, InternetAddress.parse(String.join(",", toMail)));
if (ccEmail != null && !ccEmail.isEmpty()) {
message.addRecipients(Message.RecipientType.CC, InternetAddress.parse(String.join(",", ccEmail)));
}
if (bccEmail != null && !bccEmail.isEmpty()) {
message.addRecipients(Message.RecipientType.BCC, InternetAddress.parse(String.join(",", bccEmail)));
}
message.setSubject(originalMessage.getSubject());
message.setSentDate(new Date());
// 复制内容
if (originalMessage.isMimeType("multipart/*")) {
Multipart originalMultipart = (Multipart) originalMessage.getContent();
Multipart newMultipart = new MimeMultipart();
for (int i = 0; i < originalMultipart.getCount(); i++) {
newMultipart.addBodyPart(originalMultipart.getBodyPart(i));
}
message.setContent(newMultipart);
} else {
message.setDataHandler(originalMessage.getDataHandler());
}
message.saveChanges(); // 保存更改
// 发送邮件
Transport transport = transportSession.getTransport();
transport.connect();
transport.sendMessage(message, message.getAllRecipients());
isFlag = true;
} catch (Exception e) {
e.printStackTrace();
logger.error("MessagingException while trying to send email Error: {}", e.getMessage());
isFlag = false;
}
return isFlag;//GPT4生成,可以代问
}
这段代码通过复制原始邮件的内容和属性到一个新的MimeMessage
对象中,并发送这个新对象到指定的收件人、抄送人和密送人,实现了邮件重定向的功能。