java读取邮件标题时,突然报错Failed to load IMAP envelope

news2024/12/23 10:19:43

生产环境之前可以正常使用imap协议收取邮件,突然有一天报错Failed to load IMAP envelope,可以确定邮件服务器、账号密码、配置都是正确的,使用foxmail可以正常连接并成功收取邮件,因此可以推测java代码可能有兼容性问题,连接服务器的代码如下,开启mail.debug后,打印日志可以看到已经成功使用imap连接到服务器

    public void connect() throws Exception{
        Properties props = new Properties();
        props.put("mail.host", config.getServer());
        props.put("mail." + config.getProtocol() + ".timeout", 60000);
        props.put("mail." + config.getProtocol() + ".connectiontimeout", 6000);
        props.setProperty("mail.store.protocol", config.getProtocol());
        props.setProperty("mail." + config.getProtocol() + ".host", config.getServer());
        props.setProperty("mail." + config.getProtocol() + ".port", String.valueOf(config.getPort()));

        if(config.isDebug()){
            props.put("mail.debug", "true");
            props.put("mail.debug.auth", "true");
        }
        if(config.isSsl()){
            props.put("mail." + config.getProtocol() + ".socketFactory.port", String.valueOf(config.getPort()));
            props.put("mail." + config.getProtocol() + ".starttls.enable", config.isTtlEnable());
            props.put("mail." + config.getProtocol() + ".ssl.protocols", "TLSv1.2");
            //启用明文验证
            //props .setProperty("mail." + config.getProtocol() + ".auth.plain.disable", "false");

            props.setProperty("mail." + config.getProtocol() + ".socketFactory.fallback","false");
            // 设置授权码验证
            //props.put("mail." + config.getProtocol() + ".auth", "true");
            props.put("mail." + config.getProtocol() + ".ssl.enable", "true");
            props.put("mail." + config.getProtocol() + ".ssl.trust", "*");
            props.put("mail." + config.getProtocol() + ".socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        }
        // 创建Session实例对象
        Session session = Session.getInstance(props);
        // 创建IMAP协议的Store对象

        store = session.getStore(config.getProtocol());
        // 连接邮件服务器
        store.connect(config.getUsername(),config.getPassword());
        // 获得收件箱
        folder = store.getFolder("INBOX");
        // 以只读模式打开收件箱
        folder.open(Folder.READ_ONLY);
    }

mail使用的是1.4.7版本,从服务器读取邮件的代码如下:

    /**
     * 读取cnt封邮件
     */
    public void receiveByCount(int cnt) throws Exception {
        log.info("开始收取邮件");
        long t0 = System.currentTimeMillis();
        cnt--;
        int n = folder.getMessageCount();
        if(n > 0){
            int from = Math.max(1,n - cnt);
            Message[] messages = folder.getMessages(from,n);
            log.info("共收取到{}封邮件",messages.length);
            for (int i = messages.length - 1; i >= 0; i--) {
                log.info("开始读取第{}封邮件",i+1);
                long t = System.currentTimeMillis();
                String uid ;
                if(folder instanceof IMAPFolder){
                    uid = String.valueOf(((IMAPFolder) folder).getUID(messages[i]));
                }else {
                    uid = ((POP3Folder)folder).getUID(messages[i]);
                }
                //这里会报错
                messages[i].getSubject();
                log.info("读取第{}封邮件耗时{}ms",i+1,System.currentTimeMillis()-t);
                //mailList.add(tran);
            }
        }
        log.info("收取邮件结束,耗时{}ms",System.currentTimeMillis()-t0);
    }

 当我调用 messages[i].getSubject(); 时,后台报错Failed to load IMAP envelope,断点找到报错位置

 这里不知为何没有获取到envelope这个对象,网上找到说法说是邮箱服务器设置了限制,只收取最近30天的邮件,但是我遇到的并不是这个问题。我是先获取了收信箱所有邮件的数量,然后读取最近的cnt封邮件:

//读取索引从from到to的所有邮件
Message[] messages = folder.getMessages(from,n);

当程序在进行第一次读取时,就抛出了异常。

经过一番尝试,我又使用日期范围去进行搜索邮件

// 获取当前日期和30天前的日期
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, -30);
Date thirtyDaysAgo = cal.getTime();
// 创建一个搜索条件,限制邮件日期在30天内
SearchTerm searchTerm = new ReceivedDateTerm(ComparisonTerm.GT, thirtyDaysAgo);

// 使用搜索条件来搜索邮件
Message[] messages = folder.search(searchTerm);

发现这次读取邮件时,并没有报上面的错误,不明觉厉,不明白是什么原因导致的。

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

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

相关文章

翻遍200个网站,整理了这套CSDN最系统的网络安全学习路线

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…

MySQL第七次

1、 string类型数据的命令操作: 2、 list类型数据的命令操作: 3、 hash类型数据的命令操作: 4、Keys相关的命令操作 二、举例说明list和hash的应用场景 hash:电商购物车 以用户id为key,商品id为field,商品数…

知识图谱推理的学习逻辑规则(上)7.19+(下)7.20

知识图谱推理的学习逻辑规则 摘要介绍相关工作模型 (7.20)知识图谱推理逻辑规则概率形式化参数化规则生成器具有逻辑规则的推理预测器 优化E步骤M步骤 实验实验设置实验结果 总结 原文: 摘要 本文研究了在知识图谱上进行推理的学习逻辑规则…

Airbnb 引入 HTTP Streaming,网页性能得到大幅度提升

Airbnb 通过引入HTTP Streaming来提升网站的页面加载性能。他们将测试的每个页面(包括主页)的首次内容绘制(First Contentful Paint,FCP)时间降低了大约 100 毫秒。他们还最小化了后端慢查询对加载时间的影响。 Airbn…

机房监控教程:管理不求人,即学即用!

供电系统的可靠性直接影响到广电数据中心机房设备的正常运转,涉及信息存储、节目录制采编传输、影音数据等生产质量和播出质量。 为确保数据中心机房安全运行,实现对数据中心机房各系统设备的统一监控与有效管理,减轻机房维护人员工作负担&am…

MySql5.6版本开启慢SQL功能-本次采用永久生效方式

文章目录 一、目的二、注意点说明三、操作步骤3.1 临时生效操作步骤3.2 永久生效操作步骤3.3 按日期生成日志文件3.4 执行成功后验证功能是否开启 四、慢SQL日志记录内容介绍五、Shell脚本 一、目的 开启 MySQL 的慢查询日志(Slow Query Log)可以帮助你…

怎么做活码二维码?动态码在线生成技巧

现在制作二维码用户大多习惯使用活码二维码,其优势在于能够在二维码不变的情况下修改内容,能够生成二维码长期使用,还可以设置有效期、加密等其他功能可以使用。那么怎么生成活码二维码呢?可以使用二维码生成器(免费在…

EasyCVR告警类型设置后首页需要刷新才能更新的问题优化

EasyCVR视频融合平台基于云边端一体化架构,可支持多协议、多类型设备接入,包括:NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力,可在复杂的网络环境中&#xff0c…

【Jeston Nano】环境配置-部署yolov5

【Jeston Nano】环境配置-部署yolov5 一.Jeston Nano系统初始化设置1.Chinese 语言包2.备份3.更换源 二.环境配置,安装包1.CUDA2.pip33.jtop4.配置可能需要的库5.安装所需要的依赖环境6.安装opencv的系统级依赖,一些编码库7.更新CMake8.u盘兼容 三、安装…

python web开发之WSGI/uwsgi/uWSGI详解

1. 三者的定义 WSGI是一种通信协议。uwsgi是一种传输协议。uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。 2.三者的使用场景 WSGI,全称 Web Server Gateway Interface,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接…

Jmeter性能测试,通过插件监控服务器资源使用情况

Jmeter作为性能测试的首选工具,那么在性能测试过程中如何方便快捷的监测服务器资源使用情况? 可以通过jmeter 安装"PerfMon(Servers Performance Monitoting)"插件并配合服务端资源监控工具进行实现,详细操作流程如下:…

MySQL 中使用变量实现排名名次

title: MySQL 中使用变量实现排名名次 date: 2023-7-16 19:45:26 tags:- SQL 高级查询 一. 数据准备: CREATE TABLE sql_rank (id INT ( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT,user_id INT ( 11 ) UNSIGNED NOT NULL,score TINYINT ( 3 ) UNSIGNED NOT NULL,add_time date NO…

Spring Batch之读数据库—HibernateCursorItemReader(三十九)

一、HibernateCursorItemReader 对应关系映射(Object Relational Mapping,ORM)是一种为解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。 H…

html 解决css样式 缓存 ---css引入添加时间戳

通过js 对引入的css添加时间戳 <script type"text/javascript">document.write("<link relstylesheet typetext/css href./style/base.css?v" new Date().getTime() ">");document.write("<link relstylesheet typetext…

和chatgpt学架构03-引入UI框架(elment-plus)

目录 1 项目目录及文件的具体作用1.1 App.vue1.2 main.js的作用1.3 main.js什么时候被调用1.4 npm run serve干了什么事情1.5 package.json的作用 2 安装UI框架2.1 安装命令2.2 全局引入 3 启动工程总结 我们已经安装好了我们的vue脚手架&#xff0c;用vscode打开工程目录 要自…

有序链表转换二叉搜索树

给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,nul…

封装hiredis成dll包,为老项目提供redis网络支持

第一步&#xff1a;准备VS环境 1、需要下载window8.1的SDK否则无法下载 2、平台工具集需要使用Visual Studio 2015(v140) 第二步&#xff1a;下载hiredis 去microsoft/hiredis下载windows版本的hiredis&#xff0c;并解压到本地 打开hiredis-master\msvs\vs-solutions中的sl…

linux之Ubuntu系列 find 、 ln 、 tar、apt 指令 软链接和硬链接 snap

查找文件 find 命令 功能非常强大&#xff0c;通常用来在 特定的目录下 搜索 符合条件的文件 find [path] -name “.txt” 记得要加 “ ” 支持通配符 &#xff0c;正则表达式 包括子目录 ls 不包括 子目录 如果省略路径&#xff0c;表示 在当前路径下&#xff0c;搜索 软链接…

GPT 如此强大,我们可以利用它实现什么?

GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer结构的预训练语言生成模型&#xff0c;由OpenAI研发。它可以生成高质量的自然语言文本&#xff0c;取得了很好的效果&#xff0c;被广泛应用于各个领域。以下是一些利用GPT实现的应用。 一…

01-复杂度1 最大子列和问题

中国大学MOOC-陈越、何钦铭-数据结构-2023夏季 题目集 题目 思路 令f(n)表示以第n个数结尾的连续序列的最大和&#xff0c;则状态转移方程为&#xff1a; 解释&#xff1a;如果f(n-1)小于零&#xff0c;代表对f(n)的值贡献为负。故&#xff0c;以为结尾的最大子列和就是&…