【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获取邮件内容,删除邮件、根据时间段筛选邮件,筛选时间段+未读邮件

完结!


相关文章
|
16天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
16天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
17天前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
|
13天前
|
安全 Java 开发者
Java多线程编程中的常见问题与解决方案
本文深入探讨了Java多线程编程中常见的问题,包括线程安全问题、死锁、竞态条件等,并提供了相应的解决策略。文章首先介绍了多线程的基础知识,随后详细分析了每个问题的产生原因和典型场景,最后提出了实用的解决方案,旨在帮助开发者提高多线程程序的稳定性和性能。
|
18天前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
|
19天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
34 3
|
21天前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
15 1
|
23天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
44 2
Java基础异常-自定义异常
Java基础异常-自定义异常
Java基础异常-自定义异常
|
Java 编译器
Java中的异常(抛出异常、自定义异常等)
Java中的异常(抛出异常、自定义异常等)
308 1