JavaMail如何修改草稿

本文描述了在使用IMAP和POP协议处理邮件草稿时遇到的修改限制,即这两个协议不支持直接修改。解决方法是删除原草稿后重新保存。同时提及Foxmail可能存在的并发问题和作者寻求相关示例的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

保存草稿后需要修改

问题

获取草稿使用的协议有两个: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会存在两条,重新登陆账号的话,就是正常的。

最近正好在写邮箱相关的需求,网上也没有关于修改草稿的案例(可能比较菜没找到)

大佬们可以参考参考,有问题多多包涵。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学编程的曉白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值