【Java异常】Caused by: com.sun.mail.iap.BadCommandException: A3 BAD invalid command or parameters的解决方案

简介: 【Java异常】Caused by: com.sun.mail.iap.BadCommandException: A3 BAD invalid command or parameters的解决方案

Caused by: com.sun.mail.iap.BadCommandException: A3 BAD invalid command or parameters

一、背景介绍

公司的一个项目根据 javax.mail 统计邮箱里的邮件内容,由于邮件数量很多,如果全量读取收件箱里的邮件的话,会非常耗时,导致时间非常长(根据统计全量读取3000封邮件,耗时平均近7分钟),所以在读取收件箱里的邮件时要根据某些条件进行筛选,这样就很好的解决了这个问题。比如我的项目里,添加了根据时间筛选收件箱里的邮件,效率瞬间都提升上来了。但是我在添加时间范围的时候竟然报错,导致花费了一定的时间,在此做一个记录。

项目主要技术栈:Spring boot (2.0.0.RELEASE) + mybatis-plus (3.1.1) + JDK 1.8 + javax.mail (1.6.1)

关键代码:    

    Properties props = new Properties();
    Session session = Session.getDefaultInstance(props, null);
    // 邮箱协议
    Store store = session.getStore("imap");
    // 邮箱主机,用户名和密码
    store.connect(mailHost, mailUsername, mailPassword);
    // 读取收件箱
    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_ONLY);
    // 以下为添加根据时间筛选邮件的条件
    Calendar calendar = Calendar.getInstance();
    // 搜索3天前到今天收到的的所有邮件,根据时间筛选邮件
    calendar.add(Calendar.DAY_OF_MONTH, -3);
    // 创建ReceivedDateTerm对象,ComparisonTerm.GE(大于等于),Date类型的时间 new Date(calendar.getTimeInMillis())----(表示3天前)
    ReceivedDateTerm term = new ReceivedDateTerm(ComparisonTerm.GE, new Date(calendar.getTimeInMillis()));
    // 把时间筛选条件添加到收件箱文件夹里,得到3天前到今天的所有邮件
    Message[] message = folder.search(term);
    // Message[] message = folder.getMessages(); 这个是获取收件箱里所有邮件
    // todo 进行你的业务

ComparisonTerm类 常用的日期和数字比较中,它使用六个常量 LE(<=)、LT(<)、EQ(=)、NE(!=)、GT(>)、GE(>=)来表示六种不同的比较操作。

如下图是我截取的jdk源码中的类的属性:

二、报错内容

主要报错:Caused by: com.sun.mail.iap.BadCommandException: A3 BAD invalid command or parameters

详细报错如下:

javax.mail.MessagingException: A3 BAD invalid command or parameters;

 nested exception is:

   com.sun.mail.iap.BadCommandException: A3 BAD invalid command or parameters

   at com.sun.mail.imap.IMAPFolder.search(IMAPFolder.java:1547)

   at com.iot.daily.task.MailNoSubmitTask.queryEmailDailyNoSubmitSync(MailNoSubmitTask.java:90)

   at com.iot.daily.task.MailNoSubmitTask

����������������������

9403690b.invoke(<generated>)    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:747)    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)    at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)    at java.util.concurrent.FutureTask.run(FutureTask.java)    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)    at java.lang.Thread.run(Thread.java:748)Caused by: com.sun.mail.iap.BadCommandException: A3 BAD invalid command or parameters    at com.sun.mail.iap.Protocol.handleResult(Protocol.java:296)    at com.sun.mail.imap.protocol.IMAPProtocol.issueSearch(IMAPProtocol.java:1471)    at com.sun.mail.imap.protocol.IMAPProtocol.search(IMAPProtocol.java:1379)    at com.sun.mail.imap.protocol.IMAPProtocol.search(IMAPProtocol.java:1367)    at com.sun.mail.imap.IMAPFolder.search(IMAPFolder.java:1527)    ... 11 more

三、报错原因

报错的点是 ComparisonTerm.GE 这个比较操作,可能是这个 GE(大于等于)的操作不能和时间比较,如果改成 ComparisonTerm.GT (大于)的操作即可。然后一切正常。

具体的报错原因,还不清楚,希望各位知道的大佬不吝赐教,可在评论区讨论啊,以便帮助更多需要的人。

四、解决方案

ComparisonTerm.GE(大于等于) 这个大于等于比较改成 ComparisonTerm.GT (大于)大于比较即可。

即:下面的关键代码。

ReceivedDateTerm term = new ReceivedDateTerm(ComparisonTerm.GE, new Date(calendar.getTimeInMillis()));

改成

ReceivedDateTerm term = new ReceivedDateTerm(ComparisonTerm.GT, new Date(calendar.getTimeInMillis()));

拓展:

SpringBoot javax获取邮件内容,删除邮件、根据时间段筛选邮件,筛选时间段+未读邮件

完结!


相关文章
|
2天前
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
4月前
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
242 13
|
2天前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
27天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
105 14
|
1月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
70 7
|
1月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
136 5
|
3月前
|
JSON 前端开发 Java
【Bug合集】——Java大小写引起传参失败,获取值为null的解决方案
类中成员变量命名问题引起传送json字符串,但是变量为null的情况做出解释,@Data注解(Spring自动生成的get和set方法)和@JsonProperty
|
2月前
|
JSON 前端开发 安全
【潜意识java】前后端跨域问题及解决方案
本文深入探讨了跨域问题及其解决方案。跨域是指浏览器出于安全考虑,限制从一个域加载的网页请求另一个域的资源。
114 0
|
4月前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
4月前
|
安全 Java 开发者
Java多线程编程中的常见问题与解决方案
本文深入探讨了Java多线程编程中常见的问题,包括线程安全问题、死锁、竞态条件等,并提供了相应的解决策略。文章首先介绍了多线程的基础知识,随后详细分析了每个问题的产生原因和典型场景,最后提出了实用的解决方案,旨在帮助开发者提高多线程程序的稳定性和性能。

热门文章

最新文章