163邮箱推送问题

注意坑点:

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值