posts - 59, comments - 244, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          日歷

          <2010年12月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          公告

          歡迎交流和指教

          我參與的項目

          本人的其它博客

          搜索

          •  

          最新評論

          基于郵件服務器的聊天測試

          Posted on 2010-12-11 00:23 penngo 閱讀(2632) 評論(6)  編輯  收藏

          現在的郵件服務提供商很多,而且郵箱的速度也很不錯,相互之間也能互發信息,基于郵件服務器進行信息聊天,應該也不錯。寫個簡易版的客戶端工具測試下。
          本文只做了純文本內容的發送測試,圖片和附件的沒做。
          功能實現的原理很簡單:
          客戶端信息發送(郵件發送):和普通的smtp發送郵件一樣。
          客戶端信息接收(郵件接收):因為要馬上看到信息內容,所以需要用一個線程,死循環的不斷登錄郵箱收郵件。
          代碼實現也很簡單,只是收發郵件的代碼,這里不詳說。
          收發郵件的組件是javaMail,界面是swing做的。

          收發信息實現類EmailUtil.java

          public class EmailUtil {
              
          private Account accout;
              
          private static Session session;
              
          private static Store store;
              
          private Date latestSentDate;
              
          public EmailUtil(){
                   
          if(session == null ){
                       initSession();
                  }

              }

               
          public void send(String mail_body){
                      
          try
                      

                          
          if(session == null ){
                               
          boolean b = initSession();
                                  
          if(b == false){
                                      
          return;
                                  }

                         }

                          MimeMessage mimeMsg 
          = new MimeMessage(session);   
                          mimeMsg.setSubject(
          "即時信息回復");   
                          Multipart mp 
          = new MimeMultipart();   
                          BodyPart bp1 
          = new MimeBodyPart();   
                          bp1.setContent(mail_body, 
          "text/html;charset=UTF-8");   
                          mp.addBodyPart(bp1);   
                          mimeMsg.setContent(mp);   
                          mimeMsg.setFrom(
          new InternetAddress(accout.getFromEmail()));   
                          mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress   
                                  .parse(accout.getToEmail()));   
                          mimeMsg.saveChanges();   
                          Transport transport 
          = session.getTransport("smtp");   
                          transport.connect(accout.getSendHost(),   
                                  accout.getName(), accout.getPassword());   
                          transport.sendMessage(mimeMsg, mimeMsg   
                                  .getRecipients(Message.RecipientType.TO));   
                          transport.close();   
                      }
           catch (Exception ex)
                      
          {
                          JOptionPane.showMessageDialog(
          null"發送出錯:" + ex.getMessage());
                          System.out.println(
          "發送郵件出錯:");
                          ex.printStackTrace();
                      }

                  }

               
               
          public boolean receive(JEditorPane receivePane, StringBuffer sff){
                   
          try{
                       
          if(session == null ){
                              
          boolean b = initSession();
                              
          if(b == false){
                                  
          return false;
                              }

                         }

                       
          if(store == null || store.isConnected() == false){
                           URLName urln 
          = new URLName("pop3", accout.getReceiveHost(), 110null,  
                                   accout.getName(), accout.getPassword());  
                            store 
          = session.getStore(urln);
                            store.connect();
                       }

                       Folder folder 
          = store.getFolder("INBOX");
                       folder.open(Folder.READ_ONLY);
                       System.out.println(
          "郵件數:" + folder.getMessageCount());
                       
          if(latestSentDate == null){
                           latestSentDate 
          = DateUtil.parseDate("2010-12-10 00:00:00");
                       }

                      Address fromEmail 
          = new InternetAddress(accout.getToEmail());
                      SearchTerm term1 
          = new FromTerm(fromEmail);
                       SearchTerm st 
          = new SentDateTerm(SentDateTerm.GT, latestSentDate);
                       SearchTerm term 
          = new AndTerm(term1, st);
                       Message[] msgs 
          = folder.search(term);
                       System.out.println(
          "符合條件郵件數:" + msgs.length);
                       
          if(msgs.length > 0){
                           
          for(int i = 0; i < msgs.length; i++){
                               Message m 
          = msgs[i];
                               String msg 
          = "";
                               
          try{
                                   
          if(m.isMimeType("multipart/*")){
                                        Multipart mp
          =(Multipart)m.getContent();
                                        Part part
          =mp.getBodyPart(0);
                                        msg
          =(String)part.getContent();
                                    }

                                   
          else{
                                       msg 
          = (String)m.getContent();
                                       
                                   }

                                   latestSentDate 
          = m.getSentDate();
                                   String from 
          = getFrom(m);
                                   String sentUser 
          = "<span style=\"color:#1E90FF;\">" + from + "&nbsp;&nbsp;&nbsp;&nbsp;" + DateUtil.dateToStr(latestSentDate) + "</span><br/>";
                                   sff.append(sentUser);
                                   sff.append(msg 
          + "<br/><br/>");
                               }

                              
          catch(Exception e){
                                  System.out.println(
          "讀取第" + i + "份郵件出錯");
                                  e.printStackTrace();
                              }

                              }

                              receivePane.setText(sff.toString());
                       }

                   }

                  
          catch(Exception e){
                      sff.append(
          "<font color=\"red\">接收郵件出錯:" + e.getMessage() + "</font><br/>");
                      receivePane.setText(sff.toString());
                       System.out.println(
          "接收郵件出錯:");
                      e.printStackTrace();
                      
          return false;
                      
                  }

                  
          return true;
               }

               
               
          private boolean initSession(){
                   
          if(MessageDialog.getAccount() != null){
                       accout 
          = MessageDialog.getAccount();
                       Properties props 
          = new Properties(); // 獲取系統環境
                       props.put("mail.smtp.host", accout.getSendHost());
                       props.put(
          "mail.smtp.auth""true");
                       session 
          = Session.getDefaultInstance(props, null);
                       
          return true;
                   }

                   
          else{
                       
          return false;
                   }

               }

               
               
          private String getFrom(Message mimeMessage) throws Exception {
                      InternetAddress[] address 
          = (InternetAddress[]) mimeMessage.getFrom();
                      String from 
          = address[0].getAddress();
                      
          if (from == null){
                          from 
          = "";
                      }

                      String personal 
          = address[0].getPersonal();
                      
          if (personal == null){
                          personal 
          = "";
                      }

                      String fromaddr 
          = personal + "&nbsp;&nbsp;&lt;" + from + "&gt;";
                      
          return fromaddr;
                  }

               
               
          public void getMailContent(Part part, StringBuffer sff) throws Exception {   
                      String contenttype 
          = part.getContentType();   
                      
          int nameindex = contenttype.indexOf("name");   
                      
          boolean conname = false;   
                      
          if (nameindex != -1)   
                          conname 
          = true;   
                      System.out.println(
          "CONTENTTYPE: " + contenttype);   
                      
          if (part.isMimeType("text/plain"&& !conname) {   
                          sff.append((String) part.getContent());   
                      }
           else if (part.isMimeType("text/html"&& !conname) {   
                          sff.append((String) part.getContent());   
                      }
           else if (part.isMimeType("multipart/*")) {   
                          Multipart multipart 
          = (Multipart) part.getContent();   
                          
          int counts = multipart.getCount();   
                          
          for (int i = 0; i < counts; i++{   
                              getMailContent(multipart.getBodyPart(i), sff);   
                          }
             
                      }
           else if (part.isMimeType("message/rfc822")) {   
                          getMailContent((Part) part.getContent(), sff);   
                      }
           else {}   
                  }
             
          }

          下面看效果,例子是用了QQ郵箱和網易郵箱測試。QQ郵箱在win 7系統使用,網易郵箱在Ubuntu使用
          程序運行時,先點擊“配置”按鈕配置郵件服務器和帳號信息,配置完后保存,再點登錄,如果配置沒有填錯的話,就可以正常的收發信息。


          QQ郵箱


          163郵箱


          用這個客戶端工具跑了一段時間,個人感覺還是不錯。唯一不足就是跑了一個小時后,163郵箱出現登錄失敗的情況,估計是服務器端設了限制,禁止客戶端連續不斷的訪問郵箱。
          運行程序:im.jar.rar

          評論

          # re: 基于郵件服務器的聊天測試  回復  更多評論   

          2010-12-11 08:33 by 餓了否訂餐網
          這么做不會被服務器拒收 ? 大量聊天的話肯定不行
          除非自己架設 郵件服務器 還得關閉垃圾郵件防護

          # re: 基于郵件服務器的聊天測試  回復  更多評論   

          2010-12-11 08:35 by 餓了否訂餐網
          不過界面做的可以

          # re: 基于郵件服務器的聊天測試  回復  更多評論   

          2010-12-11 10:53 by pengo
          @餓了否訂餐網
          呵呵,QQ郵箱跑了一個小時也沒有問題,要看郵件服務器有沒作了限制,如果沒有作限制,可以直接聊天。界面只是直接用windowbuilder拖拉控件弄出來的,用了JDK自帶的NimbusLookAndFeel皮膚。

          # re: 基于郵件服務器的聊天測試  回復  更多評論   

          2010-12-12 17:08 by 紫砂壺
          這個牛,有空也研究一下

          # re: 基于郵件服務器的聊天測試  回復  更多評論   

          2010-12-13 12:36 by pandora jewelry
          其中hsqldb和hibernate都是從jbpm4.4的lib文件夾里面拷過去的as

          # re: 基于郵件服務器的聊天測試  回復  更多評論   

          2010-12-13 12:37 by pandora jewelry
          其中hsqldb和hibernate都是從jbpm4.4的lib文件夾里面拷過去的ed

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 壶关县| 韩城市| 宁波市| 开封市| 浦东新区| 道真| 夏津县| 昌江| 凌源市| 宜丰县| 伊川县| 团风县| 韶关市| 江口县| 鹤峰县| 郸城县| 伊金霍洛旗| 凉山| 嘉峪关市| 禹州市| 东丰县| 象山县| 马山县| 全南县| 邢台市| 龙州县| 洪泽县| 乌兰察布市| 绥阳县| 灵丘县| 拜城县| 鸡东县| 三穗县| 故城县| 原阳县| 松滋市| 罗田县| 增城市| 广安市| 宾川县| 麻栗坡县|