Android pop3与imap方式接收邮件(javamail)

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

1.pop3

    /*** 以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/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<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方式

    /*** 以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<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();}}

下面为用到的一个类,用来读取除了判断是否已读的信息之外的内容

/*** 接收邮箱中的邮件,可以接收带附件的* (目前接收的邮件中含有中文内容,会出现乱码,但是标题不会乱码)* 邮件中的内容如果用专门的阅读器也不会出现乱码现象,图片等都可以下载* */
@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();}}
}

 

转载于:https://www.cnblogs.com/zhujiabin/p/6254998.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(2236):react的列表渲染二

import React from react; import ReactDOM from react-dom;class Welcome extends React.Component {constructor(props) {super(props)this.state {list: [{title: "第一节课",content: 时间}, {title: "第一节课",content: 时间}, {title: "第三节…

win10 radmin远程不了_不用QQ也能电脑远程,win10这隐藏功能太良心了!真后悔发现太晚...

在工作中&#xff0c;我们难免会遇到一些棘手的电脑问题&#xff0c;自己搞定不了&#xff1f;那就找高手帮忙吧&#xff01;假若就在身旁还能帮上忙&#xff0c;但远在天边的又是鞭长莫及&#xff0c;这该如何是好呢&#xff1f;这时候大家都会想到QQ的远程功能。但经常用QQ远…

js 获取url参数(QueryString)

/// <summary>/// 获取url参数/// 王洪岐/// </summary>function QueryString(fieldName) {var urlString document.location.search;if (urlString ! null) {var typeQu fieldName "";var urlEnd urlString.indexOf(typeQu);if (urlEnd ! -1) {var …

【dubbo】消费者Consumer搭建

一.consumer搭建&#xff08;可以web/jar&#xff09; 1.新建Maven项目&#xff0c;groupId&#xff1a;com.dubbo.consumer.demo artifactId:demo projectName:dubboo-consumer-demo 2.新建class &#xff1a;com.dubbo.consumer.demo.DemoAction package com.dubbo.consumer.…

js 获取某iframe中document,浏览器兼容

/// <summary>/// 获取iframe中document&#xff0c;浏览器兼容/// 王洪岐/// id:iframe的ID/// </summary>function getIFrameDOM(id) {return document.getElementById(id).contentDocument || document.frames[id].document; }

c# mysql executenonquery_C#中ExecuteNonQuery()返回值注意点分析

本文实例讲述了C#中ExecuteNonQuery()返回值注意点。对于C#数据库程序设计有一定的借鉴价值。分享给大家供大家参考之用。具体分析如下&#xff1a;首先&#xff0c;在查询某个表中是否有数据的时候&#xff0c;我们通常用ExecuteNonQuery()&#xff0c;并通过判断值是否大于0来…

前端学习(2237):react实现疫情数据

import React from react; import ReactDOM from react-dom; import jsonData from ./code.jsonconsole.log(jsonData) let provinceObj {}/* let provinceObj{"广东省":{confirm:0,suspect:0,heal:0,deal:0}} */ jsonData.data.list.forEach((item, i) > {if (p…

数据库 数据库SQL语句五

集合运算union 并集&#xff08;两个集合如果有重复部分&#xff0c;那么只显示一次重复部分&#xff09; union all 并集&#xff08;两个集合如果有重复部分&#xff0c;那么重复部分显示两次&#xff09; intersect 交集 minus 差集--查询部门号是10和20号的员工信息 select…

SQLServer windows身份验证连接字符串

server.;databaseTest;Integrated SecurityTrue;

jdbc mysql 存储过程查询数据_JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...

主要内容&#xff1a;JDBC连接数据库步骤。一个简单详细的查询数据的例子。封装连接数据库&#xff0c;释放数据库连接方法。实现查询&#xff0c;插入&#xff0c;删除&#xff0c;更新等十一个处理数据库信息的功能。(包括事务处理&#xff0c;批量更新等)把十一个功能都放在…

vue-router之路由属性配置说明

minix 是个什么东西&#xff0c; 就是混合&#xff0c;把你混合给我 浅显表述就是 你说 &#xff1a; ‘我叫李四’&#xff0c; 我说 &#xff1a; ‘我叫张三’&#xff0c; 然后把你 混合给我&#xff0c; 就成了 我说 &#xff1a; ‘我叫张三我叫李四’&#xff0c; 所…

linux shell 用sed命令在文本的行尾或行首添加字符

from&#xff1a;http://www.cnblogs.com/aaronwxb/archive/2011/08/19/2145364.html 昨天写一个脚本花了一天的2/3的时间&#xff0c;而且大部分时间都耗在了sed命令上&#xff0c;今天不总结一下都对不起昨天流逝的时间啊~~~ 用sed命令在行首或行尾添加字符的命令有以下几种&…

lambda写法(多参数)

Lambda 表达式基本形式(input parameters) > expression< XMLNAMESPACE PREFIX "[default]" httpmsdnmicrosoftcommtps NS "http://msdn2.microsoft.com/mtps" />只有在 Lambda 有一个输入参数时&#xff0c;括号才是可选的&#xff1b;否则括号是…

linux 自动安装mysql_linux安装mysql教程

1.系统约定安装文件下载目录&#xff1a;/data/softwareMysql目录安装位置&#xff1a;/usr/local/mysql数据库保存位置&#xff1a;/data/mysql日志保存位置&#xff1a;/data/log/mysql执行如下命名&#xff1a;#mkdir /data/software#cd /data/software--下载安装包--建议&a…

C# Repeater绑定显示数组

此处绑定的对象拥有string[] Contents属性&#xff0c;绑定时将Contents[0]和Contents[1]分别绑定<asp:Repeater runat"server" ID"rptDatabase"><ItemTemplate><li><a href"Database.aspx?id<%#Eval("Contents[0]&quo…

spring使用JdbcTemplate和jdbcDaosupport及具名参数使用

关于jdbctemplate: 个人感觉比Java链接mysql那一套方便好维护多了&#xff0c;只需在配置文件维护即可 需要的包&#xff1a; com.springsource.net.sf.cglib-2.2.0.jarcom.springsource.org.aopalliance-1.0.0.jarcom.springsource.org.aspectj.weaver-1.6.8.RELEASE.jarcommo…

IIS添加直接下载的文件类型

扩展名 .dataMIME类型 application/octet-stream