קבל ורשום אימיילים משרת IMAP

קבלת והצגת הודעות

איך לקבל מידע זיהוי עבור הודעות בתיבת דואר

בעת קבלה ועיבוד הודעות דוא"ל, ניתן לקבל מידע זיהוי מפורט, כגון מספרי רצף ומזהים ייחודיים, באמצעות התכונות הבאות שמסופקות בגרסה האחרונה של Aspose.Email for .NET:

Aspose.Email.ImapMessageInfo מחלקה: מייצגת את מידע הזיהוי על הודעה בתיבת דואר של IMAP.

ImapMessageInfo.SequenceNumber מאפיין: מחזיר את מספר הרצף של ההודעה.

ImapMessageInfo.UniqueId מאפיין: מחזיר את המזהה הייחודי של ההודעה.

Aspose.Email.MailMessage.ItemId מאפיין: מייצג מידע זיהוי נוסף על ההודעה בתוך תיבת הדואר.

הקטע הקוד הבא מדגים כיצד לקבל מידע זיהוי עבור הודעות בתיבת דואר של IMAP:

  1. צור מופע של ImapClient מחלקה על ידי אספקת הפרמטרים הדרושים כגון מארח שרת IMAP, פורט, כתובת אימייל, סיסמה, ואפשרויות אבטחה.
  2. השתמש ב- ListMessages מתודה לקבלת רשימת הודעות מתיקיית "INBOX". הגבל את הרשימה לחמש ההודעות הראשונות באמצעות המתודה Take(5).
  3. חלץ את מספרי הרצף של ההודעות המופיעות ברשימה באמצעות ה SequenceNumber מאפיין של כל הודעה.
  4. השתמש ב- FetchMessages מתודה לקבלת הפרטים המלאים של ההודעות מהשרת, באמצעות מספרי הרצף שהתקבלו בצעד הקודם.
  5. עבור על ההודעות שנשארו וקבל והצג עבור כל הודעה את המידע הבא:
  • מספר הרצף של ההודעה.
  • המאפיין ItemId.SequenceNumber.
  • הנושא של ההודעה.
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}");
    }
}

רשימת מזהי הודעות MIME מהשרת

מידע הודעה Imap מספק את ה-MIME MessageId לזיהוי הודעה מבלי לחלץ את ההודעה המלאה. הקטע הקוד הבא מראה כיצד לרשום 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);
}

רשימת הודעות מהשרת

Aspose.Email מספקת גרסה עם שני משתנים של ListMessages() להשיג מספר מסוים של הודעות בהתבסס על שאילתה. הקטע הקוד הבא מראה כיצד לרשום הודעות.


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");

רשימת הודעות באופן רקורסיבי

פרוטוקול IMAP תומך ברשימת הודעות בצורה רקורסיבית מתיקיית תיבת דואר. זה מסייע ברשימת הודעות מתתי‑תיקיות של תיקייה גם כן. הקטע הקוד הבא מראה כיצד לרשום הודעות בצורה רקורסיבית.

// 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);

רשימת הודעות עם מרובה חיבורים

ImapClient מספק UseMultiConnection מאפיין שניתן להשתמש בו ליצירת חיבורים מרובים לפעולות כבדות. ניתן גם להגדיר את מספר החיבורים שישמשו במצב מרובה חיבורים באמצעות ImapClient.ConnectionsQuantity. הקטע הקוד הבא מדגים את השימוש במצב מרובה חיבורים לרשימת הודעות ומשווה את הביצועים שלו למצב חיבור בודד.

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);

רשימת הודעות עם תמיכת עימוד

בתרחישים שבהם שרת האי‑מייל מכיל מספר גדול של הודעות בתיבת הדואר, לעיתים רוצים לרשום או לאחזר את ההודעות עם תמיכה בעימוד. ה‑API של Aspose.Email ImapClient מאפשר לך לאחזר את ההודעות מהשרת עם תמיכה בדפדוף.

///<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
    {
    }
}

רשימת קבצים מצורפים להודעה

כדי לקבל מידע על קבצים מצורפים כגון שם וגודל ללא שליפת נתוני הקובץ, נסה את ה‑API הבאים:

  • Aspose.Email.Clients.Imap.ImapAttachmentInfo - מייצגת מידע על קובץ מצורף.
  • Aspose.Email.Clients.Imap.ImapAttachmentInfoCollection - מייצגת אוסף של ImapAttachmentInfo מחלקה.
  • Aspose.Email.Clients.Imap.ListAttachments(int sequenceNumber) - מקבלת מידע עבור כל קובץ מצורף בהודעה.

דוגמת הקוד עם השלבים שלמטה תראה לך כיצד להשתמש ב‑API:

  1. הפעל את ListMessages() מתודה באובייקט imapClient. מתודה זו תחזיר ImapMessageInfoCollection המכילה מידע על ההודעות בתיבת הדואר.
  2. העבר על כל הודעה ב‑messageInfoCollection בעזרת לולאת foreach.
  3. הפעל את ListAttachments() מתודה באובייקט imapClient, שמעבירה את המאפיין SequenceNumber של אובייקט ההודעה כפרמטר. מתודה זו תחזיר ImapAttachmentInfoCollection המכילה מידע על הקבצים המצורפים בהודעה.
  4. העבר על כל קובץ מצורף ב‑attachmentInfoCollection בעזרת לולאת foreach.
  5. בתוך הלולאה הפנימית, ניתן לגשת למידע על כל קובץ מצורף באמצעות תכונות של האובייקט 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);
    }
}

אחזור ושמירת הודעות

שליפת הודעות מהשרת

ה ImapClient מחלקה יכולה לאחזר הודעות משרת IMAP ולשמור את ההודעות בפורמט EML על דיסק מקומי. השלבים הבאים נדרשים לשמירת ההודעות לדיסק:

  1. צור מופע של ImapClient מחלקה.
  2. ציין שם מארח, יציאה, שם משתמש וסיסמה ב‑ImapClient constructor.
  3. בחר את התיקייה באמצעות SelectFolder() שיטה.
  4. הפעל את ListMessages מתודה לקבלת ה- אוסף מידע הודעה Imap אובייקט.
  5. איטרציה דרך ה- אוסף מידע הודעה Imap אוסף, קרא ל- SaveMessage() מתודה והספק את נתיב הפלט ואת שם הקובץ.

קוד הקטע הבא מראה כיצד לאחזר הודעות אימייל משרת ולשמור אותן.

// 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");
}

שליפת הודעות בסדר יורד

Aspose.Email מספקת ImapClient.ListMessagesByPage מתודה שמציגה הודעות עם תמיכת דפדוף. כמה עומסים של ImapClient.ListMessagesByPage מקבל PageSettings כפרמטר. PageSettings מספק  AscendingSorting מאפיין שבעת הגדרתו ל‑false, מחזיר מיילים בסדר יורד.

קוד הדוגמה הבא מדגים את השימוש ב- AscendingSorting מאפיין של PageSettings מחלקה לשינוי סדר האימיילים.

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

כדי לשמור מיילים בפורמט MSG, ה‑ ImapClient.FetchMessage() יש לקרוא למתודה. היא מחזירה את ההודעה כמופע של MailMessage מחלקה. ה- MailMessage.Save() מתודה יכולה לאחר מכן להיקרא לשמירת ההודעה כ‑MSG. קטע הקוד הבא מראה כיצד לשמור הודעות בפורמט 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);
}

קיבוץ הודעות שנשלפו

ImapClient מספק FetchMessages מתודה המקבלת איטרביל של מספרי סדר או ID ייחודי ומחזירה רשימה של MailMessage. קוד הדוגמה הבא מדגים את השימוש ב- FetchMessages מתודה להבאת הודעות לפי מספרי סדר ו-ID ייחודי.

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);

שליפת תיקיות וקריאת הודעות באופן רקורסיבי

במאמר זה, רוב ה- ImapClient התכונות משמשות ליצירת יישום המכניס לרשימה את כל התיקיות ותת‑תיקיות באופן רקורסיבי משרת IMAP. הוא גם שומר את ההודעות בכל תיקייה ותת‑תיקייה בפורמט MSG על דיסק מקומי. על הדיסק, התיקיות וההודעות נוצרות ונשמרות באותה מבנה היררכי כפי שמצוי בשרת IMAP. קטע הקוד הבא מראה כיצד לקבל את המידע על הודעות ותת‑תיקיות באופן רקורסיבי.

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) { }            
}

טיפול במידע הודעה מיוחד

קבלת פרמטרים נוספים כמידע סיכום

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

כותרת List-Unsubscribe מכילה את כתובת ה-URL לביטול מנוי מרשימות דואר אלקטרוני כגון פרסומות, ניוזלטרים וכו’. כדי לקבל את כותרת List-Unsubscribe, השתמש ב- ListUnsubscribe מאפיין של מידע הודעה Imap מחלקה. הדוגמה הבאה מציגה את השימוש ב- ListUnsubscribe מאפיין לקבלת הכותרת 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);
}