JavaMail(4)------- GetMail

  1. package test;
  2. import javax.mail.*;
  3. import java.io.*;
  4. import java.text.*;
  5. import java.util.*;
  6. import java.util.Enumeration;
  7. public class GetMail {
  8.     String POP3Host=""//POP3服務器
  9.     String user=""//登錄POP3服務器的帳號
  10.     String password=""//登錄POP3服務器的密碼
  11.     
  12.     Session session = null;
  13.     Folder folder = null;
  14.     Store store = null;
  15.     
  16.     //無參數的構造函數
  17.     public GetMail() {}
  18.     
  19.     public String getPassword() {
  20.         return password;
  21.     }
  22.     public void setPassword(String password) {
  23.         this.password = password;
  24.     }
  25.     public String getPOP3Host() {
  26.         return POP3Host;
  27.     }
  28.     public void setPOP3Host(String host) {
  29.         POP3Host = host;
  30.     }
  31.     public String getUser() {
  32.         return user;
  33.     }
  34.     public void setUser(String user) {
  35.         this.user = user;
  36.     }   
  37.     //連接郵件服務器
  38.     public void connect() throws Exception{
  39.         //創建一個授權驗證對象
  40.         POP3Auth auth = new POP3Auth();
  41.         auth.setAccount(user,password);
  42.         
  43.         //取得一個Session對象
  44.         Properties prop=new Properties();
  45.         prop.put("mail.pop3.host",POP3Host);
  46.         session=Session.getDefaultInstance(prop,auth);
  47.         
  48.         //取得一個Store對象
  49.         store=session.getStore("pop3");
  50.         store.connect(POP3Host,user,password);
  51.           
  52.         //取得一個Folder對象
  53.         folder=store.getDefaultFolder().getFolder("INBOX");
  54.         folder.open(Folder.READ_ONLY);      
  55.     }   
  56.     //獲得所有郵件的列表
  57.     public Message[] getAllMail() throws Exception
  58.      {
  59.         //建立POP3連接
  60.         connect();
  61.           
  62.         //取得所有的Message對象
  63.         Message[] msg=folder.getMessages();
  64.           
  65.         FetchProfile profile=new FetchProfile();
  66.         profile.add(FetchProfile.Item.ENVELOPE);
  67.         folder.fetch(msg,profile);
  68.         return msg;
  69.     }   
  70.     //取得郵件列表的信息
  71.     public List getMailInfo(Message[] msg) throws Exception
  72.     {
  73.         List result = new ArrayList();
  74.         Map map = null;
  75.         Multipart mp = null;
  76.         BodyPart part = null;
  77.         String disp = null;
  78.         SimpleDateFormat fmt = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
  79.         Enumeration enum = null;
  80.         //取出每個郵件的信息
  81.         for (int i=0;i<msg.length;i++){
  82.             map = new HashMap();
  83.             //讀取郵件ID
  84.             enum = msg[i].getAllHeaders();
  85.             Header h = null;
  86.             while (enum.hasMoreElements()){
  87.                 h = (Header)enum.nextElement();
  88.                 if (h.getName().equals("Message-ID")){
  89.                     map.put("ID",h.getValue());
  90.                 }               
  91.             }
  92.             //讀取郵件標題
  93.             map.put("subject",msg[i].getSubject());
  94.             //讀取發件人
  95.             map.put("sender",msg[i].getFrom()[0].toString());
  96.             //讀取郵件發送日期
  97.             map.put("senddate",fmt.format(msg[i].getSentDate()));
  98.             //讀取郵件大小
  99.             map.put("size",new Integer(msg[i].getSize()));
  100.             map.put("hasAttach"," ");
  101.             //判斷是否有附件
  102.             if(msg[i].isMimeType("multipart/*")){
  103.                 mp=(Multipart)msg[i].getContent();
  104.                 //遍歷每個Miltipart對象
  105.                 for (int j=0;j<mp.getCount();j++){
  106.                     part = mp.getBodyPart(j);
  107.                     disp = part.getDisposition();
  108.                     //如果有附件
  109.                     if(disp!=null && (disp.equals(Part.ATTACHMENT)||disp.equals(Part.INLINE))){
  110.                         //設置有附件的特徵值
  111.                         map.put("hasAttach","√");                   
  112.                     }
  113.                 }               
  114.             }
  115.             result.add(map);
  116.         }
  117.         return result;
  118.     }   
  119.     //查找指定郵件
  120.     public Message findMail(String id) throws Exception
  121.     {
  122.         Message[] msg = getAllMail();
  123.         Enumeration enum = null;
  124.         Header h = null;
  125.         for (int i=0;i<msg.length;i++){
  126.             enum = msg[i].getAllHeaders();
  127.             //查找郵件頭中的Message-ID項
  128.             while (enum.hasMoreElements()){
  129.                 h = (Header)enum.nextElement();
  130.                 //根據傳入的message-id來查找目標郵件
  131.                 if ((h.getName().equals("Message-ID"))&&(h.getValue().equals(id))){
  132.                     return msg[i];
  133.                 }               
  134.             }
  135.         }
  136.         return null;
  137.     }   
  138.     //讀取郵件內容
  139.     public Map readMail(String basePath,String id) throws Exception{
  140.         Map map = new HashMap();
  141.         //找到目標郵件
  142.         Message msg = findMail(id);
  143.         //讀取郵件標題
  144.         map.put("subject",msg.getSubject());
  145.         //讀取發件人
  146.         map.put("sender",msg.getFrom()[0].toString());
  147.         map.put("attach","");
  148.         //取得郵件內容
  149.         if (msg.isMimeType("text/*")){
  150.             map.put("content",msg.getContent().toString());
  151.         }else{
  152.             StringBuffer result = new StringBuffer();
  153.             Multipart mp=(Multipart)msg.getContent();
  154.             BodyPart part = null;
  155.             String disp = null;
  156.             //遍歷每個Miltipart對象
  157.             for (int j=0;j<mp.getCount();j++){
  158.                 part = mp.getBodyPart(j);               
  159.                 disp = part.getDisposition();
  160.                 //如果有附件
  161.                 if(disp!=null && (disp.equals(Part.ATTACHMENT)||disp.equals(Part.INLINE))){
  162.                     //取得附件文件名
  163.                     String filename = part.getFileName();
  164.                     filename = new String(filename.getBytes("ISO8859-1"),"gb2312");
  165.                     map.put("attach",filename);
  166.                     //下載附件
  167.                     InputStream in=part.getInputStream();
  168.                     filename = basePath + "/"+filename;
  169.                     FileOutputStream out=new FileOutputStream(new File(filename));
  170.                     byte[] content=new byte[255];
  171.                     int read=0;
  172.                     while((read=in.read(content))!=-1)
  173.                     {
  174.                         out.write(content);
  175.                     }
  176.                     out.close();
  177.                     in.close();
  178.                 }else{
  179.                     result.append(part.getContent().toString());
  180.                 }
  181.             }               
  182.             map.put("content",result.toString());
  183.         }       
  184.         return map;     
  185.     }   
  186.     
  187.     //定義一個POP3授權驗證類
  188.     static class POP3Auth extends Authenticator{
  189.         String user,password;
  190.         //設置帳號信息
  191.         void setAccount(String user,String password){
  192.             this.user = user;
  193.             this.password = password;
  194.         }
  195.         //取得PasswordAuthentication對象
  196.         protected PasswordAuthentication getPasswordAuthentication(){
  197.             return new PasswordAuthentication(user,password);
  198.         }
  199.     }   
  200. }
  1. <html>
  2.   <head>
  3.     <title>收取郵件</title>
  4.     <meta http-equiv="content-type" content="text/html; charset=gb2312">
  5.   </head>
  6.   
  7.   <body>
  8.     <h2>收取郵件</h2>
  9.     <hr>
  10.     <form name="form1" method="post" action="MailList.jsp">
  11.         POP3服務器:<input type="text" id="POP3Host" name="POP3Host"><br>
  12.         登錄帳號:<input type="text" id="user" name="user"><br>
  13.         登錄密碼:<input type="password" id="password" name="password"><br>
  14.         <br>
  15.         <input type="submit" name="submit" value="確定"> 
  16.         <input type="reset" name="reset" value="重填">        
  17.     </form>    
  18.   </body>
  19. </html>

顯示收到郵件列表,MailList.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
  2. <%@ page import="test.GetMail"%>
  3. <jsp:useBean id="receiver" class="test.GetMail" scope="session"></jsp:useBean>
  4. <jsp:setProperty name="receiver" property="*"/>
  5. <html>
  6.   <head>
  7.     <title>我的收件箱</title>
  8.   </head>
  9.   
  10.   <body>
  11.     <h2>我的收件箱</h2>
  12.     <hr>
  13.     <table border=1 width=700>
  14.         <tr height=30 bgcolor=#dddddd>
  15.             <td align=center>郵件標題</td>
  16.             <td width=150 align=center>發件人</td>
  17.             <td width=180 align=center>發件時間</td>
  18.             <td width=80 align=center>郵件大小</td>
  19.             <td width=50 align=center>附件</td>
  20.         </tr>
  21.         <%
  22.             //取得郵件列表信息
  23.             Iterator it = receiver.getMailInfo(receiver.getAllMail()).iterator();
  24.             Map map = null;
  25.             //將郵件信息列表顯示
  26.             while (it.hasNext()){
  27.                 map = (Map)it.next();
  28.                 out.println("<tr height=30 valign=middle align=center>");   
  29.                 out.println("<td><a href='readMail.jsp?id="+map.get("ID")+"' target='_blank'>"+map.get("subject")+"</a></td>");
  30.                 out.println("<td>"+map.get("sender")+"</td>");  
  31.                 out.println("<td>"+map.get("senddate")+"</td>");    
  32.                 out.println("<td>"+map.get("size")+"</td>");    
  33.                 out.println("<td>"+map.get("hasAttach")+"</td>");
  34.                 out.println("</tr>");                   
  35.             }
  36.         %>
  37.     </table>    
  38.   </body>
  39. </html>

閱讀郵件內容 readMail.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
  2. <%@ page import="test.GetMail"%>
  3. <%
  4.     //從session中取出receiver
  5.     GetMail receiver = (GetMail)session.getAttribute("receiver");
  6. %>
  7. <html>
  8.   <head>
  9.     <title>閱讀郵件</title>
  10.   </head>
  11.   
  12.   <body>
  13.     <h2>閱讀郵件</h2>
  14.     <hr>
  15.     <table border=1 width=700 cellpadding=4>
  16.         <%
  17.             //取得請求參數
  18.             String id = request.getParameter("id");
  19.             //取得當前目錄的物理路徑
  20.             String basePath = request.getRealPath(".");
  21.             //取得指定的郵件內容
  22.             Map result = receiver.readMail(basePath,id);
  23.         %>    
  24.         <tr>
  25.             <td width=100 align=right bgcolor=#dddddd>郵件標題</td>
  26.             <td><%=result.get("subject")%></td>
  27.         </tr>
  28.         <tr>
  29.             <td width=100 align=right bgcolor=#dddddd>發 件 人</td>
  30.             <td><%=result.get("sender")%></td>
  31.         </tr>
  32.         <%
  33.             String attach =result.get("attach").toString();
  34.             //有附件時才顯示下面的一行
  35.             if (attach.trim().length()>0){
  36.         %>
  37.         <tr>
  38.             <td width=100 align=right bgcolor=#dddddd>附  件</td>
  39.             <td><a href="<%=result.get("attach")%>"><%=result.get("attach")%></a></td>
  40.         </tr>
  41.         <%}%>
  42.         <tr>
  43.             <td width=100 valign=top align=right bgcolor=#dddddd>內  容</td>
  44.             <td><BLOCKQUOTE><%=result.get("content")%></BLOCKQUOTE></td>
  45.         </tr>
  46.     </table>    
  47.   </body>
  48. </html>


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章