需要下载3个jar包:mail.jar/    activation.jar/    additionnal.jar

1.pop3

/** * 以pop3方式读取邮件,此方法不能读取邮件是否为已读,已经通过测试 * */private void getEmail() {List> list = new ArrayList>();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/123456wStore 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 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();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 blocke.printStackTrace();} catch (MessagingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
2.imap方式

/** * 以imap方式读取邮件,可以判定读取邮件是否为已读 * */private void getImapEmail() {String user = "abcw111222@163.com";// 邮箱的用户名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> list = new ArrayList>();System.out.println("未读邮件数:" + folder.getUnreadMessageCount());Message[] messages = folder.getMessages();if (messages.length > 0) {Map 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();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 blocke.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 blocke.printStackTrace();} catch (MessagingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
下面为用到的一个类,用来读取除了判断是否已读的信息之外的内容

/** * 接收邮箱中的邮件,可以接收带附件的 * (目前接收的邮件中含有中文内容,会出现乱码,但是标题不会乱码) * 邮件中的内容如果用专门的阅读器也不会出现乱码现象,图片等都可以下载 * */@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. Android(安卓)View中滚动相关
  2. "Copy" did not complete normally. Please see the log for mor
  3. Android(安卓)Q Beta 更新内容介绍 [转载]
  4. 关于Android(安卓)Studio 查看源码 throw new RuntimeException(
  5. Android(安卓)draw、onDraw、dispatchDraw、invalidate、compute
  6. Android内容提供器-读取通讯录
  7. Android(安卓)studio gradle 配置阿里镜像
  8. Android中为edittext预设文字(使用hint)
  9. Android(安卓)简单记事本

随机推荐

  1. Android电池管理
  2. Android定制出厂默认输入法
  3. Android学习
  4. Android(安卓)图片缩放与旋转
  5. android 如何在对话框中获取edittext中的
  6. This Android(安卓)SDK requires Android
  7. mapView 和textView布局
  8. 大话企业级android读书笔记(三)
  9. [Android(安卓)GMS 认证] CTS 问题列表之
  10. android原生音乐播放器界面字体显示不全