当我们需要做一个收集电子邮件的程序时,我们应该如何显示复合电子邮件的内容?(原问题见“专家诊所”)今天我写了一点经验,希望后来者能少走弯路。当然,我也希望同志们能更加纠正它。
首先,我们需要从folder中得到一个message对象。这一步不难实现。很多例子都可以参考。当我们得到这个message对象时,下一步就是显示他的内容。在这部分开始之前,首先需要简要介绍几种重要类型的mimetype:text/html texl/plainmultipart/alternativemultipart/related
前两个不需要多介绍,一个是html格式的文本,另一个是无格式的文本。假如你的message对象是这两个mimetype的一个。所以你的邮件不是multipart的邮件。你可以直接展示他们。如下:Object o = m.getContent();if (m.isMimeType("text/plain")||m.isMimeType("text/html")){s="
"+(String)o+"";return s;}s是要返回的内容字符串。message对象为message。
假如你的message对象是后两种,说明你的邮件是multipart。在正常显示内容之前,需要做一些处理和判断。如果message是multipart,只要得到multipart的各个部分(part)的内容。然后得到整个message的内容。if (m.isMimeType("multipart/*"){Multipart mp = (Multipart)o;int cnt = mp.getCount();for (int i = 0; i < cnt; i++) { w=w+"
"+getPart(mp.getBodyPart(i), i, 2,x);}}
getPart 获取part内容的方法。
那么part没有得到什么内容呢?这里有一点需要强调的是,在得到part对象后,不需要调用part.getContent()可以获得part的内容。一开始我就被卡在这里了。为什么呢?原因是:理论上指出的第一部分既不是text/plain类型,也不是text/html类型。因此,第15行永远不会成立。后来,研究发现,指出内容的第一个part是multipart类型。换句话说,这封电子邮件可以分为多个部分,如文本和图片,而文本部分可以分为多个部分,如plain的文本和html的文本。就像一棵树。只有当你到达叶子时,你才能知道它是plain还是html。因此,我们在part中递归调用本身就解决了问题。
1 public String getPart(Part part, int partNum)2 throws MessagingException,IOException3 {4 String s=""; 5 String s1="";6 String s2="";7 String s3="";8 String sct = part.getContentType();9 if (sct == null) 10 { 11 s="part 无效";12 return s;13 } 14 ContentType ct = new ContentType(sct); 15 if (ct.match("text/plain")) 16 { 17 // display text/plain inline18 s1="
"+(String)part.getContent()+""; 19 }20 else21 { 22 String temp="";23 if ((temp = part.getFileName()) != null)24 s2= "Filename: " + temp + "
";25 temp = null;26 if ((temp = part.getDescription()) != null)27 s3= "Description: " + temp + "
"; 28 }29 s=s1+s2+s3;30 return s; 31 }
以下是改造后的getpart方法(非常粗糙,没有优化),使用它可以正确显示复合邮件。public String getPart(Part part, int partNum, int msgNum,int x) throws
MessagingException,IOException{String s="";String s1=""; 确定x参数是以html格式显示还是plainString s2="";String s3="";String s5="";String sct = part.getContentType();if (sct == null) {s="part 无效";return s; }ContentType ct = new ContentType(sct);if (ct.match("text/html|||ct.match("text/plain")) { // display text/plain inlines1=“”
"+(String)part.getContent()+"";}else if(partNum!=0){String temp="";if ((temp = part.getFileName()) != null){ s2= "Filename: " + temp + "
";}/*out.println("Display Attachment");*/}if(part.isMimeType("multipart/alternative")){String s6="";String s7="";Multipart mp = (Multipart)part.getContent();int count = mp.getCount();for (int i = 0; i < count; i++) { if(mp.getBodyPart(i).isMimeType("text/plain")) s7=getPart(mp.getBodyPart(i), i, 3,2); if(mp.getBodyPart(i).isMimeType("text/html")) s6=getPart(mp.getBodyPart(i), i, 3,1);}if(x==1){s5=s6;} if(x==2){s5=s7;}return s5;}s=s1+s2;return s;}
希望大家能讨论一下。
![](/images/780-200-2.jpg)