If the message came across as text/html content, just send the HTML out as the output of the JSP request. All the different IMG tags will make separate requests to the server to display the images.
The only real problem is if the images come across with the JavaMail message and have a URL that begins with a cid: URL . If that is the case, then you deal with sending the image yourself (and saving it locally). You can try to create a protocol handler for cid, but I think the best way is to convert the URL into one that is handled by default, like any other image, with an HTTP request. 

解决方案 »

  1.   

    skyyoung, 
    现已经得到一个Multipart Message 对象,(是用outlook发来的html格式的邮件,其中有图像)我怎样用jsp页面显示它,能否具体指点一下吗?分析:该Multpart中有56个BodyPart,除了getBodyPart(0)包含两个BodyPart(text/plain和text/html) 外,其余getbodyPart(i)里全包含一个bodypart--- image/gif类型。这些信息够用吗。
      

  2.   

    转载:         用javamail显示复合邮件的内容的亲身体会          作者:spczhou 
    复合邮件:
    既含图片又含正文,一般是html格式显示。简单理解的话,就是非常漂亮的那种邮件。
    (个人注解,不很全面)当我们需要做一个收取邮件的程序时,我们该如何去显示复合邮件的内容呢?(原问题见‘专家门诊’)
    今天我将我得一点心得写出来,希望后来者能够少走弯路。
    当然也希望同志多加指正。首先,我们需要从folder中得到一个message对象。这一步不难实现。可以参看很多例子。当我们得到这个message对象后,下一步就是去显示他的内容了。在这部分开始前,首先需要简要介绍一下mimetype的几个重要类型:
    text/html 
    texl/plain
    multipart/alternative
    multipart/related前两个不必多介绍,一个是html格式的正文,一个是无格式正文。如果你的message对象是这两个mimetype的一种的话。那么你的邮件就不是multipart的邮件。你就可以直接去显示他们。如下:
    Object o = m.getContent();
    if (m.isMimeType("text/plain")||m.isMimeType("text/html"))
      {  
      s="<pre>"+(String)o+"</pre>";  
      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+"<br>"+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="<pre>"+(String)part.getContent()+"</pre>";    
    19        }
    20        else
    21        {        
    22        String temp="";
    23        if ((temp = part.getFileName()) != null)
    24          s2= "<b>Filename:</b> " + temp + "<br>";
    25        temp = null;
    26        if ((temp = part.getDescription()) != null)
    27          s3= "<b>Description:</b> " + temp + "<br>";    
    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格式显示还是以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="<pre>"+(String)part.getContent()+"</pre>";    
      }  
      else if(partNum!=0)
      {
      String temp="";
      if ((temp = part.getFileName()) != null)
       {
              s2= "<b>Filename:</b> " + temp + "<br>";
       }
      
      /*
      out.println("<a href=\"" +
           HttpUtils.getRequestURL(req) + 
           "?message=" +
           msgNum + "&part=" +
           partNum + "\">Display Attachment</a>");
      
      */ 
       
      }
      
      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; 
     }