隨筆 - 24  文章 - 6  trackbacks - 0
          <2005年3月>
          272812345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          隨筆分類(23)

          積分與排名

          • 積分 - 13789
          • 排名 - 2084

          最新評(píng)論

           二、 郵件的收取

          Bromon原創(chuàng) 請(qǐng)尊重版權(quán)

             通常情況下我們都使用pop3協(xié)議來收郵件,IMAP嘛現(xiàn)在就不涉及了。收郵件的功能雖然我用了很多時(shí)間才基本搞清楚,不過講起來就so easy了,一個(gè)程序就可以基本包括。

             郵件大致可以分三種:純文本郵件、含有其他數(shù)據(jù)的文本郵件、含有附件的郵件。

          /*
           * Created on 2004-4-26
           
          */

           package org.bromon.mail;
           import javax.mail.
          *;
           import java.util.
          *;
           import java.io.
          *;

           
          /**
           * @author Bromon
           
          */

           
          public class Receiver
           
          {
           Folder inbox;
           Store store;

           
          //連接郵件服務(wù)器,獲得所有郵件的列表
           public Message[] getMail(String host,String name,String password) throws Exception
           
          {
            Properties prop
          =new Properties();
            prop.put(
          "mail.pop3.host",host);
            Session session
          =Session.getDefaultInstance(prop);
            store
          =session.getStore("pop3");
            store.connect(host,name,password);
            
            inbox
          =store.getDefaultFolder().getFolder("INBOX");
            inbox.open(Folder.READ_ONLY);
            
            Message[] msg
          =inbox.getMessages();
            
            FetchProfile profile
          =new FetchProfile();
            profile.add(FetchProfile.Item.ENVELOPE);
            inbox.fetch(msg,profile);
            
            
          return(msg);
           }


           
          //處理任何一種郵件都需要的方法
           private void handle(Message msg) throws Exception
           
          {
            System.
          out.println("郵件主題:"+msg.getSubject());
            System.
          out.println("郵件作者:"+msg.getFrom()[0].toString());
            System.
          out.println("發(fā)送日期:"+msg.getSentDate());
           }


           
          //處理文本郵件
           public void handleText(Message msg) throws Exception
           
          {
            
          this.handle(msg);
            System.
          out.println("郵件內(nèi)容:"+msg.getContent());
           }


           
          //處理Multipart郵件,包括了保存附件的功能
           public void handleMultipart(Message msg) throws Exception
           
          {
            String disposition;
            BodyPart part;
            
            Multipart mp
          =(Multipart)msg.getContent();
            
          int mpCount=mp.getCount();//Miltipart的數(shù)量,用于除了多個(gè)part,比如多個(gè)附件
            for(int m=0;m<mpCount;m++)
            
          {
             
          this.handle(msg);
             
             part
          =mp.getBodyPart(m);
             disposition
          =part.getDisposition();
             
          if(disposition!=null && disposition.equals(Part.ATTACHMENT))//判斷是否有附件
             {
              
          //this.saveAttach(part);//這個(gè)方法負(fù)責(zé)保存附件,注釋掉是因?yàn)楦郊赡苡胁《?,?qǐng)清理信箱之后再取掉注釋
             }
          else{
              System.
          out.println(part.getContent());
             }

            }

           }


           
          private void saveAttach(BodyPart part) throws Exception
           
          {
            String temp
          =part.getFileName();//得到未經(jīng)處理的附件名字
            String s=temp.substring(11,temp.indexOf("?=")-1);//去到header和footer
            
            
          //文件名一般都經(jīng)過了base64編碼,下面是解碼
            String fileName=this.base64Decoder(s);
            System.
          out.println("有附件:"+fileName);
            
            InputStream 
          in=part.getInputStream();
            FileOutputStream writer
          =new FileOutputStream(new File(fileName));
            
          byte[] content=new byte[255];
            
          int read=0;
            
          while((read=in.read(content))!=-1)
            
          {
             writer.write(content);
            }

            writer.close();
            
          in.close();
           }


           
          //base64解碼
           private String base64Decoder(String s) throws Exception
           
          {
            sun.misc.BASE64Decoder decoder 
          = new sun.misc.BASE64Decoder();
            
          byte[] b=decoder.decodeBuffer(s);
            
            
          return(new String(b));
           }


           
          //關(guān)閉連接
           public void close() throws Exception
           
          {
            
          if(inbox!=null)
            
          {
             inbox.close(
          false);
            }

            
            
          if(store!=null)
            
          {
             store.close();
            }

           }


           
          public static void main(String args[])
           
          {
            String host
          ="pop.163.com";
            String name
          ="bromon";
            String password
          ="My password";
            
            Receiver receiver
          =new Receiver();
            
            
          try
            
          {   
             Message[] msg
          =receiver.getMail(host,name,password);
             
             
          for(int i=0;i<msg.length;i++)
             
          {
              
          if(msg[i].isMimeType("text/*"))//判斷郵件類型
              {
               receiver.handleText(msg[i]);
              }
          else{
               receiver.handleMultipart(msg[i]);
              }

              System.
          out.println("****************************");
             }

             receiver.close();
            }
          catch(Exception e)
            
          {
             System.
          out.println(e);
            }

           }

           }


             沒有習(xí)慣讀java代碼的兄弟可能會(huì)覺得麻煩了一點(diǎn),其中有個(gè)小問題,下載的附件會(huì)再文件名后面加上一個(gè)”#”符號(hào),不知道這是javamail的特別處理還是pop3的規(guī)范。通過程序更改文件名很簡(jiǎn)單,就不說了。對(duì)于email還有很多其他的操作,可以自己取查看一下javadoc,我就不影響大家探索的樂趣了。在Properties里配置代理服務(wù)器,可以讓程序通過代理收發(fā)郵件,一般的HTTP、socks 4、socks 5都支持。

          posted on 2005-03-28 13:26 Sometimes Java 閱讀(438) 評(píng)論(0)  編輯  收藏 所屬分類: Tech Flow
          主站蜘蛛池模板: 定州市| 屏南县| 邯郸市| 富顺县| 菏泽市| 吉安市| 沁水县| 中超| 普格县| 铅山县| 女性| 连州市| 连江县| 大宁县| 沁阳市| 澄城县| 海城市| 清流县| 贡觉县| 平乡县| 德格县| 莫力| 平潭县| 襄樊市| 柘荣县| 寿宁县| 高雄市| 乌鲁木齐市| 肇州县| 启东市| 元朗区| 泽普县| 贵德县| 华阴市| 辉县市| 凌源市| 水城县| 万宁市| 莱州市| 临潭县| 湖口县|