注意坑点:
IMAP比POP3更加先进高效!!! 如果使用POP3服务器在获取已读未读时出现异常,原因是状态无同步。
实现业务场景:监听邮箱,先获取2个小时未读邮箱,如果获取不到获取所有历史未读邮箱。获取到后的数据进行业务逻辑推送。注意数据是内容(图片)或附近内容(图片),需开启IMAP/SMTP服务。
相关代码片段:
public static Map<String, List<Pair<String, byte[]>>> receive163() { Properties props = new Properties(); props.setProperty("mail.store.protocol", "imap"); //注意pop3服务器不支持状态的同步,所以不能用pop3协议 props.setProperty("mail.imap.host", "imap.163.com"); props.setProperty("mail.imap.port", "143"); IMAPStore store = null; javax.mail.Folder inbox = null; Map<String, List<Pair<String, byte[]>>> resultMap = new HashMap<>(); try { HashMap IAM = new HashMap(); IAM.put("name","myname"); IAM.put("version","1.0.0"); IAM.put("vendor","myclient"); IAM.put("support-email","邮箱地址"); Session session = Session.getInstance(props); store = (IMAPStore) session.getStore("imap"); store.connect(USER, PASSWORD); store.id(IAM); logger.info("成功连接到163邮箱IMAP服务器"); // 打开收件箱 inbox = store.getFolder("INBOX"); if (!inbox.isOpen()) { inbox.open(javax.mail.Folder.READ_WRITE); logger.info("已打开收件箱,邮件总数: " + inbox.getMessageCount()); } else { logger.info("收件箱已打开,邮件总数: " + inbox.getMessageCount()); } // 搜索未读邮件 Message[] unreadMessages = searchUnreadMessages(inbox); if (unreadMessages.length == 0) { logger.info("没有找到未读邮件"); return resultMap; } else { logger.info("找到 " + unreadMessages.length + " 封未读邮件,开始处理..."); // 处理邮件(这里仅标记为已读,可根据需要扩展) for (int i = 0; i < unreadMessages.length; i++) { Message message = unreadMessages[i]; try { logger.info("\nProcessing message #" + (i + 1)); String subject = message.getSubject() != null ? message.getSubject() : "No Subject"; logger.info("Subject: " + subject); logger.info("From: " + Arrays.toString(message.getFrom())); logger.info("Sent Date: " + message.getSentDate()); logger.info("Flags: " + message.getFlags()); List<Pair<String, byte[]>> attachments = new ArrayList<>(); processMessageContent(message, attachments); if (!attachments.isEmpty()) { resultMap.put(subject, attachments); logger.info("Found " + attachments.size() + " attachments"); } else { logger.info("No attachments found in this message"); } } catch (Exception e) { logger.info("Error processing message #" + (i + 1), e); } } markMessagesAsRead(unreadMessages); logger.info("已成功标记 " + unreadMessages.length + " 封邮件为已读"); } } catch (AuthenticationFailedException afe) { logger.error("Authentication failed: " + afe.getMessage()); logger.error("Please verify username and password/authorization code"); } catch (MessagingException me) { logger.error("Messaging error: " + me.getMessage(), me); if (me.getNextException() != null) { logger.error("Nested exception: ", me.getNextException()); } } catch (Exception e) { logger.error("Unexpected error: " + e.getMessage(), e); } finally { closeResources(inbox, store); } return resultMap; }