一鹿由妳 2024-05-27 22:40 采纳率: 0%
浏览 4

JavaMail邮件回复时,无法将原邮件显示在正文下方

问题:JavaMail邮件回复时,附带的原邮件被当成附件了
期望:原邮件在正文下方显示
实际效果

img

代码


@Test
        void queryMailBySmailUiidAndReply() {
        String smailUiid = "BECA4AEADA764AECBCC802F887A16B78-20240526-160203";
        try(Store store = sessionImap.getStore()) {
            store.connect(HOST_IMAP, EMAIL, PASSWORD);

            Folder folder = store.getFolder(MailUtil.FOLDER_INBOX);
            folder.open(Folder.READ_ONLY);

            Message[] messages = folder.search(new SearchTerm() {
                @Override
                public boolean match(Message msg) {
                    return MailUtil.getSmailUiid(msg).equals(smailUiid);
                }
            });

            for(Message message : messages) {
                log.info("No.{}\t\tsmailUiid={}", message.getMessageNumber(), MailUtil.getSmailUiid(message));

                MimeMessage replyMessage = new MimeMessage(sessionSmtp);
                replyMessage.setReplyTo(message.getFrom());
                replyMessage.setRecipients(Message.RecipientType.TO, message.getFrom());
                replyMessage.setSubject(MailUtil.REPLY_PREFIX + message.getSubject());
                replyMessage.setFrom(EMAIL);

                // 将原始邮件写入字节数组输出流
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                message.writeTo(outputStream);

                // 创建一个MimeBodyPart来存储原始邮件
                MimeBodyPart originalPart = new MimeBodyPart();
                // 使用ByteArrayDataSource创建DataHandler
                DataHandler dataHandler = new DataHandler(new ByteArrayDataSource(outputStream.toByteArray(), "message/rfc822"));
                originalPart.setDataHandler(dataHandler);

                // 创建一个多部分容器,用于包含回复和原始邮件
                MimeMultipart multipart = new MimeMultipart(MailUtil.SUBTYPE_MIXED);
                multipart.addBodyPart(originalPart);

                // 添加回复的文本部分
                MimeBodyPart replyText = new MimeBodyPart();
                replyText.setContent("这是我的<b>回复</b>...", "text/html;charset=UTF-8");
                multipart.addBodyPart(replyText);

                // 设置多部分内容为邮件内容
                replyMessage.setContent(multipart);

                Transport transport = sessionSmtp.getTransport();
                transport.connect(HOST_SMTP, EMAIL, PASSWORD);
                transport.sendMessage(replyMessage, replyMessage.getAllRecipients());
            }

            folder.close();
        } catch (Exception ex) {
            log.error("{}", ex);
        }
  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-27 22:40
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    JavaMail库在处理邮件回复时,确实需要正确地设置邮件的内容类型和结构,以确保原邮件内容能够正确地显示在回复邮件的正文下方,而不是作为附件。从您提供的代码来看,问题出在您创建了一个MimeMultipart对象,并且将其设置为邮件的内容类型,这会导致原邮件内容被当作附件处理。

    要解决这个问题,您需要使用MimeMultipartTEXT_PLAINTEXT_HTML子类型来创建一个包含回复文本和原邮件内容的多部分邮件。以下是修改后的代码示例:

    @Test
    void queryMailBySmailUiidAndReply() {
        String smailUiid = "BECA4AEADA764AECBCC802F887A16B78-20240526-160203";
        try(Store store = sessionImap.getStore()) {
            store.connect(HOST_IMAP, EMAIL, PASSWORD);
    
            Folder folder = store.getFolder(MailUtil.FOLDER_INBOX);
            folder.open(Folder.READ_ONLY);
    
            Message[] messages = folder.search(new SearchTerm() {
                @Override
                public boolean match(Message msg) {
                    return MailUtil.getSmailUiid(msg).equals(smailUiid);
                }
            });
    
            for(Message message : messages) {
                log.info("No.{}\t\tsmailUiid={}", message.getMessageNumber(), MailUtil.getSmailUiid(message));
    
                MimeMessage replyMessage = new MimeMessage(sessionSmtp);
                replyMessage.setReplyTo(message.getFrom());
                replyMessage.setRecipients(Message.RecipientType.TO, message.getFrom());
                replyMessage.setSubject(MailUtil.REPLY_PREFIX + message.getSubject());
                replyMessage.setFrom(EMAIL);
    
                // 创建一个MimeMultipart对象,使用TEXT_HTML子类型
                MimeMultipart multipart = new MimeMultipart("text/html");
    
                // 添加回复的文本部分
                MimeBodyPart replyText = new MimeBodyPart();
                replyText.setContent("这是我的<b>回复</b>...", "text/html;charset=UTF-8");
                multipart.addBodyPart(replyText);
    
                // 添加原邮件内容部分
                MimeBodyPart originalPart = new MimeBodyPart();
                originalPart.setContent(message.getContent(), "text/html;charset=UTF-8");
                multipart.addBodyPart(originalPart);
    
                // 设置多部分内容为邮件内容
                replyMessage.setContent(multipart);
    
                Transport transport = sessionSmtp.getTransport();
                transport.connect(HOST_SMTP, EMAIL, PASSWORD);
                transport.sendMessage(replyMessage, replyMessage.getAllRecipients());
            }
    
            folder.close();
        } catch (Exception ex) {
            log.error("{}", ex);
        }
    }
    

    请注意,我使用了message.getContent()来获取原邮件的内容,并将其作为MimeBodyPart的内容添加到多部分邮件中。这样,原邮件的内容就会作为正文的一部分显示,而不是作为附件。

    关于参考资料,您可以查看JavaMail的官方文档,特别是关于MimeMessageMimeMultipart类的使用部分,这将帮助您更好地理解如何构建复杂的邮件结构。JavaMail的官方文档地址是:JavaMail API Documentation

    希望这些修改能够帮助您解决问题。如果您还有其他问题或需要进一步的帮助,请随时告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月27日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表