Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android pop3與imap方式接收郵件(javamail)

android pop3與imap方式接收郵件(javamail)

編輯:關於Android編程

需要下載3個jar包:mail.jar/    activation.jar/    additionnal.jar 1.pop3   [html]   /**    * 以pop3方式讀取郵件,此方法不能讀取郵件是否為已讀,已經通過測試    * */   private void getEmail() {       List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();          try {           Properties props = System.getProperties();           props.put("mail.smtp.host", "smtp.163.com");           props.put("mail.smtp.auth", "true");           Session session = Session.getDefaultInstance(props, null);           URLName urln = new URLName("pop3", "pop3.163.com", 110, null,                   "郵箱名(沒有@163.com)", "密碼");           // 郵件協議為pop3,郵件服務器是pop3.163.com,端口為110,用戶名/密碼為abcw111222/123456w           Store store = session.getStore(urln);           store.connect();           Folder folder = store.getFolder("INBOX");           folder.open(Folder.READ_WRITE);           Message message[] = folder.getMessages();           if (message.length > 0) {               Map<String, Object> map;               System.out.println("Messages's length: " + message.length);               ReciveOneMail pmm = null;               for (int i = 0; i < message.length; i++) {                   System.out.println("======================");                   pmm = new ReciveOneMail((MimeMessage) message[i]);                   System.out.println("Message " + i + " subject: "                           + pmm.getSubject());                   System.out.println("Message " + i + " sentdate: "                           + pmm.getSentDate());                   System.out.println("Message " + i + " replysign: "                           + pmm.getReplySign());                      boolean isRead = pmm.isNew();// 判斷郵件是否為已讀                   System.out.println("Message " + i + " hasRead: " + isRead);                   System.out.println("Message " + i + "  containAttachment: "                           + pmm.isContainAttach((Part) message[i]));                   System.out.println("Message " + i + " form: "                           + pmm.getFrom());                   System.out.println("Message " + i + " to: "                           + pmm.getMailAddress("to"));                   System.out.println("Message " + i + " cc: "                           + pmm.getMailAddress("cc"));                   System.out.println("Message " + i + " bcc: "                           + pmm.getMailAddress("bcc"));                   pmm.setDateFormat("yy年MM月dd日 HH:mm");                   System.out.println("Message " + i + " sentdate: "                           + pmm.getSentDate());                   System.out.println("Message " + i + " Message-ID: "                           + pmm.getMessageId());                   // 獲得郵件內容===============                   pmm.getMailContent((Part) message[i]);                   System.out.println("Message " + i + " bodycontent: \r\n"                           + pmm.getBodyText());                   String file_path = File.separator + "mnt" + File.separator                           + "sdcard" + File.separator;                   System.out.println(file_path);                   pmm.setAttachPath(file_path);                   pmm.saveAttachMent((Part) message[i]);                      map = new HashMap<String, Object>();                   map.put("from", pmm.getFrom());                   map.put("title", pmm.getSubject());                   map.put("time", pmm.getSentDate());                   map.put("read", isRead);                   list.add(map);               }               SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,                       list, R.layout.item_receiveemail, new String[] {                               "from", "title", "time", "read" }, new int[] {                               R.id.item_receive_sendname,                               R.id.item_receive_title,                               R.id.item_receive_sendtime,                               R.id.item_receive_read });               lv.setAdapter(adapter);              } else {               Toast.makeText(MainActivity.this, "沒有郵件", Toast.LENGTH_SHORT)                       .show();           }       } catch (NoSuchProviderException e) {           // TODO Auto-generated catch block           e.printStackTrace();       } catch (MessagingException e) {           // TODO Auto-generated catch block           e.printStackTrace();       } catch (Exception e) {           // TODO Auto-generated catch block           e.printStackTrace();       }   }   2.imap方式 [html]   /**    * 以imap方式讀取郵件,可以判定讀取郵件是否為已讀    * */   private void getImapEmail() {       String user = "[email protected]";// 郵箱的用戶名       String password = "123456w"; // 郵箱的密碼          Properties prop = System.getProperties();       prop.put("mail.store.protocol", "imap");       prop.put("mail.imap.host", "imap.163.com");          Session session = Session.getInstance(prop);          int total = 0;       IMAPStore store;       try {           store = (IMAPStore) session.getStore("imap"); // 使用imap會話機制,連接服務器              store.connect(user, password);              IMAPFolder folder = (IMAPFolder) store.getFolder("INBOX"); // 收件箱           folder.open(Folder.READ_WRITE);           // 獲取總郵件數           total = folder.getMessageCount();           System.out.println("---共有郵件:" + total + " 封---");           // 得到收件箱文件夾信息,獲取郵件列表           List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();           System.out.println("未讀郵件數:" + folder.getUnreadMessageCount());           Message[] messages = folder.getMessages();           if (messages.length > 0) {               Map<String, Object> map;               System.out.println("Messages's length: " + messages.length);               ReciveOneMail pmm = null;               for (int i = 0; i < messages.length; i++) {                   System.out.println("======================");                   pmm = new ReciveOneMail((MimeMessage) messages[i]);                   System.out.println("Message " + i + " subject: "                           + pmm.getSubject());                   try {                       System.out.println("Message " + i + " sentdate: "                               + pmm.getSentDate());                       System.out.println("Message " + i + " replysign: "                               + pmm.getReplySign());                          boolean isRead;// 用來判斷該郵件是否為已讀                       String read;                       Flags flags = messages[i].getFlags();                       if (flags.contains(Flags.Flag.SEEN)) {                           System.out.println("這是一封已讀郵件");                           isRead = true;                           read = "已讀";                       } else {                           System.out.println("未讀郵件");                           isRead = false;                           read = "未讀";                       }                       System.out.println("Message " + i + " hasRead: "                               + isRead);                       System.out.println("Message " + i                               + "  containAttachment: "                               + pmm.isContainAttach((Part) messages[i]));                       System.out.println("Message " + i + " form: "                               + pmm.getFrom());                       System.out.println("Message " + i + " to: "                               + pmm.getMailAddress("to"));                       System.out.println("Message " + i + " cc: "                               + pmm.getMailAddress("cc"));                       System.out.println("Message " + i + " bcc: "                               + pmm.getMailAddress("bcc"));                       pmm.setDateFormat("yy年MM月dd日 HH:mm");                       System.out.println("Message " + i + " sentdate: "                               + pmm.getSentDate());                       System.out.println("Message " + i + " Message-ID: "                               + pmm.getMessageId());                       // 獲得郵件內容===============                       pmm.getMailContent((Part) messages[i]);                       System.out.println("Message " + i                               + " bodycontent: \r\n" + pmm.getBodyText());                       String file_path = File.separator + "mnt"                               + File.separator + "sdcard" + File.separator;                       System.out.println(file_path);                       pmm.setAttachPath(file_path);                       pmm.saveAttachMent((Part) messages[i]);                          map = new HashMap<String, Object>();                       map.put("from", pmm.getFrom());                       map.put("title", pmm.getSubject());                       map.put("time", pmm.getSentDate());                       map.put("read", read);                       list.add(map);                   } catch (Exception e) {                       // TODO Auto-generated catch block                       e.printStackTrace();                   }                  }               SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,                       list, R.layout.item_receiveemail, new String[] {                               "from", "title", "time", "read" }, new int[] {                               R.id.item_receive_sendname,                               R.id.item_receive_title,                               R.id.item_receive_sendtime,                               R.id.item_receive_read });               lv.setAdapter(adapter);           }       } catch (javax.mail.NoSuchProviderException e) {           // TODO Auto-generated catch block           e.printStackTrace();       } catch (MessagingException e) {           // TODO Auto-generated catch block           e.printStackTrace();       }      }   下面為用到的一個類,用來讀取除了判斷是否已讀的信息之外的內容 [html]   /**    * 接收郵箱中的郵件,可以接收帶附件的    * (目前接收的郵件中含有中文內容,會出現亂碼,但是標題不會亂碼)    * 郵件中的內容如果用專門的閱讀器也不會出現亂碼現象,圖片等都可以下載    * */   @SuppressLint("DefaultLocale")   public class ReciveOneMail {          private MimeMessage mimeMessage = null;       private String saveAttachPath = ""; // 附件下載後的存放目錄       private StringBuffer bodytext = new StringBuffer();// 存放郵件內容       private String dateformat = "yy-MM-dd HH:mm"; // 默認的日前顯示格式          public ReciveOneMail(MimeMessage mimeMessage) {           this.mimeMessage = mimeMessage;       }          public void setMimeMessage(MimeMessage mimeMessage) {           this.mimeMessage = mimeMessage;       }          /**        * 獲得發件人的地址和姓名        */       public String getFrom() 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 + "<" + from + ">";           return fromaddr;       }          /**        * 獲得郵件的收件人,抄送,和密送的地址和姓名,根據所傳遞的參數的不同 "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址        */       @SuppressLint("DefaultLocale")       public String getMailAddress(String type) throws Exception {           String mailaddr = "";           String addtype = type.toUpperCase();           InternetAddress[] address = null;           if (addtype.equals("TO") || addtype.equals("CC")                   || addtype.equals("BCC")) {               if (addtype.equals("TO")) {                   address = (InternetAddress[]) mimeMessage                           .getRecipients(Message.RecipientType.TO);               } else if (addtype.equals("CC")) {                   address = (InternetAddress[]) mimeMessage                           .getRecipients(Message.RecipientType.CC);               } else {                   address = (InternetAddress[]) mimeMessage                           .getRecipients(Message.RecipientType.BCC);               }               if (address != null) {                   for (int i = 0; i < address.length; i++) {                       String email = address[i].getAddress();                       if (email == null)                           email = "";                       else {                           email = MimeUtility.decodeText(email);                       }                       String personal = address[i].getPersonal();                       if (personal == null)                           personal = "";                       else {                           personal = MimeUtility.decodeText(personal);                       }                       String compositeto = personal + "<" + email + ">";                       mailaddr += "," + compositeto;                   }                   mailaddr = mailaddr.substring(1);               }           } else {               throw new Exception("Error emailaddr type!");           }           return mailaddr;       }          /**        * 獲得郵件主題        */       public String getSubject() throws MessagingException {           String subject = "";           try {               subject = MimeUtility.decodeText(mimeMessage.getSubject());               if (subject == null)                   subject = "";           } catch (Exception exce) {           }           return subject;       }          /**        * 獲得郵件發送日期        */       @SuppressLint("SimpleDateFormat")       public String getSentDate() throws Exception {           Date sentdate = mimeMessage.getSentDate();           SimpleDateFormat format = new SimpleDateFormat(dateformat);           return format.format(sentdate);       }          /**        * 獲得郵件正文內容        */       public String getBodyText() {           return bodytext.toString();       }          /**        * 解析郵件,把得到的郵件內容保存到一個StringBuffer對象中,解析郵件 主要是根據MimeType類型的不同執行不同的操作,一步一步的解析        */       public void getMailContent(Part part) 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) {               bodytext.append((String) part.getContent());           } else if (part.isMimeType("text/html") && !conname) {               bodytext.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));               }           } else if (part.isMimeType("message/rfc822")) {               getMailContent((Part) part.getContent());           } else {           }       }          /**        * 判斷此郵件是否需要回執,如果需要回執返回"true",否則返回"false"        */       public boolean getReplySign() throws MessagingException {           boolean replysign = false;           String needreply[] = mimeMessage                   .getHeader("Disposition-Notification-To");           if (needreply != null) {               replysign = true;           }           return replysign;       }          /**        * 獲得此郵件的Message-ID        */       public String getMessageId() throws MessagingException {           return mimeMessage.getMessageID();       }          /**        * 【判斷此郵件是否已讀,如果未讀返回返回false,反之返回true】pop3協議使用時不能判斷。        */       public boolean isNew() throws MessagingException {           boolean isnew = false;//由於isnew設為false所以每次顯示的都為未讀           Flags flags = ((Message) mimeMessage).getFlags();           System.out.println("--------flags-------" + flags);           Flags.Flag[] flag = flags.getSystemFlags();           System.out.println("----flag----" + flag);           System.out.println("flags's length: " + flag.length);           for (int i = 0; i < flag.length; i++) {               System.out.println("flag=======" + flag[i]);               System.out.println("-=-=-=Flags.Flag.SEEN=-=-=-="+Flags.Flag.SEEN);               if (flag[i] == Flags.Flag.SEEN) {                   isnew = true;                   System.out.println("seen Message.......");                   break;               }           }           return isnew;       }          /**        * 判斷此郵件是否包含附件        */       @SuppressLint("DefaultLocale")       public boolean isContainAttach(Part part) throws Exception {           boolean attachflag = false;           // String contentType = part.getContentType();           if (part.isMimeType("multipart/*")) {               Multipart mp = (Multipart) part.getContent();               for (int i = 0; i < mp.getCount(); i++) {                   BodyPart mpart = mp.getBodyPart(i);                   String disposition = mpart.getDisposition();                   if ((disposition != null)                           && ((disposition.equals(Part.ATTACHMENT)) || (disposition                                   .equals(Part.INLINE))))                       attachflag = true;                   else if (mpart.isMimeType("multipart/*")) {                       attachflag = isContainAttach((Part) mpart);                   } else {                       String contype = mpart.getContentType();                       if (contype.toLowerCase().indexOf("application") != -1)                           attachflag = true;                       if (contype.toLowerCase().indexOf("name") != -1)                           attachflag = true;                   }               }           } else if (part.isMimeType("message/rfc822")) {               attachflag = isContainAttach((Part) part.getContent());           }           return attachflag;       }          /**        * 【保存附件】        */       @SuppressLint("DefaultLocale")       public void saveAttachMent(Part part) throws Exception {           String fileName = "";           if (part.isMimeType("multipart/*")) {               Multipart mp = (Multipart) part.getContent();               for (int i = 0; i < mp.getCount(); i++) {                   BodyPart mpart = mp.getBodyPart(i);//主體部分得到處理                   String disposition = mpart.getDisposition();                   if ((disposition != null)                           && ((disposition.equals(Part.ATTACHMENT)) || (disposition                                   .equals(Part.INLINE)))) {//ATTACHMENT附件,INLINE嵌入                       fileName = mpart.getFileName();                       if (fileName.toLowerCase().indexOf("gb18030") != -1) {                           fileName = MimeUtility.decodeText(fileName);                       }                       saveFile(fileName, mpart.getInputStream());                   } else if (mpart.isMimeType("multipart/*")) {                       saveAttachMent(mpart);                   } else {                       fileName = mpart.getFileName();                       if ((fileName != null)                               && (fileName.toLowerCase().indexOf("GB18030") != -1)) {                           fileName = MimeUtility.decodeText(fileName);                           saveFile(fileName, mpart.getInputStream());                       }                   }               }           } else if (part.isMimeType("message/rfc822")) {               saveAttachMent((Part) part.getContent());           }       }          /**        * 【設置附件存放路徑】        */          public void setAttachPath(String attachpath) {           this.saveAttachPath = attachpath;       }          /**        * 【設置日期顯示格式】        */       public void setDateFormat(String format) throws Exception {           this.dateformat = format;       }          /**        * 【獲得附件存放路徑】        */       public String getAttachPath() {           return saveAttachPath;       }          /**        * 【真正的保存附件到指定目錄裡】        */       @SuppressLint("DefaultLocale")       private void saveFile(String fileName, InputStream in) throws Exception {           String osName = System.getProperty("os.name");           System.out.println("----fileName----" + fileName);           // String storedir = getAttachPath();   //      String separator = "";           if (osName == null)               osName = "";           File storefile = new File(File.separator + "mnt" + File.separator                   + "sdcard" + File.separator + fileName);              storefile.createNewFile();           System.out.println("storefile's path: " + storefile.toString());   //       for(int i=0;storefile.exists();i++){   //       storefile = new File(storedir+separator+fileName+i);   //       }              BufferedOutputStream bos = null;           BufferedInputStream bis = null;           try {               bos = new BufferedOutputStream(new FileOutputStream(storefile));               bis = new BufferedInputStream(in);               int c;               while ((c = bis.read()) != -1) {                   bos.write(c);                   bos.flush();               }           } catch (Exception exception) {               exception.printStackTrace();               throw new Exception("文件保存失敗!");           } finally {               bos.close();               bis.close();           }       }   }    
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved