IMAP 电子邮件过滤 - 方法、条件及代码示例
基本消息过滤
该 ImapClient class 提供了 ListMessages() 方法获取邮箱中的所有邮件。若只获取符合某些条件的邮件,请使用重载的 ListMessages() 方法接受 MailQuery 作为参数。 MailQuery 该类提供了用于指定条件的各种属性,例如日期、主题、发件人、收件人等。第一个示例演示了
从邮箱过滤邮件
- 连接并登录 IMAP 服务器
- 创建该类的实例 MailQuery 并设置属性
- 调用 ImapClient.ListMessages(MailQuery query) 方法并传递 MailQuery 使用参数仅获取过滤后的邮件。
以下代码片段展示了如何连接到 IMAP 邮箱并获取今天到达且主题中包含 "newsletter" 的邮件。
// Connect and log in to IMAP
const string host = "host";
const int port = 143;
const string username = "user@host.com";
const string password = "password";
ImapClient client = new ImapClient(host, port, username, password);
client.SelectFolder("Inbox");
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.Subject.Contains("Newsletter");
builder.InternalDate.On(DateTime.Now);
// Build the query and Get list of messages
MailQuery query = builder.GetQuery();
ImapMessageInfoCollection messages = client.ListMessages(query);
Console.WriteLine("Imap: " + messages.Count + " message(s) found.");
// Disconnect from IMAP
client.Dispose();
按特定条件过滤消息
上述代码示例 根据电子邮件主题和日期过滤消息。我们也可以使用其他属性设置其他支持的条件。以下是使用…设置条件的一些示例 MailQuery。以下代码片段展示了如何对以下条件过滤邮件:
- 今天的日期。
- 日期范围。
- 来自特定发件人。
- 来自特定域。
- 来自特定收件人。
今天的日期
以下代码片段展示了如何按今天的日期过滤邮件。
// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.InternalDate.On(DateTime.Now);
日期范围
以下代码片段展示了如何按日期范围过滤电子邮件。
// Emails that arrived in last 7 days
builder.InternalDate.Before(DateTime.Now);
builder.InternalDate.Since(DateTime.Now.AddDays(-7));
特定发送者
以下代码片段展示了如何按特定发件人过滤邮件。
// Get emails from specific sender
builder.From.Contains("saqib.razzaq@127.0.0.1");
特定域
以下代码片段展示了如何按特定域过滤邮件。
// Get emails from specific domain
builder.From.Contains("SpecificHost.com");
特定收件人
以下代码片段展示了如何按特定收件人过滤邮件。
// Get emails sent to specific recipient
builder.To.Contains("recipient");
高级查询构建
如果不同 MailQueryBuilder 属性在独立的语句中设置时,所有条件都会被匹配。例如,如果我们想获取特定日期范围内且来自特定主机的邮件,需要编写三条语句。
使用 AND 合并查询
下面的代码片段展示了如何使用 AND 组合查询。
// Emails from specific host, get all emails that arrived before today and all emails that arrived since 7 days ago
builder.From.Contains("SpecificHost.com");
builder.InternalDate.Before(DateTime.Now);
builder.InternalDate.Since(DateTime.Now.AddDays(-7));
使用 OR 合并查询
MailQueryBuilder 提供了 Or() 接受两个 MailQuery 将实例作为参数。它获取匹配任意两个指定条件的邮件。以下代码片段展示了如何过滤主题中包含“test”或发件人为 “noreply@host.com” 的邮件。以下代码片段展示了如何使用 OR 组合查询。
// Specify OR condition
builder.Or(builder.Subject.Contains("test"), builder.From.Contains("noreply@host.com"));
基于 InternalDate 的过滤
可以根据 InternalDate 从服务器提取邮件,但有时服务器不会返回收件箱中可见的所有邮件。原因可能是服务器时区,因为并非所有服务器都是 UTC,例如 Gmail。Aspose 按照以下内容发送类似 008 SEARCH ON 4-May-2014 的命令。 IMAP 协议 然而,由于服务器时区设置,结果可能会有所不同。已在以下位置添加了新成员: ImapMessageInfo as InternalDate 这进一步有助于过滤邮件。以下代码片段展示了如何使用 InternalDate 用于过滤邮件。
// Connect and log in to IMAP
const string host = "host";
const int port = 143;
const string username = "user@host.com";
const string password = "password";
ImapClient client = new ImapClient(host, port, username, password);
client.SelectFolder("Inbox");
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.Subject.Contains("Newsletter");
builder.InternalDate.On(DateTime.Now);
// Build the query and Get list of messages
MailQuery query = builder.GetQuery();
ImapMessageInfoCollection messages = client.ListMessages(query);
foreach (ImapMessageInfo info in messages)
{
Console.WriteLine("Internal Date: " + info.InternalDate);
}
// Disconnect from IMAP
client.Dispose();
区分大小写的过滤
以下代码片段展示了如何使用区分大小写的邮件过滤。
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.Subject.Contains("Newsletter", true);
builder.InternalDate.On(DateTime.Now);
MailQuery query = builder.GetQuery();
为查询构建器指定编码
API 的 ImapQueryBuilder 构造函数可用于为搜索字符串指定编码。也可以使用以下方式进行设置。 DefaultEncoding MailQueryBuilder 的属性。以下代码片段展示了如何为查询构建器指定编码。
// Set conditions
ImapQueryBuilder builder = new ImapQueryBuilder(Encoding.UTF8);
builder.Subject.Contains("ğüşıöç", true);
MailQuery query = builder.GetQuery();
自定义过滤选项
使用自定义标志过滤邮件
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.HasFlags(ImapMessageFlags.Keyword("custom1"));
queryBuilder.HasNoFlags(ImapMessageFlags.Keyword("custom2"));
自定义过滤搜索
例如,RFC 3501 标准不允许基于邮件中是否存在附件进行搜索。但 Gmail 提供了 IMAP 扩展 允许执行此类搜索。下面的代码片段展示了如何构建相应的查询。
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.CustomSearch("X-GM-RAW \"has:attachment\"");
MailQuery mailQuery = queryBuilder.GetQuery();
ImapMessageInfoCollection messageInfoCollection = imapClient.ListMessages(mailQuery);
使用分页支持过滤邮件
该 ImapClient 提供从邮箱搜索邮件并分页列出的功能。以下代码片段展示了如何使用分页支持过滤邮件。
///<summary>
/// This example shows how to search for messages using ImapClient of the API with paging support
/// Introduced in Aspose.Email for .NET 6.4.0
///</summary>
using (ImapClient client = new ImapClient("host.domain.com", 84, "username", "password"))
{
try
{
// Append some test messages
int messagesNum = 12;
int itemsPerPage = 5;
MailMessage message = null;
for (int i = 0; i < messagesNum; i++)
{
message = new MailMessage(
"from@domain.com",
"to@domain.com",
"EMAILNET-35128 - " + Guid.NewGuid(),
"111111111111111");
client.AppendMessage(ImapFolderInfo.InBox, message);
}
string body = "2222222222222";
for (int i = 0; i < messagesNum; i++)
{
message = new MailMessage(
"from@domain.com",
"to@domain.com",
"EMAILNET-35128 - " + Guid.NewGuid(),
body);
client.AppendMessage(ImapFolderInfo.InBox, message);
}
client.SelectFolder("Inbox");
ImapQueryBuilder iqb = new ImapQueryBuilder();
iqb.Body.Contains(body);
MailQuery query = iqb.GetQuery();
client.SelectFolder(ImapFolderInfo.InBox);
ImapMessageInfoCollection totalMessageInfoCol = client.ListMessages(query);
Console.WriteLine(totalMessageInfoCol.Count);
//////////////////////////////////////////////////////
List<ImapPageInfo> pages = new List<ImapPageInfo>();
PageSettings pageSettings = new PageSettings();
pageSettings.FolderName = ImapFolderInfo.InBox;
ImapPageInfo pageInfo = client.ListMessagesByPage(query, new PageInfo(itemsPerPage, 0), pageSettings);
pages.Add(pageInfo);
while (!pageInfo.LastPage)
{
pageInfo = client.ListMessagesByPage(query, pageInfo.NextPage, pageSettings);
pages.Add(pageInfo);
}
int retrievedItems = 0;
foreach (ImapPageInfo folderCol in pages)
retrievedItems += folderCol.Items.Count;
}
finally
{
}
}