管理、移动和组织 IMAP 文件夹

文件夹操作

获取文件夹信息

使用 Aspose.Email 获取 IMAP 服务器中文件夹信息非常简便。调用 ListFolders() 方法的 ImapClient 类。它返回一个对象,属于 ImapFolderInfoCollection 类型。遍历此集合并在循环中获取各个文件夹的信息。此方法是重载的。您可以将文件夹名称作为参数传入,以获取子文件夹列表。下面的代码片段演示了如何使用 Aspose.Email 按上述方法从 IMAP 服务器获取文件夹信息。

// Get all folders in the currently subscribed folder
ImapFolderInfoCollection folderInfoColl = client.ListFolders();

// Iterate through the collection to get folder info one by one
foreach (ImapFolderInfo folderInfo in folderInfoColl)
{
    // Folder name and get New messages in the folder
    Console.WriteLine("Folder name is " + folderInfo.Name);
    ImapFolderInfo folderExtInfo = client.GetFolderInfo(folderInfo.Name);
    Console.WriteLine("New message count: " + folderExtInfo.NewMessageCount);
    Console.WriteLine("Is it readonly? " + folderExtInfo.ReadOnly);
    Console.WriteLine("Total number of messages " + folderExtInfo.TotalMessageCount);
}

删除和重命名文件夹

使用 Aspose.Email,IMAP 服务器上的文件夹可以在单行代码中删除或重命名:

  • DeleteFolder() 方法接受文件夹名称作为参数。
  • 对于 RenameFolder() 方法,需要传入当前文件夹名称和新文件夹名称。以下代码片段展示了如何从 IMAP 服务器删除文件夹以及如何重命名文件夹。每个操作仅需一行代码。
// Delete a folder and Rename a folder
client.DeleteFolder("foldername");
client.RenameFolder("foldername", "newfoldername");

处理特殊用途邮箱文件夹

一些 IMAP 消息存储包含特殊用途的邮箱,例如用于保存草稿或已发送邮件的邮箱。许多邮件客户端允许用户指定草稿或已发送邮件的存放位置,但配置这些位置需要用户了解服务器为这些目的预留的邮箱。Aspose.Email 可以使用以下方式识别这些特殊用途的邮箱: ImapMailboxInfo 类,使得操作更方便。以下代码示例演示了如何使用该类访问这些特殊用途的邮箱。 ImapMailboxInfo 类。

ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;
            
ImapMailboxInfo mailboxInfo = imapClient.MailboxInfo;
Console.WriteLine(mailboxInfo.Inbox);
Console.WriteLine(mailboxInfo.DraftMessages);
Console.WriteLine(mailboxInfo.JunkMessages);
Console.WriteLine(mailboxInfo.SentMessages);
Console.WriteLine(mailboxInfo.Trash);

文件夹内的消息操作

向文件夹添加新消息

您可以使用以下方式向文件夹添加新消息: MailMessage 和 ImapClient 类。首先创建一个 MailMessage 通过提供主题、收件人和发件人值来创建对象。然后订阅一个文件夹并将消息添加到其中。下面的代码片段展示了如何在文件夹中添加新消息。

// Create a message
MailMessage msg = new MailMessage("user@domain1.com", "user@domain2.com", "subject", "message");

// Subscribe to the Inbox folder and Append the newly created message
client.SelectFolder(ImapFolderInfo.InBox);
client.SubscribeFolder(client.CurrentFolder.Name);
client.AppendMessage(client.CurrentFolder.Name, msg);

使用多连接添加多条消息

您可以使用 AppendMessages 方法由 ImapClient 类。该 AppendMessages 方法接受一个列表 MailMessage 如果未提供文件夹作为参数,系统会将其添加到当前文件夹。ImapClient 还支持用于高负载操作的 MultiConnection 模式。以下代码片段展示了如何使用 MultiConnection 模式添加多个消息。

ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;

List<MailMessage> messages = new List<MailMessage>();
for (int i = 0; i < 20; i++)
{
    MailMessage message = new MailMessage(
        "<EMAIL ADDRESS>",
        "<EMAIL ADDRESS>",
        "Test Message - " + Guid.NewGuid().ToString(),
        "IMAP Group Append with MultiConnection");
    messages.Add(message);
}

imapClient.ConnectionsQuantity = 5;
imapClient.UseMultiConnection = MultiConnectionMode.Enable;
imapClient.AppendMessages(messages);

在文件夹之间移动邮件

Aspose.Email for .NET 允许使用以下方法将消息从一个邮箱文件夹移动到另一个文件夹: ImapClient API。该 MoveMessage 该方法使用邮件唯一标识和目标文件夹名称将邮件移动到目标文件夹。以下代码片段演示了如何将邮件移动到另一个邮箱文件夹。

///<summary>
/// This example shows how to move a message from one folder of a mailbox to another one using the ImapClient API of Aspose.Email for .NET
/// Available from Aspose.Email for .NET 6.4.0 onwards
/// -------------- Available API Overload Members --------------
/// Void ImapClient.MoveMessage(IConnection iConnection, int sequenceNumber, string folderName, bool commitDeletions)
/// Void ImapClient.MoveMessage(IConnection iConnection, string uniqueId, string folderName, bool commitDeletions)
/// Void ImapClient.MoveMessage(int sequenceNumber, string folderName, bool commitDeletions)
/// Void ImapClient.MoveMessage(string uniqueId, string folderName, bool commitDeletions)
/// Void ImapClient.MoveMessage(IConnection iConnection, int sequenceNumber, string folderName)
/// Void ImapClient.MoveMessage(IConnection iConnection, string uniqueId, string folderName)
/// Void ImapClient.MoveMessage(int sequenceNumber, string folderName)
/// Void ImapClient.MoveMessage(string uniqueId, string folderName)
///</summary>

using (ImapClient client = new ImapClient("host.domain.com", 993, "username", "password"))
{
    string folderName = "EMAILNET-35151";
    if (!client.ExistFolder(folderName))
        client.CreateFolder(folderName);
    try
    {
        MailMessage message = new MailMessage(
            "from@domain.com",
            "to@domain.com",
            "EMAILNET-35151 - " + Guid.NewGuid(),
            "EMAILNET-35151 ImapClient: Provide option to Move Message");
        client.SelectFolder(ImapFolderInfo.InBox);
        // Append the new message to Inbox folder
        string uniqueId = client.AppendMessage(ImapFolderInfo.InBox, message);
        ImapMessageInfoCollection messageInfoCol1 = client.ListMessages();
        Console.WriteLine(messageInfoCol1.Count);
        // Now move the message to the folder EMAILNET-35151
        client.MoveMessage(uniqueId, folderName);
        client.CommitDeletes();
        // Verify that the message was moved to the new folder
        client.SelectFolder(folderName);
        messageInfoCol1 = client.ListMessages();
        Console.WriteLine(messageInfoCol1.Count);
        // Verify that the message was moved from the Inbox
        client.SelectFolder(ImapFolderInfo.InBox);
        messageInfoCol1 = client.ListMessages();
        Console.WriteLine(messageInfoCol1.Count);
    }
    finally
    {
        try { client.DeleteFolder(folderName); }
        catch { }
    }
}

在文件夹之间复制消息

Aspose.Email API 提供了将消息从一个邮箱文件夹复制到另一个的功能。它允许使用以下方法复制单条或多条消息: CopyMessageCopyMessages 方法。该 CopyMessages 方法提供了将多个消息从邮箱的源文件夹复制到目标邮箱文件夹的功能。以下代码片段展示了如何将消息复制到另一个邮箱文件夹。

using (ImapClient client = new ImapClient("exchange.aspose.com", "username", "password"))
{
    // Create the destination folder
    string folderName = "EMAILNET-35242";
    if (!client.ExistFolder(folderName))
        client.CreateFolder(folderName);
    try
    {
        // Append a couple of messages to the server
        MailMessage message1 = new MailMessage(
            "asposeemail.test3@aspose.com",
            "asposeemail.test3@aspose.com",
            "EMAILNET-35242 - " + Guid.NewGuid(),
            "EMAILNET-35242 Improvement of copy method.Add ability to 'copy' multiple messages per invocation.");
        string uniqueId1 = client.AppendMessage(message1);

        MailMessage message2 = new MailMessage(
            "asposeemail.test3@aspose.com",
            "asposeemail.test3@aspose.com",
            "EMAILNET-35242 - " + Guid.NewGuid(),
            "EMAILNET-35242 Improvement of copy method.Add ability to 'copy' multiple messages per invocation.");
        string uniqueId2 = client.AppendMessage(message2);

        // Verify that the messages have been added to the mailbox
        client.SelectFolder(ImapFolderInfo.InBox);
        ImapMessageInfoCollection msgsColl = client.ListMessages();
        foreach (ImapMessageInfo msgInfo in msgsColl)
            Console.WriteLine(msgInfo.Subject);

        // Copy multiple messages using the CopyMessages command and Verify that messages are copied to the destination folder
        client.CopyMessages(new[] { uniqueId1, uniqueId2 }, folderName);

        client.SelectFolder(folderName);
        msgsColl = client.ListMessages();
        foreach (ImapMessageInfo msgInfo in msgsColl)
            Console.WriteLine(msgInfo.Subject);
    }
    finally
    {
        try
        {
            client.DeleteFolder(folderName);
        }
        catch { }
    }
}