如何修改现有的Java邮件MimeMessage正文部分?

时间:2011-10-06 13:19:19

标签: java email multipart

我正在尝试修改现有的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");
}

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

有什么想法吗?

提前致谢....

2 个答案:

答案 0 :(得分:8)

你需要在MimeMessage上调用saveChanges()(据我所知应该就足够了),另见:api-doc MimeMessage#saveChanges()

  

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

     

如果更改了邮件标题或内容的任何部分,则必须调用 saveChanges 以确保这些更改是永久性的。否则,根据文件夹实现,可以保存或不保存任何此类修改。

答案 1 :(得分:0)

要同时更新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);
           }
     }
 }