如何修改现有的Java mail MIMessage正文部分?

如何修改现有的Java mail MIMessage正文部分?,java,email,multipart,Java,Email,Multipart,我正在尝试修改现有的mimessage主体部分。我想过滤某些链接。你们中有人知道为什么即使要更改的身体部位内容,消息也会与旧内容一起发送吗?有一些缓存在进行吗?你知道怎么解决这个问题吗 这是我的密码: public void resend(InputStream data) throws Exception { Session mailSession = createMailSession(); //mailSession.setDebug(true); Transpo

我正在尝试修改现有的mimessage主体部分。我想过滤某些链接。你们中有人知道为什么即使要更改的身体部位内容,消息也会与旧内容一起发送吗?有一些缓存在进行吗?你知道怎么解决这个问题吗

这是我的密码:

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");
}
公共无效重新发送(InputStream数据)引发异常{
会话mailSession=createMailSession();
//mailSession.setDebug(true);
传输=mailSession.getTransport();
mimessage message=新的mimessage(mailSession,data);
对象内容=message.getContent();
if(content.getClass().isAssignableFrom(MimeMultipart.class)){
MimeMultipart MimeMultipart=(MimeMultipart)内容;
对于(int i=0;i
输入流“数据”包含原始消息

有什么想法吗


提前感谢……

您需要在mimessage上调用saveChanges()(据我所知应该足够了),另请参见:

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

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


为了更新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);
           }
     }
 }
mimessage message=新的mimessage(mailSession,data);
String newText=“您想要什么”;
updateText(消息);
message.saveChanges();
私有void updateText(字符串newText,MimePart){
如果mime类型为“文本/普通”{
setText部分(新文本,“UTF-8”);
}否则,如果mime类型为“text/html”{
字符串html=(字符串)part.getContent();
Document Document=Jsoup.parse(html)
元素体=doc.body();
body.text(newText);
setContent(doc.html(),“text/html;charset=UTF-8”);
}否则,如果mime类型为多部分/*{
Multipart multi=(Multipart)part.getContent();
int count=multi.getCount();
for(int i=0;i
谢谢!太简单了……解决这个问题我浪费了一个小时:)所以。。。添加saveChanges后,身体部位的调用内容类型将丢失。。。另一个需要解决的问题是:(@Konrad,我不是100%确定,但我相信setContent只接受mimetype,而不接受关联的字符集;您可能需要使用setText方法之一,如。顺便说一句:如果所有其他方法都失败,请访问forums.oracle.com上的JavaMail论坛:Bill Shannon,JavaMail开发人员非常积极地回答问题。@Konrad,请务必链接到这个问题,那个论坛上的人在没有链接的其他地方问问题时会相当挑剔。当然…谢谢…到目前为止,我正在尝试修改电子邮件,而不将其加载到Message对象中…我有纯文本版本的电子邮件,只需替换并向text/html部分添加一些文本…所以可能这样做会更快不要装它。