Как изменить существующие части тела почты Java MimeMessage? - PullRequest
8 голосов
/ 06 октября 2011

Я пытаюсь изменить существующую часть тела 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 ]

8 голосов
/ 06 октября 2011

Вам нужно вызвать saveChanges () для MimeMessage (что, насколько я знаю, должно быть достаточно), см. Также: api-doc MimeMessage # saveChanges () :

Обновляет соответствующие поля заголовка этого сообщения, чтобы соответствовать содержимому сообщения. Если это сообщение содержится в папке, любые изменения, внесенные в это сообщение, сохраняются в содержащей папке.

Если какая-либо часть заголовков или содержимого сообщения изменяется, необходимо вызвать saveChanges , чтобы эти изменения были постоянными. В противном случае любые такие изменения могут сохраняться или не сохраняться в зависимости от реализации папки.

0 голосов
/ 28 июня 2018

Для обновления разделов 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);
           }
     }
 }
...