需求
保存草稿后需要修改
问题
获取草稿使用的协议有两个:imap和pop,这两个协议不支持修改邮件,报错:IMAPMessage is read-only
解决方法
先删除原草稿,再重新保存
try {
String username = "邮箱";
String password = "授权码";
Properties properties = new Properties();
properties.put("mail.transport.protocol", "协议");
properties.put("mail.smtp.host", "地址");
properties.put("mail.smtp.port", "端口");
properties.setProperty("mail.smtp.auth", "true");
Session session = this.createSession(username, password, properties);
Store store = session.getStore("imap");
store.connect(host, username, password);
Folder drafts = store.getFolder("Drafts");
drafts.open(Folder.READ_WRITE);
Message[] messages = drafts.getMessages();
// 遍历邮件
if (StringUtils.isNotBlank(mail.getId())) {
for (Message message : messages) {
String[] headers = message.getHeader("uuid");
if (ObjectUtils.isNotEmpty(headers) && mail.getId().equals(Optional.of(headers[0]).orElse(""))) {
mail.setSendTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(message.getSentDate()));
message.setFlag(Flags.Flag.DELETED, true);
break;
}
}
}
MimeMessage message = this.createMessage(new MimeMessage(session), mail);
// uuid用来查找修改的邮件
message.addHeader("uuid", mail.getId());
message.saveChanges();
message.setFlag(Flags.Flag.DRAFT, true);
MimeMessage[] msgArr = {message};
drafts.appendMessages(msgArr);
drafts.close();
// drafts.close(true);
store.close();
} catch(Exception e) {
// 异常处理
log.error("异常")
}
createMessage() 方法:
private MimeMessage createMessage(MimeMessage message, Mail mail) throws IOException, MessagingException, ParseException {
message.setFrom(new InternetAddress(mail.getSender(), mail.getSenderName(), "UTF-8"));
List<InternetAddress> toList = new ArrayList<>();
// 设置收件人(可能存在多个)
for (int i = 0; i < mail.getRecipientList().size(); i++) {
InternetAddress internetAddress = new InternetAddress();
internetAddress.setAddress(mail.getRecipientList().get(i));
internetAddress.setPersonal(mail.getRecipientNameList().get(i), "UTF-8");
toList.add(internetAddress);
}
message.setRecipients(Message.RecipientType.TO, toList.toArray(new InternetAddress[]{}));
// 抄送人(可能存在多个)
if (ObjectUtils.isNotEmpty(mail.getCcList()) && mail.getCcList().size() > 0) {
List<InternetAddress> ccList = new ArrayList<>();
for (int i = 0; i < mail.getCcList().size(); i++) {
InternetAddress internetAddress = new InternetAddress();
internetAddress.setAddress(mail.getCcList().get(i));
internetAddress.setPersonal(mail.getCcNameList().get(i), "UTF-8");
ccList.add(internetAddress);
}
message.setRecipients(Message.RecipientType.CC, ccList.toArray(new InternetAddress[]{}));
}
message.setSubject(mail.getTitle());
// 自定义发送时间
if (StringUtils.isNotBlank(mail.getSendTime())) {
message.setSentDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(mail.getSendTime()));
}
MimeMultipart multipart = new MimeMultipart();
MimeBodyPart contentPart = new MimeBodyPart();
if (StringUtils.isBlank(mail.getContent())) {
mail.setContent("");
}
contentPart.setContent(mail.getContent(), "text/html;charset=UTF-8");
multipart.addBodyPart(contentPart);
// 添加附件
if (ObjectUtils.isNotEmpty(mail.getFiles()) && mail.getFileList().size() > 0) {
for (String objectName : mail.getFileList()) {
MimeBodyPart attachPart = new MimeBodyPart();
String fileName = commonMapper.getFileName(objectName);
InputStream inputStream = minioUtil.downFile(objectName);
File tempFile = File.createTempFile(fileName, ".tmp");
tempFile.deleteOnExit();
FileOutputStream os = new FileOutputStream(tempFile);
IOUtils.copy(inputStream, os);
FileDataSource dataSource = new FileDataSource(tempFile);
attachPart.setFileName(fileName);
attachPart.setDataHandler(new DataHandler(dataSource));
multipart.addBodyPart(attachPart);
os.close();
inputStream.close();
}
}
message.setContent(multipart);
return message;
}
附官方文档地址:文档
问题:这个写法如果同时用foxmail,foxmail会存在两条,重新登陆账号的话,就是正常的。
最近正好在写邮箱相关的需求,网上也没有关于修改草稿的案例(可能比较菜没找到)
大佬们可以参考参考,有问题多多包涵。