JavaMail:搜索、过滤接收邮件,删除邮件

简介:

在 JavaMail 中,可以不像上面文章那样子调用 Folder.getMessages() 方法把邮件夹中的所有都返回,而是可以根据给定的一些条件过滤搜索出我们想要的邮件,之后再对进行获得的邮件进行操作。现在的邮箱大多都支持邮件搜索这一功能了。

要使用搜索过滤功能,必须用到 java.mail.search 包中的 SearchTerm 抽象类。在这个包中,我们可以使用其他具有不同组合关系的子类和具有不同搜索条件的类来进行操作。

1、逻辑组合关系的子类有:AndTerm 类、OrTerm 类、NotTerm 类、ComparisonTerm 类,它们都是 SearchTerm 抽象类的具体子类;

2、具体搜索条件的类有:DateTerm 类、BodyTerm 类、HeaderTerm 类,这几个都是抽象类,具体应用时应该由其对应的子类来实现。

看一些 JavaMail 帮助文档中关于 java.mail.search 包中的类集:

SearchMails01

程序要求:

搜索出 testhao@126.com 邮箱中发件人地址为 test_hao@sina.cn ,主题为 “测试1”的邮件,并由用户输入是否设置删除标记,在断开网络连接(即程序运行结束)之后 POP3 服务器会将设置有删除标记的邮件删除掉。而设置删除标记,需要用到 Message.setFlag() 方法。

目前我们往 testhao@126.com 邮箱发送了 6 封邮件,如下图,其中第一封主题为“测试1”的邮件是由 test_hao@163.com 发送的,其他的 5 封由 test_hao@sina.cn 所发。

SearchMails02

代码实现: 


 
 
  1. import java.io.BufferedReader;  
  2. import java.io.InputStreamReader;  
  3. import java.util.Properties;  
  4.  
  5. import javax.mail.Flags;  
  6. import javax.mail.Folder;  
  7. import javax.mail.Message;  
  8. import javax.mail.Session;  
  9. import javax.mail.Store;  
  10. import javax.mail.search.AndTerm;  
  11. import javax.mail.search.FromStringTerm;  
  12. import javax.mail.search.SearchTerm;  
  13. import javax.mail.search.SubjectTerm;  
  14.  
  15. /**  
  16.  * 使用 java.mail.search 包中的 SearchTerm 类  
  17.  * 在接收邮件时进行组合搜索、过滤  
  18.  * @author haolloyin  
  19.  */ 
  20. public class SearchMails {  
  21.     public static void main(String[] args) throws Exception {  
  22.         // 连接pop3服务器的主机名、协议、用户名、密码  
  23.         String pop3Server = "pop3.126.com";  
  24.         String protocol = "pop3";  
  25.         String user = "testhao";  
  26.         String pwd = "123456";  
  27.           
  28.         // 创建一个有具体连接信息的Properties对象  
  29.         Properties props = new Properties();  
  30.         props.setProperty("mail.store.protocol", protocol);  
  31.         props.setProperty("mail.pop3.host", pop3Server);  
  32.           
  33.         // 使用Properties对象获得Session对象  
  34.         Session session = Session.getInstance(props);  
  35.         session.setDebug(true);  
  36.           
  37.         // 利用Session对象获得Store对象,并连接pop3服务器  
  38.         Store store = session.getStore();  
  39.         store.connect(pop3Server, user, pwd);  
  40.           
  41.         // 获得邮箱内的邮件夹Folder对象,以"读-写"打开  
  42.         Folder folder = store.getFolder("inbox");  
  43.         folder.open(Folder.READ_WRITE);  
  44.           
  45.           
  46.         // 搜索发件人为 test_hao@sina.cn 和主题为"测试1"的邮件  
  47.         SearchTerm st = new AndTerm(  
  48.                 new FromStringTerm("test_hao@sina.cn"),  
  49.                 new SubjectTerm("测试1"));  
  50.           
  51. //      // 获得邮件夹Folder内的所有邮件Message对象  
  52. //      Message [] messages = folder.getMessages();  
  53.           
  54.         // 不是像上面那样直接返回所有邮件,而是使用Folder.search()方法  
  55.         Message [] messages = folder.search(st);  
  56.         int mailCounts = messages.length;  
  57.         System.out.println("搜索过滤到" + mailCounts + " 封符合条件的邮件!");  
  58.           
  59.         for(int i = 0; i < mailCounts; i++) {  
  60.               
  61.             String subject = messages[i].getSubject();  
  62.             String from = (messages[i].getFrom()[0]).toString();  
  63.               
  64.             System.out.println("第 " + (i+1) + "封邮件的主题:" + subject);  
  65.             System.out.println("第 " + (i+1) + "封邮件的发件人地址:" + from);  
  66.               
  67.             System.out.println("是否删除该邮件(yes/no)?:");  
  68.             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  69.             String input = br.readLine();  
  70.             if("yes".equalsIgnoreCase(input)) {  
  71.                 // 直接输出到控制台中  
  72. //              messages[i].writeTo(System.out);  
  73.                 // 设置删除标记,一定要记得调用saveChanges()方法  
  74.                 messages[i].setFlag(Flags.Flag.DELETED, true);  
  75.                 messages[i].saveChanges();  
  76.                 System.out.println("成功设置了删除标记!");  
  77.             }             
  78.         }  
  79.         // 关闭连接时设置了删除标记的邮件才会被真正删除,相当于"QUIT"命令  
  80.         folder.close(false);  
  81.         store.close();  
  82.     }  

运行过程:

SearchMails03

SearchMails04

SearchMails05

糟糕的是,不同 POP3  服务器对于邮件的访问权限的限制是不同的,在这里,pop3.126.com 服务器就不允许修改邮件了。所以,删除失败!!!SearchMails06



本文转自 xxxx66yyyy 51CTO博客,原文链接:http://blog.51cto.com/haolloyin/355075,如需转载请自行联系原作者

相关文章
java使用javamail读取邮箱(收件箱为例)
import java.io.BufferedInputStream; import java.
3768 0
|
4月前
|
存储 网络协议 数据安全/隐私保护
SMTP/POP3/IMAP(电子邮件协议)
本文介绍了电子邮件系统中常用的三种协议:SMTP、POP3 和 IMAP。SMTP(简单邮件传输协议)用于发送邮件,设计简单且广泛支持;POP3(邮局协议版本3)用于接收邮件,适合离线使用但不支持文件夹管理;IMAP(互联网消息访问协议)允许用户在服务器上管理邮件,支持多设备同步和部分下载。文章还对比了这三种协议的功能、端口及特点,并分析了它们在实际场景中的应用,帮助用户根据需求选择合适的协议。
1363 24
|
5月前
|
Web App开发 存储 安全
macOS Sequoia 15.4.1 (24E263) Boot ISO 原版可引导镜像下载
macOS Sequoia 15.4.1,2025 年 4 月 17 日,仅问题修复和安全更新。
983 6
macOS Sequoia 15.4.1 (24E263) Boot ISO 原版可引导镜像下载
|
6月前
|
人工智能 自然语言处理 前端开发
20分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
本文介绍如何使用Spring Boot3与Vue2快速构建基于DeepSeek的AI对话系统。系统具备实时流式交互、Markdown内容渲染、前端安全防护等功能,采用响应式架构提升性能。后端以Spring Boot为核心,结合WebFlux和Lombok开发;前端使用Vue2配合WebSocket实现双向通信,并通过DOMPurify保障安全性。项目支持中文语义优化,API延迟低,成本可控,适合个人及企业应用。跟随教程,轻松开启AI应用开发之旅!
|
存储 Java API
JavaMail实现收发邮件
JavaMail 是一套用于发送和接收电子邮件的API,由Sun定义,但不包含在JDK中,属于JavaEE的一部分。它支持SMTP、POP3和IMAP等邮件协议,以及SSL加密传输。JavaMail需要JAF来处理非纯文本邮件内容,如MIME附件。关键对象包括Properties(存储服务器信息)、Session(配置信息集合和初始化环境)、Transport(发送邮件)和Store(接收邮件)。Message用于构建邮件内容,Address处理邮件地址,Authenticator处理认证。JavaMail API允许开发者自定义协议支持,如NNTP和S/MIME。
335 0
|
NoSQL Redis
Redis——批量设置key的过期时间
Redis——批量设置key的过期时间
252 1
|
Java 数据安全/隐私保护
Springboot拓展之整合邮件 JavaMail的使用与实操
Springboot拓展之整合邮件 JavaMail的使用与实操
354 0
|
API PHP 数据安全/隐私保护
IMAP邮箱API接收收取邮件的方法和步骤
IMAP邮箱API是用于自动接收和管理邮件的接口,允许程序无须手动登录即可操作邮件。要使用它,需先配置邮箱允许API访问,选择如Python的imaplib或PHP的imap扩展等IMAP库,然后连接到邮箱服务器,接收和处理邮件。处理完毕后断开连接。AokSend提供高效发信服务,支持SMTP/API接口。使用IMAP API能提升邮件管理效率。