注意坑点:
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;
}
2515

被折叠的 条评论
为什么被折叠?



