用javamail顯示覆合郵件的內容的親身體會 (轉)

worldblog發表於2007-12-04
用javamail顯示覆合郵件的內容的親身體會 (轉)[@more@]

複合:既含圖片又含正文,一般是html格式顯示。簡單理解的話,就是非常漂亮的那種郵件。
(個人註解,不很全面)

當我們需要做一個收取郵件的時,我們該如何去顯示覆合郵件的內容呢?(原問題見‘專家門診’)
今天我將我得一點心得寫出來,希望後來者能夠少走彎路。
當然也希望同志多加指正。

首先,我們需要從folder中得到一個message。這一步不難實現。可以參看很多例子。當我們得到這個message物件後,下一步就是去顯示他的內容了。在這部分開始前,首先需要簡要介紹一下mimetype的幾個重要型別:
text/html
texl/plain
multipart/alternative
multipart/related

前兩個不必多介紹,一個是html格式的正文,一個是無格式正文。如果你的message物件是這兩個mimetype的一種的話。那麼你的郵件就不是multipart的郵件。你就可以直接去顯示他們。如下:
o = m.getContent();
if (m.isMimeType("text/plain")||m.isMimeType("text/html"))
 { 
 s="

"+(String)o+"
"; 
 return s; 
 }
s為要返回的內容字串。m為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的內容。當初我就是在這裡被卡住了。為什麼呢?原因是:
理論上的指明內容第一個part,既不是一個text/plain型別,也不是一個text/html型別。所以,第15行是永遠不成立的。後來經過研究發現,指明內容的第一個part又是一個multipart型別。也就是說,這個郵件可分為多個部分,正文和圖片等,而正文部分又可以分為多個部分,如plain的正文和html的正文。這樣,就象一個樹。只有到達葉子時,你才能知道它時plain還是html。因此,我們在part中遞迴呼叫本身就解決了問題。

 
1  public String getPart(Part part, int partNum)
2  throws  MessagingException,IOException
3  {
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 inline
18  s1="

"+(String)part.getContent()+"
"; 
19  }
20  else
21  { 
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 msm,int x)  throws

MessagingException,IOException
 {
 String s=""; 
 String s1="";  x引數來確定是以html格式顯示還是以plain
 String 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 inline
 s1="

"+(String)part.getContent()+"
"; 
 } 
 else if(partNum!=0)
 {
 String temp="";
 if ((temp = part.getFileName()) != null)
 {
   s2= "Filename: " + temp + "
";
 }
 
 /*
 out.println("  HttpUtils.getRequestURL(req) +
  "?message=" +
  msgNum + "&part=" +
  partNum + "">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; 
 }


希望大家探討。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988111/,如需轉載,請註明出處,否則將追究法律責任。

相關文章