/** @return */ public int getUnreadMessageCount() throws Exception { Folder f = getFolder(); if (f.exists()) { return f.getUnreadMessageCount(); } return 0; }
/** * <b>使用IMAP协议接收邮件</b><br> * * <p>POP3和IMAP协议的区别: <b>POP3</b>协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,<br> * 比如通过客户端收取了邮箱中的3封邮件并移动到其它文件夹,邮箱服务器上的这些邮件是没有同时被移动的。<br> * * <p><b>IMAP</b>协议提供webmail与电子邮件客户端之间的双向通信,客户端的操作都会同步反应到服务器上,对邮件进行的操作,服务 * 上的邮件也会做相应的动作。比如在客户端收取了邮箱中的3封邮件,并将其中一封标记为已读,将另外两封标记为删除,这些操作会 即时反馈到服务器上。 * * <p>两种协议相比,IMAP 整体上为用户带来更为便捷和可靠的体验。POP3更易丢失邮件或多次下载相同的邮件,但IMAP通过邮件客户端 * 与webmail之间的双向同步功能很好地避免了这些问题。 */ public static void main(String[] args) throws Exception { // 准备连接服务器的会话信息 Properties props = new Properties(); props.setProperty("mail.store.protocol", "imap"); props.setProperty("mail.imap.host", "imap.qq.com"); props.setProperty("mail.imap.port", "143"); // 创建Session实例对象 Session session = Session.getInstance(props); // 创建IMAP协议的Store对象 Store store = session.getStore("imap"); // 连接邮件服务器 store.connect("*****@*****.**", "asdasd"); // 获得收件箱 Folder folder = store.getFolder("INBOX"); // 以读写模式打开收件箱 folder.open(Folder.READ_WRITE); // 获得收件箱的邮件列表 Message[] messages = folder.getMessages(); // 打印不同状态的邮件数量 System.out.println("收件箱中共" + messages.length + "封邮件!"); System.out.println("收件箱中共" + folder.getUnreadMessageCount() + "封未读邮件!"); System.out.println("收件箱中共" + folder.getNewMessageCount() + "封新邮件!"); System.out.println("收件箱中共" + folder.getDeletedMessageCount() + "封已删除邮件!"); System.out.println("------------------------开始解析邮件----------------------------------"); // 解析邮件 for (Message message : messages) { IMAPMessage msg = (IMAPMessage) message; String subject = MimeUtility.decodeText(msg.getSubject()); System.out.println("[" + subject + "]未读,是否需要阅读此邮件(yes/no)?"); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String answer = reader.readLine(); if ("yes".equalsIgnoreCase(answer)) { Pop3ReceiveMailUtil.parseMessage(msg); // 解析邮件 // 第二个参数如果设置为true,则将修改反馈给服务器。false则不反馈给服务器 msg.setFlag(Flags.Flag.SEEN, true); // 设置已读标志 } } // 关闭资源 folder.close(false); store.close(); }
/** * 读取邮件 * * @param em_protocal 协议类型,如 PROTOCAL.imap * @param uid 邮箱账号,如[email protected] * @param password 邮箱密码 * @return */ public static boolean fetchMail(PROTOCAL em_protocal, String uid, String password) { boolean success = false; String host = null; String protocal = null; if (em_protocal.equals(PROTOCAL.imap)) { host = "imap." + uid.substring(uid.indexOf("@") + 1, uid.length()); protocal = "imap"; } else if (em_protocal.equals(PROTOCAL.pop3)) { host = "pop." + uid.substring(uid.indexOf("@") + 1, uid.length()); protocal = "pop3"; } Store store = null; Folder inbox = null; try { Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); session.setDebug(true); // 有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使用(你可以在控制台(console)上看到发送邮件的过程) store = session.getStore(protocal); store.connect(host, uid, password); inbox = store.getFolder("INBOX"); // 收件箱 inbox.open(Folder.READ_ONLY); // FetchProfile profile = new FetchProfile(); // profile.add(FetchProfile.Item.ENVELOPE); Message[] messages = inbox.getMessages(); // inbox.fetch(messages, profile); System.out.println("收件箱的邮件数:" + messages.length); System.out.println("未读邮件数:" + inbox.getUnreadMessageCount()); System.out.println("新邮件数:" + inbox.getNewMessageCount()); for (int i = 0; i < messages.length; i++) { // 邮件发送者 String from = decodeText(messages[i].getFrom()[0].toString()); InternetAddress ia = new InternetAddress(from); System.out.println("FROM:" + ia.getPersonal() + '(' + ia.getAddress() + ')'); // 邮件标题 System.out.println("TITLE:" + messages[i].getSubject()); // 邮件内容 parseMailContent(messages[i].getContent()); // 邮件大小 System.out.println("SIZE:" + messages[i].getSize()); // 邮件发送时间 System.out.println("DATE:" + messages[i].getSentDate()); } success = true; } catch (Exception e) { e.printStackTrace(); } finally { try { inbox.close(false); } catch (Exception e) { } try { store.close(); } catch (Exception e) { } } return success; }