Penyaringan Email IMAP - Metode, Kriteria & Contoh Kode
Penyaringan Pesan Dasar
The ImapClient class menyediakan ListMessages() metode yang mengambil semua pesan dari kotak surat. Untuk hanya mendapatkan pesan yang cocok dengan beberapa kondisi, gunakan overload ListMessages() metode yang mengambil MailQuery sebagai argumen. The MailQuery kelas menyediakan berbagai properti untuk menentukan kondisi, misalnya tanggal, subjek, pengirim, penerima, dll. Contoh pertama mengilustrasikan cara memfilter pesan berdasarkan tanggal dan subjek. Kami juga menunjukkan cara memfilter berdasarkan kriteria lain dan cara membangun kueri yang lebih kompleks. API juga menyediakan kemampuan untuk menerapkan kriteria pencarian sensitif huruf besar/kecil untuk mencocokkan kriteria filter yang tepat. API juga memungkinkan penentuan encoding string pencarian untuk memfilter pesan dari kotak surat.
Filter Pesan dari Kotak Surat
- Hubungkan dan masuk ke server IMAP
- Buat sebuah instansi dari MailQuery dan atur properti
- Panggil ImapClient.ListMessages(MailQuery query) metode dan melewatkan MailQuery dengan parameter untuk hanya mendapatkan pesan yang difilter.
Potongan kode berikut menunjukkan cara terhubung ke kotak surat IMAP dan mendapatkan pesan yang tiba hari ini serta memiliki kata "newsletter" di subjek.
// 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();
Filter Pesan berdasarkan Kriteria Spesifik
Contoh kode di atas menyaring pesan berdasarkan subjek email dan tanggal. Kami dapat menggunakan properti lain untuk mengatur kondisi yang didukung lainnya juga. Berikut beberapa contoh pengaturan kondisi menggunakan MailQuery. Potongan kode berikut menunjukkan cara memfilter email pada:
- Tanggal hari ini.
- Rentang tanggal.
- Dari pengirim tertentu.
- Dari domain tertentu.
- Dari penerima tertentu.
Tanggal Hari Ini
Potongan kode berikut menunjukkan cara memfilter email berdasarkan Tanggal Hari Ini.
// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.InternalDate.On(DateTime.Now);
Rentang Tanggal
Cuplikan kode berikut menunjukkan cara memfilter email berdasarkan rentang tanggal.
// Emails that arrived in last 7 days
builder.InternalDate.Before(DateTime.Now);
builder.InternalDate.Since(DateTime.Now.AddDays(-7));
Pengirim Khusus
Potongan kode berikut menunjukkan cara memfilter email berdasarkan pengirim tertentu.
// Get emails from specific sender
builder.From.Contains("saqib.razzaq@127.0.0.1");
Domain Khusus
Potongan kode berikut menunjukkan cara memfilter email berdasarkan domain tertentu.
// Get emails from specific domain
builder.From.Contains("SpecificHost.com");
Penerima Khusus
Potongan kode berikut menunjukkan cara memfilter email berdasarkan penerima tertentu.
// Get emails sent to specific recipient
builder.To.Contains("recipient");
Membangun Kueri Lanjutan
Jika berbeda MailQueryBuilder properti diatur dalam pernyataan terpisah, maka semua kondisi akan cocok. Misalnya, jika kita ingin mendapatkan pesan antara rentang tanggal dan dari host tertentu, kita perlu menulis tiga pernyataan.
Gabungkan Kueri dengan AND
Potongan kode berikut menunjukkan cara menggabungkan kueri dengan 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));
Gabungkan Kueri dengan OR
MailQueryBuilder menyediakan Or() metode yang mengambil dua MailQuery instansi sebagai parameter. Ini mengambil pesan yang cocok dengan salah satu dari dua kondisi yang ditentukan. Potongan kode berikut menunjukkan cara memfilter pesan yang memiliki “test” di subjek atau “noreply@host.com” sebagai pengirim. Potongan kode berikut menunjukkan cara menggabungkan kueri dengan OR.
// Specify OR condition
builder.Or(builder.Subject.Contains("test"), builder.From.Contains("noreply@host.com"));
Penyaringan Berdasarkan InternalDate
Pesan dapat diekstrak dari server berdasarkan InternalDate namun kadang server tidak mengembalikan semua pesan yang terlihat di kotak masuk. Penyebabnya dapat berupa zona waktu server karena mungkin tidak UTC untuk semua server seperti Gmail. Aspose mengirim perintah seperti 008 SEARCH ON 4-May-2014 sesuai dengan protokol IMAP namun hasil dapat berbeda karena pengaturan zona waktu server. Anggota baru ditambahkan dalam ImapMessageInfo sebagai InternalDate yang lebih membantu dalam memfilter pesan. Potongan kode berikut menunjukkan penggunaan InternalDate untuk memfilter pesan.
// 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();
Penyaringan Sensitif Huruf Besar/Kecil
Potongan kode berikut menunjukkan cara menggunakan penyaringan email yang sensitif huruf besar/kecil.
// 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();
Tentukan Encoding untuk Pembuat Kueri
API ImapQueryBuilder konstruktor dapat digunakan untuk menentukan Encoding untuk string pencarian. Ini juga dapat diatur menggunakan DefaultEncoding properti dari MailQueryBuilder. Potongan kode berikut menunjukkan cara menentukan encoding untuk pembuat kueri.
// Set conditions
ImapQueryBuilder builder = new ImapQueryBuilder(Encoding.UTF8);
builder.Subject.Contains("ğüşıöç", true);
MailQuery query = builder.GetQuery();
Opsi Penyaringan Kustom
Filter Pesan dengan Flag Kustom
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.HasFlags(ImapMessageFlags.Keyword("custom1"));
queryBuilder.HasNoFlags(ImapMessageFlags.Keyword("custom2"));
Pencarian Kustom untuk Penyaringan
Misalnya, standar RFC 3501 tidak mengizinkan pencarian pesan berdasarkan keberadaan lampiran dalam pesan. Namun Gmail menyediakan Ekstensi IMAP yang memungkinkan melakukan pencarian seperti itu. Cuplikan kode berikut menunjukkan cara membuat kueri yang sesuai.
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.CustomSearch("X-GM-RAW \"has:attachment\"");
MailQuery mailQuery = queryBuilder.GetQuery();
ImapMessageInfoCollection messageInfoCollection = imapClient.ListMessages(mailQuery);
Filter Pesan dengan Dukungan Paging
The ImapClient menyediakan kemampuan untuk mencari pesan dari kotak surat dan menyusunnya dengan dukungan paging. Potongan kode berikut menunjukkan cara memfilter pesan dengan dukungan paging.
///<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
{
}
}