IMAP Sunucusundan E-postaları Getir ve Listele
Mesajları Alma ve Listeleme
Bir Posta Kutusundaki Mesajlar İçin Kimlik Bilgilerini Nasıl Edinirsiniz
E-posta mesajlarını alırken ve işlerken, en yeni Aspose.Email for .NET sürümü tarafından sağlanan aşağıdaki özellikleri kullanarak sıra numaraları ve benzersiz kimlikler gibi ayrıntılı kimlik bilgilerini elde edebilirsiniz:
Aspose.Email.ImapMessageInfo sınıf: bir IMAP posta kutusundaki mesajın kimlik bilgilerini temsil eder.
ImapMessageInfo.SequenceNumber özellik: mesajın sıra numarasını alır.
ImapMessageInfo.UniqueId özellik: mesajın benzersiz tanımlayıcısını alır.
Aspose.Email.MailMessage.ItemId özellik: posta kutusundaki mesaj hakkında ek kimlik bilgilerini temsil eder.
Aşağıdaki kod parçacığı, bir IMAP posta kutusundaki mesajlar için kimlik bilgilerini nasıl elde edeceğinizi gösterir:
- Şunun bir örneğini oluştur ImapClient IMAP sunucu hostu, port, e-posta adresi, şifre ve güvenlik seçenekleri gibi gerekli parametreleri sağlayarak sınıf.
- Kullan ListMessages "INBOX" klasöründen mesajların bir listesini almak için yöntem. Take(5) yöntemini kullanarak listeyi ilk beş mesaja sınırlayın.
- listelenen mesajların sıra numaralarını şunu kullanarak çıkartın: SequenceNumber her mesajın özelliği.
- Kullan FetchMessages sunucudan mesajların tam ayrıntılarını, önceki adımda elde edilen sıra numaralarını kullanarak almak için yöntem.
- Alınan mesajları döngüyle gezerek her mesaj için aşağıdaki bilgileri alıp gösterin:
- Mesajın sıra numarası.
- ItemId.SequenceNumber özelliği.
- Mesajın konusu.
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}");
}
}
Sunucudan MIME Mesaj ID’lerini Listele
ImapMessageInfo MIME’i sağlar MessageId tam mesajı çıkarmadan mesaj tanımlaması için. Aşağıdaki kod parçacığı, MIME messageId’yi nasıl listeleyeceğinizi gösterir.
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);
}
Sunucudan Mesajları Listele
Aspose.Email, 2 üyeli aşırı yüklenmiş bir varyant sağlar ListMessages() bir sorguya göre belirtilen sayıda mesajı almak için. Aşağıdaki kod parçacığı, mesajları nasıl listeleyeceğinizi gösterir.
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");
Mesajları Özyinelemeli Olarak Listele
IMAP protokolü, bir posta kutusu klasöründen mesajları özyinelemeli olarak listelemeyi destekler. Bu, bir klasörün alt klasörlerinden de mesajları listelemeye yardımcı olur. Aşağıdaki kod parçacığı, mesajları özyinelemeli olarak nasıl listeleyeceğinizi gösterir.
// 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);
Çoklu Bağlantı ile Mesajları Listele
ImapClient sağlar UseMultiConnection ağır işlemler için birden fazla bağlantı oluşturmak amacıyla kullanılabilen özellik. Çoklu bağlantı modunda kullanılacak bağlantı sayısını şu şekilde ayarlayabilirsiniz: ImapClient.ConnectionsQuantityAşağıdaki kod parçacığı, mesajları listelemek için çoklu bağlantı modunun kullanımını gösterir ve tek bağlantı modu ile performansını karşılaştırır.
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);
Sayfalama Desteğiyle Mesajları Listele
E-posta sunucusunda posta kutusunda çok sayıda mesaj bulunduğunda, genellikle sayfalama desteğiyle mesajları listelemek veya almak istenir. Aspose.Email API’lerinin ImapClient sayfalama desteğiyle sunucudan mesajları almanıza olanak tanır.
///<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
{
}
}
Mesaj Eklerini Listele
Ek adı, boyutu gibi bilgileri ek verilerini almadan almak için aşağıdaki API’leri deneyin:
- Aspose.Email.Clients.Imap.ImapAttachmentInfo - Bir ek bilgisini temsil eder.
- Aspose.Email.Clients.Imap.ImapAttachmentInfoCollection - Bir koleksiyonunu temsil eder. ImapAttachmentInfo sınıf.
- Aspose.Email.Clients.Imap.ListAttachments(int sequenceNumber) - Bir mesajdaki her ek hakkında bilgi alır.
Aşağıdaki adımlarla kod örneği, API’leri nasıl kullanacağınızı gösterecek:
- Şuğu çağırın ListMessages() imapClient nesnesi üzerindeki yöntem. Bu yöntem, posta kutusundaki mesajlar hakkında bilgi içeren bir ImapMessageInfoCollection döndürür.
- messageInfoCollection içindeki her mesajı foreach döngüsüyle yineleyin.
- Şuğu çağırın ListAttachments() imapClient nesnesi üzerindeki yöntem, mesaj nesnesinin SequenceNumber özelliğini parametre olarak geçirir. Bu yöntem, mesajdaki ekler hakkında bilgi içeren bir ImapAttachmentInfoCollection döndürür.
- attachmentInfoCollection içindeki her eki foreach döngüsüyle yineleyin.
- İç döngü içinde, attachmentInfo nesnesinin özelliklerini kullanarak her eki hakkında bilgilere erişebilirsiniz.
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);
}
}
Mesajları Getirme ve Kaydetme
Sunucudan Mesajları Getir
Bu ImapClient sınıf, bir IMAP sunucusundan mesajları alabilir ve mesajları yerel diske EML formatında kaydedebilir. Mesajları diske kaydetmek için aşağıdaki adımlar gerekir:
- Şunun bir örneğini oluştur ImapClient sınıf.
- ImapClient içinde bir ana bilgisayar adı, bağlantı noktası, kullanıcı adı ve şifre belirleyin yapıcı.
- Klasörü şu şekilde seçin SelectFolder() metod.
- Şuğu çağırın ListMessages yöntem, … alır ImapMessageInfoCollection nesne.
- İçinde döngü yap ImapMessageInfoCollection koleksiyon, şunu çağırın SaveMessage() metodu ve çıktı yolu ile dosya adını sağlayın.
Aşağıdaki kod parçacığı, bir sunucudan e-posta mesajlarını nasıl alıp kaydedeceğinizi gösterir.
// 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");
}
Mesajları Azalan Sırada Getir
Aspose.Email sağlar ImapClient.ListMessagesByPage metot, mesajları sayfalama desteğiyle listeler. Bazı aşırı yüklemeleri ImapClient.ListMessagesByPage kabul eder PageSettings parametre olarak. PageSettings sağlar bir AscendingSorting Bu özellik, false olarak ayarlandığında e-postaları azalan sırada döndürür.
Aşağıdaki örnek kod, kullanımını gösterir AscendingSorting özellik PageSettings sınıf, e-postaların sırasını değiştirmek için.
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());
}
MSG Formatında Mesajları Kaydedin
E-postaları MSG formatında kaydetmek için, ImapClient.FetchMessage() metodun çağrılması gerekir. Mesajı şu nesnenin bir örneği olarak döndürür MailMessage sınıf. MailMessage.Save() metot, mesajı MSG formatında kaydetmek için ardından çağrılabilir. Aşağıdaki kod parçacığı, mesajları MSG formatında nasıl kaydedeceğinizi gösterir.
// 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);
}
Alınan Mesajları Grupla
ImapClient sağlar FetchMessages metod, Sıra Numaraları ya da Benzersiz ID’nin iterable’ını kabul eder ve bir liste döndürür MailMessage. Aşağıdaki kod snippet’i, şunun kullanımını gösterir: FetchMessages metod, mesajları Sıra Numaraları ve Benzersiz ID ile çekmek için.
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);
Klasörleri Al ve Mesajları Yinelemeli Oku
Bu makalede, çoğu ImapClient özellikler, bir IMAP sunucusundan tüm klasörleri ve alt klasörleri yinelemeli olarak listeleyen bir uygulama oluşturmak için kullanılır. Ayrıca her klasör ve alt klasördeki mesajları yerel diskte MSG formatında kaydeder. Diskte, klasörler ve mesajlar IMAP sunucusundakiyle aynı hiyerarşik yapıda oluşturulur ve kaydedilir. Aşağıdaki kod parçacığı, mesajları ve alt klasör bilgilerini yinelemeli olarak nasıl alacağınızı gösterir.
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) { }
}
Özel Mesaj Bilgilerini İşleme
Ek Parametreleri Özet Bilgi Olarak Al
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));
}
}
List-Unsubscribe Başlık Bilgilerini Al
List-Unsubscribe başlığı, e-posta listelerinden (örneğin reklamlar, bültenler vb.) çıkmak için URL içerir. List-Unsubscribe başlığını almak için, kullanın ListUnsubscribe özellik ImapMessageInfo sınıf. Aşağıdaki örnek, kullanımını gösterir ListUnsubscribe List-Unsubscribe başlığını almayı sağlayan özellik.
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);
}