【问题标题】:How to use the Search Method in java mail api如何在 java mail api 中使用搜索方法
【发布时间】:2025-12-12 14:55:02
【问题描述】:

我正在使用 javamail api 创建一个搜索选项,该选项根据邮件主题中存在的关键字搜索 Gmail 文件夹中的电子邮件 这是我正在使用的代码

public class EGMail7 {
public static void main(String args[])
{
    Scanner sc = new Scanner(System.in);
    final String m10 = "abc@gmail.com";   
    final String n10 = "12345";
    string host = "smtp.gmail.com"; 
    try
    {
    Properties pro1 = new Properties();   
    pro1.put("mail.smtp.host", "smtp.gmail.com");    
    pro1.put("mail.smtp.socketFactory.port", "465");
    pro1.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");  
    pro1.put("mail.smtp.auth", "true");   
    pro1.put("mail.smtp.port", "465");  
Session session = Session.getDefaultInstance(pro1, 
        new javax.mail.Authenticator()                  
{ 
    protected PasswordAuthentication getPasswordAuthentication()
{
        return new PasswordAuthentication(m10,n10);
        }
    }); 
    Store store = session.getStore("imaps");  
    store.connect(host, m10, n10); 
    Folder folderbox = store.getFolder("INBOX");
    folderbox.open(Folder.READ_ONLY);   
    SearchTerm search = new SearchTerm(){

        @Override
        public boolean match(Message message) {
            try
            {
                if(message.getSubject().contains([Keyword]))  
                {
                    return true;
                }
            }
            catch(Exception e)
            {
                System.err.println(e.getMessage());
            }
            return false;
        }

    };

    Message[] found = folderbox.search(search);

    int length = found.length;
    for(int i = 0;i<found.length;i++)
    {
        Message mess1 = found[i];
        System.out.println("->Message Number > "+i);
        System.out.println("->Message Subject >"+mess1.getSubject());
    }
    folderbox.close(true);
    store.close();
}
    catch(Exception e)
    {
        System.err.println(e.getMessage());
    }
   }
  }

我正在使用 Eclipse IDE,我面临的问题是,无论我在 SearchTerm 方法中传递什么关键字,我总是最终得到 null Exception 和一个 Message[] Found Array 。我使用 Stack Trace 找出了这个 NullPointer 异常的问题,它位于

Message[] found = folderbox.search(search);

我似乎无法理解这里的问题是什么?

问候, 谢谢你

PS - 如果有人也可以发布更正的代码,那就太好了 谢谢

此外,当我只是在 SearchTerm 中直接添加关键字时,它会出现类似

的错误
SearchTerm searchCon = new SearchTerm([Keyword]);

有 2 个错误 1.无法实例化SearchTerm 2.Serializable类没有声明Long类型的静态最终Serial Verison UID字段

所以我无法理解这里的错误是什么

【问题讨论】:

  • 而在.match() 内部,message.getSubject() 确实为每条消息返回非空值?
  • .match() 内部 Try catch 处的堆栈跟踪给出了 NullPointer 异常并指向行 Message[] found = folderbox.search(search);
  • 但我似乎不明白我在 .match()message.getSubject() 中传递的任何关键字都存在于我的 gmail 收件箱中,并且有些邮件实际上包含主题中的关键字
  • 您能否更正 '(i+1)' 。你的 'i' 增加了 2 2。
  • 是的,谢谢你指出它已经更正了

标签: java search jakarta-mail


【解决方案1】:

您的代码中充满了这些common JavaMail mistakes,请更正它们。

无需创建自己的自定义 SearchTerm,只需使用 SubjectTerm

SearchTerm search = new SubjectTerm(keyword);

【讨论】:

  • 感谢您提供的链接,它确实很有帮助,但是响应时间比以前的方法更快,因为它至少需要 10 分钟才能得出输出?
  • 目前这似乎在程序中不起作用,当我删除自定义 SearchTerm 并直接添加关键字时会出错,请指教??另外,如果您能编写代码并提供它,那就太好了。谢谢
  • 是的,它更快,因为搜索是在 IMAP 服务器而不是客户端上完成的。你到底遇到了什么错误?
  • 抱歉回复晚了,但 SearchTem 没有直接接受关键字,它需要一个返回布尔值的自定义搜索词,我试图让它工作,但它不会接受关键字,如果有什么不同,我正在使用 Eclipse IDE
  • “不直接接受”究竟是什么意思?你到底在做什么?使用新代码和确切的错误消息更新您的帖子。
【解决方案2】:

您收到了异常,因为您有没有主题的邮件。声明应更正;

if(message.getSubject() != null && message.getSubject().contains([Keyword]))  

【讨论】:

  • 非常感谢您的代码,我现在没有收到任何错误,但它似乎仍然无法找到我的电子邮件,并且至少需要 15 分钟才能返回结果
  • 关于程序如何为所需关键字提供结果的任何建议,因为包含该关键字的主题存在于收件箱中,谢谢
  • 因为您的收件箱太大了。可能是创建具有特定日期间隔的多线程搜索的更好方法。希望这个*.com/questions/870045/… 的回答对您有所帮助。
  • 我会尝试让你知道
  • 非常感谢您的链接,搜索工作完美,与定义自定义搜索词相比,它也更快