【问题标题】:How to modify existing Java mail MimeMessage body parts?如何修改现有的 Java 邮件 MimeMessage 正文部分?
【发布时间】:2011-12-02 06:02:40
【问题描述】:

我正在尝试修改现有的 MimeMessage 正文部分。我想过滤某些链接。你们有谁知道为什么即使要更改的正文部分内容接缝与旧内容一起发送?是否正在进行一些缓存?知道如何解决这个问题吗?

这是我的代码:

public void resend(InputStream data) throws Exception {
    Session mailSession = createMailSession();
    //mailSession.setDebug(true);

    Transport transport = mailSession.getTransport();
    MimeMessage message = new MimeMessage(mailSession, data);

    Object content = message.getContent();
    if (content.getClass().isAssignableFrom(MimeMultipart.class)) {
        MimeMultipart mimeMultipart = (MimeMultipart) content;

        for (int i = 0; i < mimeMultipart.getCount(); i++) {

            BodyPart bodyPart = mimeMultipart.getBodyPart(i);
            if (bodyPart.getContentType().startsWith("text/plain")) {
                String cnt = updateContent((String) bodyPart.getContent());
                System.out.println("ContentType = " + bodyPart.getContentType());
                System.out.println("Content = " + cnt);

                bodyPart.setContent(cnt, bodyPart.getContentType());
            } else if (bodyPart.getContentType().startsWith("text/html")) {
                String cnt = updateContent((String) bodyPart.getContent());
                System.out.println("ContentType = " + bodyPart.getContentType());
                System.out.println("Content = " + cnt);

                bodyPart.setContent(cnt, bodyPart.getContentType());
            }
        }
    } else {
        String cnt = updateContent((String) message.getContent());
        System.out.println("ContentType = " + message.getContentType());
        System.out.println("Content = " + cnt);

        message.setContent(cnt, message.getContentType());
    }

    transport.connect();
    transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
    transport.close();
}

private String updateContent(String cnt) {
    return cnt.replace("www.xyz.pl", "www.new-xyz.pl");
}

输入流“数据”包含原始消息。

有什么想法吗?

提前谢谢....

【问题讨论】:

    标签: java email multipart


    【解决方案1】:

    为了同时更新 text/plain 和 text/html 部分,我使用了 Jsoup 提供的功能

         MimeMessage message = new MimeMessage(mailSession, data);
         String newText ="Whatever you want";
         updateText(message);
         message.saveChanges();
    
    
     private void updateText(String newText, MimePart part){
    
         if the mime type is "text/plain"{
                part.setText(newText, "UTF-8");
         }else if the mime type is "text/html"{
               String html = (String) part.getContent();
               Document document = Jsoup.parse(html)
               Element body = doc.body();
               body.text(newText);
               part.setContent(doc.html(), "text/html;charset=UTF-8");
         }else if the mime type is multipart/*{
               Multipart multi = (Multipart) part.getContent();
               int count = multi.getCount();
               for (int i = 0; i < count; i++) {
                   updateText(newText, multi.getbodyPart(i);
               }
         }
     }
    

    【讨论】:

      【解决方案2】:

      您需要在 MimeMessage 上调用 saveChanges()(据我所知应该足够了),另请参阅:api-doc MimeMessage#saveChanges():

      更新此消息的相应标头字段以与消息的内容保持一致。如果此消息包含在文件夹中,则对此消息所做的任何更改都会提交到包含文件夹。

      如果邮件标题或内容的任何部分发生更改,则必须调用 saveChanges 以确保这些更改是永久性的。否则,任何此类修改可能会或可能不会保存,具体取决于文件夹实现。

      【讨论】:

      • 谢谢!太容易了......我浪费了一个小时来解决这个问题:)
      • 所以...在添加 saveChanges 调用 Content Type 后,身体部位会丢失...另一个要解决的问题:(
      • @Konrad,我不是 100% 确定,但我相信 setContent 只接受 mimetype,而不接受相关的字符集;您可能需要使用其中一种 setText 方法,例如 javamail.kenai.com/nonav/javadocs/javax/mail/internet/…。顺便说一句:如果一切都失败了,请访问 forums.oracle.com 上的 JavaMail 论坛:Bill Shannon,JavaMail 开发人员非常积极地回答问题。
      • @Konrad,一定要链接到这个问题,当涉及到没有链接的其他地方提出的问题时,该论坛上的人相当挑剔。
      • 当然......谢谢......到目前为止,我正在尝试修改电子邮件而不将其加载到 Message 对象中......我有纯文本版本的电子邮件,只需要替换和添加一些text to text/html 部分...所以不加载它可能会更快。
      猜你喜欢
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2020-10-06
      • 2011-07-09
      • 2016-07-10
      • 2021-11-23
      相关资源
      最近更新 更多