如何修改现有的Java mail MIMessage正文部分?
我正在尝试修改现有的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
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部分添加一些文本…所以可能这样做会更快不要装它。