Ambil dan Daftar Email dari Server IMAP
Mengambil dan Mendaftar Pesan
Cara Mendapatkan Informasi Identifikasi untuk Pesan dalam Kotak Surat
Saat mengambil dan memproses pesan email, Anda dapat memperoleh informasi identifikasi detail, seperti nomor urut dan ID unik, dengan menggunakan fitur berikut yang disediakan oleh versi terbaru Aspose.Email untuk .NET:
Aspose.Email.ImapMessageInfo kelas: Mewakili informasi identifikasi tentang pesan dalam kotak surat IMAP.
ImapMessageInfo.SequenceNumber properti: Mengambil nomor urut pesan.
ImapMessageInfo.UniqueId properti: Mengambil pengidentifikasi unik dari pesan.
Aspose.Email.MailMessage.ItemId properti: Mewakili informasi identifikasi tambahan tentang pesan di dalam kotak surat.
Cuplikan kode berikut memperlihatkan cara mendapatkan informasi identifikasi untuk pesan dalam kotak surat IMAP:
- Buat sebuah instansi dari ImapClient kelas dengan menyediakan parameter yang diperlukan seperti host server IMAP, port, alamat email, kata sandi, dan opsi keamanan.
- Gunakan ListMessages metode untuk mengambil daftar pesan dari folder "INBOX". Batasi daftar hingga lima pesan pertama menggunakan metode Take(5).
- Ekstrak nomor urut dari pesan yang terdaftar dengan menggunakan SequenceNumber properti setiap pesan.
- Gunakan FetchMessages metode untuk mengambil detail lengkap dari pesan di server, menggunakan nomor urut yang diperoleh pada langkah sebelumnya.
- Loop melalui pesan yang diambil dan untuk setiap pesan, ambil serta tampilkan informasi berikut:
- Nomor urut pesan.
- Properti ItemId.SequenceNumber.
- Subjek pesan.
using (var client = new ImapClient(imapHost, port, emailAddress, password, securityOption))
{
// List the first 5 messages from the inbox
var msgs = client.ListMessages("INBOX").Take(5);
// Get sequence numbers of the messages
var seqIds = msgs.Select(t => t.SequenceNumber);
// Fetch messages based on sequence numbers
var msgsViaFetch = client.FetchMessages(seqIds);
for (var i = 0; i < 5; i++)
{
var thisMsg = msgsViaFetch[i];
Console.WriteLine($"Message ID: {seqIds.ElementAt(i)} SequenceNumber: {thisMsg.ItemId.SequenceNumber} Subject: {thisMsg.Subject}");
}
}
Daftar ID Pesan MIME dari Server
ImapMessageInfo menyediakan MIME MessageId untuk identifikasi pesan tanpa mengekstrak seluruh pesan. Potongan kode berikut menunjukkan cara mencantumkan MIME messageId.
ImapClient client = new ImapClient();
client.Host = "domain.com";
client.Username = "username";
client.Password = "password";
try
{
ImapMessageInfoCollection messageInfoCol = client.ListMessages("Inbox");
foreach (ImapMessageInfo info in messageInfoCol)
{
// Display MIME Message ID
Console.WriteLine("Message Id = " + info.MessageId);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Daftar Pesan dari Server
Aspose.Email menyediakan varian overload 2-anggota dari ListMessages() untuk mengambil sejumlah pesan tertentu berdasarkan kueri. Cuplikan kode berikut menunjukkan cara mendaftar Pesan.
imapClient.SelectFolder("Inbox");
ImapQueryBuilder builder = new ImapQueryBuilder();
MailQuery query =
builder.Or(
builder.Or(
builder.Or(
builder.Or(
builder.Subject.Contains(" (1) "),
builder.Subject.Contains(" (2) ")),
builder.Subject.Contains(" (3) ")),
builder.Subject.Contains(" (4) ")),
builder.Subject.Contains(" (5) "));
ImapMessageInfoCollection messageInfoCol4 = imapClient.ListMessages(query, 4);
Console.WriteLine((messageInfoCol4.Count == 4) ? "Success" : "Failure");
Daftar Pesan secara Rekursif
Protokol IMAP mendukung pencantuman pesan secara rekursif dari folder kotak surat. Ini membantu mencantumkan pesan dari subfolder suatu folder juga. Potongan kode berikut menunjukkan cara mencantumkan pesan secara rekursif.
// Create an imapclient with host, user and password
ImapClient client = new ImapClient();
client.Host = "domain.com";
client.Username = "username";
client.Password = "password";
client.SelectFolder("InBox");
ImapMessageInfoCollection msgsColl = client.ListMessages(true);
Console.WriteLine("Total Messages: " + msgsColl.Count);
Daftar Pesan dengan MultiConnection
ImapClient menyediakan sebuah UseMultiConnection properti yang dapat digunakan untuk membuat beberapa koneksi untuk operasi berat. Anda juga dapat mengatur jumlah koneksi yang akan digunakan selama mode multikoneksi dengan menggunakan ImapClient.ConnectionsQuantity. Potongan kode berikut mendemonstrasikan penggunaan mode multikoneksi untuk mencantumkan pesan dan membandingkan kinerjanya dengan mode koneksi tunggal.
ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;
imapClient.SelectFolder("Inbox");
imapClient.ConnectionsQuantity = 5;
imapClient.UseMultiConnection = MultiConnectionMode.Enable;
DateTime multiConnectionModeStartTime = DateTime.Now;
ImapMessageInfoCollection messageInfoCol1 = imapClient.ListMessages(true);
TimeSpan multiConnectionModeTimeSpan = DateTime.Now - multiConnectionModeStartTime;
imapClient.UseMultiConnection = MultiConnectionMode.Disable;
DateTime singleConnectionModeStartTime = DateTime.Now;
ImapMessageInfoCollection messageInfoCol2 = imapClient.ListMessages(true);
TimeSpan singleConnectionModeTimeSpan = DateTime.Now - singleConnectionModeStartTime;
double performanceRelation = singleConnectionModeTimeSpan.TotalMilliseconds / multiConnectionModeTimeSpan.TotalMilliseconds;
Console.WriteLine("Performance Relation: " + performanceRelation);
Daftar Pesan dengan Dukungan Paging
Dalam skenario, di mana server email berisi sejumlah besar pesan di kotak surat, sering diinginkan untuk menampilkan atau mengambil pesan dengan dukungan pagination. API Aspose.Email ImapClient memungkinkan Anda mengambil pesan dari server dengan dukungan paging.
///<summary>
/// This example shows the paging support of ImapClient for listing messages from the server
/// Available in Aspose.Email for .NET 6.4.0 and onwards
///</summary>
using (ImapClient client = new ImapClient("host.domain.com", 993, "username", "password"))
{
try
{
int messagesNum = 12;
int itemsPerPage = 5;
MailMessage message = null;
// Create some test messages and append these to server's inbox
for (int i = 0; i < messagesNum; i++)
{
message = new MailMessage(
"from@domain.com",
"to@domain.com",
"EMAILNET-35157 - " + Guid.NewGuid(),
"EMAILNET-35157 Move paging parameters to separate class");
client.AppendMessage(ImapFolderInfo.InBox, message);
}
// List messages from inbox
client.SelectFolder(ImapFolderInfo.InBox);
ImapMessageInfoCollection totalMessageInfoCol = client.ListMessages();
// Verify the number of messages added
Console.WriteLine(totalMessageInfoCol.Count);
////////////////// RETREIVE THE MESSAGES USING PAGING SUPPORT////////////////////////////////////
List<ImapPageInfo> pages = new List<ImapPageInfo>();
PageSettings pageSettings = new PageSettings();
ImapPageInfo pageInfo = client.ListMessagesByPage(itemsPerPage, 0, pageSettings);
Console.WriteLine(pageInfo.TotalCount);
pages.Add(pageInfo);
while (!pageInfo.LastPage)
{
pageInfo = client.ListMessagesByPage(itemsPerPage, pageInfo.NextPage.PageOffset, pageSettings);
pages.Add(pageInfo);
}
int retrievedItems = 0;
foreach (ImapPageInfo folderCol in pages)
retrievedItems += folderCol.Items.Count;
Console.WriteLine(retrievedItems);
}
finally
{
}
}
Daftar Lampiran Pesan
Untuk mendapatkan informasi tentang lampiran seperti nama, ukuran tanpa mengambil data lampiran, coba API berikut:
- Aspose.Email.Clients.Imap.ImapAttachmentInfo - Mewakili informasi lampiran.
- Aspose.Email.Clients.Imap.ImapAttachmentInfoCollection - Mewakili kumpulan dari ImapAttachmentInfo kelas.
- Aspose.Email.Clients.Imap.ListAttachments(int sequenceNumber) - Mendapatkan informasi untuk setiap lampiran dalam sebuah pesan.
Contoh kode dengan langkah-langkah di bawah ini akan menunjukkan cara menggunakan API:
- Panggil ListMessages() metode pada objek imapClient. Metode ini akan mengembalikan ImapMessageInfoCollection yang berisi informasi tentang pesan-pesan di kotak surat.
- Iterasikan setiap pesan dalam messageInfoCollection menggunakan perulangan foreach.
- Panggil ListAttachments() metode pada objek imapClient, dengan memberikan properti SequenceNumber dari objek pesan sebagai parameter. Metode ini akan mengembalikan ImapAttachmentInfoCollection yang berisi informasi tentang lampiran dalam pesan.
- Iterasikan setiap lampiran dalam attachmentInfoCollection menggunakan perulangan foreach.
- Di dalam loop internal, Anda dapat mengakses informasi tentang setiap lampiran menggunakan properti objek attachmentInfo.
var messageInfoCollection = imapClient.ListMessages();
foreach (var message in messageInfoCollection)
{
var attachmentInfoCollection = imapClient.ListAttachments(message.SequenceNumber);
foreach (var attachmentInfo in attachmentInfoCollection)
{
Console.WriteLine("Attachment: {0} (size: {1})", attachmentInfo.Name, attachmentInfo.Size);
}
}
Mengambil dan Menyimpan Pesan
Ambil Pesan dari Server
The ImapClient kelas dapat mengambil pesan dari server IMAP dan menyimpan pesan dalam format EML ke disk lokal. Langkah-langkah berikut diperlukan untuk menyimpan pesan ke disk:
- Buat sebuah instansi dari ImapClient kelas.
- Tentukan hostname, port, username, dan password di ImapClient constructor.
- Pilih folder menggunakan SelectFolder() metode.
- Panggil ListMessages metode untuk memperoleh ImapMessageInfoCollection objek.
- Iterasi melalui ImapMessageInfoCollection koleksi, panggil SaveMessage() metode dan berikan jalur output serta nama file.
Potongan kode berikut menunjukkan cara mengambil pesan email dari server dan menyimpannya.
// Select the inbox folder and Get the message info collection
client.SelectFolder(ImapFolderInfo.InBox);
ImapMessageInfoCollection list = client.ListMessages();
// Download each message
for (int i = 0; i < list.Count; i++)
{
// Save the EML file locally
client.SaveMessage(list[i].UniqueId, dataDir + list[i].UniqueId + ".eml");
}
Ambil Pesan dalam Urutan Menurun
Aspose.Email menyediakan ImapClient.ListMessagesByPage metode yang menampilkan pesan dengan dukungan paging. Beberapa overload dari ImapClient.ListMessagesByPage menerima PageSettings sebagai parameter. PageSettings menyediakan sebuah AscendingSorting properti yang, ketika disetel ke false, mengembalikan email dalam urutan menurun.
Contoh kode berikut menunjukkan penggunaan AscendingSorting properti dari PageSettings kelas untuk mengubah urutan email.
ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;
PageSettings pageSettings = new PageSettings { AscendingSorting = false };
ImapPageInfo pageInfo = imapClient.ListMessagesByPage(5, pageSettings);
ImapMessageInfoCollection messages = pageInfo.Items;
foreach (ImapMessageInfo message in messages)
{
Console.WriteLine(message.Subject + " -> " + message.Date.ToString());
}
Simpan Pesan dalam Format MSG
Untuk menyimpan email dalam format MSG, ImapClient.FetchMessage() metode perlu dipanggil. Ini mengembalikan pesan dalam sebuah instance dari MailMessage kelas. The MailMessage.Save() metode kemudian dapat dipanggil untuk menyimpan pesan ke MSG. Potongan kode berikut menunjukkan cara menyimpan pesan dalam Format MSG.
// The path to the file directory.
string dataDir = RunExamples.GetDataDir_IMAP();
// Create an imapclient with host, user and password
ImapClient client = new ImapClient("localhost", "user", "password");
// Select the inbox folder and Get the message info collection
client.SelectFolder(ImapFolderInfo.InBox);
ImapMessageInfoCollection list = client.ListMessages();
// Download each message
for (int i = 0; i < list.Count; i++)
{
// Save the message in MSG format
MailMessage message = client.FetchMessage(list[i].UniqueId);
message.Save(dataDir + list[i].UniqueId + "_out.msg", SaveOptions.DefaultMsgUnicode);
}
Kelompokkan Pesan yang Diambil
ImapClient menyediakan sebuah FetchMessages metode yang menerima iterable dari Nomor Urut atau ID Unik dan mengembalikan daftar MailMessage. Potongan kode berikut menunjukkan penggunaan the FetchMessages metode untuk mengambil pesan berdasarkan Nomor Urut dan ID Unik.
ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;
ImapMessageInfoCollection messageInfoCol = imapClient.ListMessages();
Console.WriteLine("ListMessages Count: " + messageInfoCol.Count);
int[] sequenceNumberAr = messageInfoCol.Select((ImapMessageInfo mi) => mi.SequenceNumber).ToArray();
string[] uniqueIdAr = messageInfoCol.Select((ImapMessageInfo mi) => mi.UniqueId).ToArray();
IList<MailMessage> fetchedMessagesBySNumMC = imapClient.FetchMessages(sequenceNumberAr);
Console.WriteLine("FetchMessages-sequenceNumberAr Count: " + fetchedMessagesBySNumMC.Count);
IList<MailMessage> fetchedMessagesByUidMC = imapClient.FetchMessages(uniqueIdAr);
Console.WriteLine("FetchMessages-uniqueIdAr Count: " + fetchedMessagesByUidMC.Count);
Ambil Folder dan Baca Pesan Secara Rekursif
Dalam artikel ini, sebagian besar ImapClient fitur-fitur ini digunakan untuk membuat aplikasi yang menampilkan semua folder dan subfolder secara rekursif dari server IMAP. Ini juga menyimpan pesan di setiap folder dan subfolder dalam format MSG di disk lokal. Di disk, folder dan pesan dibuat serta disimpan dalam struktur hierarkis yang sama seperti di server IMAP. Potongan kode berikut menunjukkan cara mendapatkan pesan dan informasi subfolder secara rekursif.
public static void Run()
{
// Create an instance of the ImapClient class
ImapClient client = new ImapClient();
// Specify host, username, password, Port and SecurityOptions for your client
client.Host = "imap.gmail.com";
client.Username = "your.username@gmail.com";
client.Password = "your.password";
client.Port = 993;
client.SecurityOptions = SecurityOptions.Auto;
try
{
// The root folder (which will be created on disk) consists of host and username
string rootFolder = client.Host + "-" + client.Username;
// Create the root folder and List all the folders from IMAP server
Directory.CreateDirectory(rootFolder);
ImapFolderInfoCollection folderInfoCollection = client.ListFolders();
foreach (ImapFolderInfo folderInfo in folderInfoCollection)
{
// Call the recursive method to read messages and get sub-folders
ListMessagesInFolder(folderInfo, rootFolder, client);
}
// Disconnect to the remote IMAP server
client.Dispose();
}
catch (Exception ex)
{
Console.Write(Environment.NewLine + ex);
}
Console.WriteLine(Environment.NewLine + "Downloaded messages recursively from IMAP server.");
}
/// Recursive method to get messages from folders and sub-folders
private static void ListMessagesInFolder(ImapFolderInfo folderInfo, string rootFolder, ImapClient client)
{
// Create the folder in disk (same name as on IMAP server)
string currentFolder = RunExamples.GetDataDir_IMAP();
Directory.CreateDirectory(currentFolder);
// Read the messages from the current folder, if it is selectable
if (folderInfo.Selectable)
{
// Send status command to get folder info
ImapFolderInfo folderInfoStatus = client.GetFolderInfo(folderInfo.Name);
Console.WriteLine(folderInfoStatus.Name + " folder selected. New messages: " + folderInfoStatus.NewMessageCount + ", Total messages: " + folderInfoStatus.TotalMessageCount);
// Select the current folder and List messages
client.SelectFolder(folderInfo.Name);
ImapMessageInfoCollection msgInfoColl = client.ListMessages();
Console.WriteLine("Listing messages....");
foreach (ImapMessageInfo msgInfo in msgInfoColl)
{
// Get subject and other properties of the message
Console.WriteLine("Subject: " + msgInfo.Subject);
Console.WriteLine("Read: " + msgInfo.IsRead + ", Recent: " + msgInfo.Recent + ", Answered: " + msgInfo.Answered);
// Get rid of characters like ? and :, which should not be included in a file name and Save the message in MSG format
string fileName = msgInfo.Subject.Replace(":", " ").Replace("?", " ");
MailMessage msg = client.FetchMessage(msgInfo.SequenceNumber);
msg.Save(currentFolder + "\\" + fileName + "-" + msgInfo.SequenceNumber + ".msg", SaveOptions.DefaultMsgUnicode);
}
Console.WriteLine("============================\n");
}
else
{
Console.WriteLine(folderInfo.Name + " is not selectable.");
}
try
{
// If this folder has sub-folders, call this method recursively to get messages
ImapFolderInfoCollection folderInfoCollection = client.ListFolders(folderInfo.Name);
foreach (ImapFolderInfo subfolderInfo in folderInfoCollection)
{
ListMessagesInFolder(subfolderInfo, rootFolder, client);
}
}
catch (Exception) { }
}
Menangani Informasi Pesan Khusus
Ambil Parameter Tambahan sebagai Informasi Ringkas
using (ImapClient client = new ImapClient("host.domain.com", "username", "password"))
{
MailMessage message = new MailMessage("from@domain.com", "to@doman.com", "EMAILNET-38466 - " + Guid.NewGuid().ToString(), "EMAILNET-38466 Add extra parameters for UID FETCH command");
// append the message to the server
string uid = client.AppendMessage(message);
// wait for the message to be appended
Thread.Sleep(5000);
// Define properties to be fetched from server along with the message
string[] messageExtraFields = new string[] { "X-GM-MSGID", "X-GM-THRID" };
// retreive the message summary information using it's UID
ImapMessageInfo messageInfoUID = client.ListMessage(uid, messageExtraFields);
// retreive the message summary information using it's sequence number
ImapMessageInfo messageInfoSeqNum = client.ListMessage(1, messageExtraFields);
// List messages in general from the server based on the defined properties
ImapMessageInfoCollection messageInfoCol = client.ListMessages(messageExtraFields);
ImapMessageInfo messageInfoFromList = messageInfoCol[0];
// verify that the parameters are fetched in the summary information
foreach (string paramName in messageExtraFields)
{
Console.WriteLine(messageInfoFromList.ExtraParameters.ContainsKey(paramName));
Console.WriteLine(messageInfoUID.ExtraParameters.ContainsKey(paramName));
Console.WriteLine(messageInfoSeqNum.ExtraParameters.ContainsKey(paramName));
}
}
Dapatkan Informasi Header List-Unsubscribe
Header List-Unsubscribe berisi URL untuk berhenti berlangganan dari daftar email, misalnya iklan, buletin, dll. Untuk mendapatkan header List-Unsubscribe, gunakan ListUnsubscribe properti dari ImapMessageInfo kelas. Contoh berikut menunjukkan penggunaan ListUnsubscribe properti untuk mendapatkan header List-Unsubscribe.
ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;
ImapMessageInfoCollection messageInfoCol = imapClient.ListMessages();
foreach (ImapMessageInfo imapMessageInfo in messageInfoCol)
{
Console.WriteLine("ListUnsubscribe Header: " + imapMessageInfo.ListUnsubscribe);
}