65.9K
CodeProject 正在变化。 阅读更多。
Home

Aspose.Email 最新发布评测

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014年6月2日

CPOL

5分钟阅读

viewsIcon

17360

downloadIcon

97

Aspose.Email 最新发布

引言

我花了一些时间研究最新的 Aspose.Email for .NET。我上次编写与电子邮件相关的代码已经是十二三年前了。在 2000 年代初,我曾用 Visual Basic 和 Outlook Collaboration Data Objects (CDO) 做过一些工作。从那时起,我们已经走了很长一段路。现在,Gmail 和 Office 365 等云端邮件已成为常态。

尽管如此,企业应用程序在本地和 Exchange 电子邮件处理方面仍有大量需求。我将在下面的示例中展示我自己的应用程序中的一个可能场景。

最新 Aspose.Email 发布

Aspose.Email 库几乎支持您可以想象的任何与电子邮件相关的活动。以下是开发人员可以使用 Aspose.Email 在自己的应用程序中编写代码的一些场景。

生成电子邮件并通过 SMTP 发送

  • 在消息正文中嵌入对象 – 发送带有嵌入式图片或文档的电子邮件。
  • 附加文件 – 像用户从他们的电子邮件客户端一样附加文件到电子邮件。
  • 邮件合并 – 支持强大的邮件合并和群发邮件。
  • iCalendar 支持 – 通过 iCalendar 标准读取和操作日历事件。

接收 POP3 邮件

  • 处理 IMAP 邮件源
  • 身份验证
  • 处理消息和文件夹
  • SSL 支持 (适用于 POP3 和 SMTP)

消息文件

  • EML/MSG/MHT 格式 – 支持所有常见的邮件格式。
  • 处理文件或流 – 从磁盘或网络流打开消息。
  • 操作 PST 文件 – 创建、读取和操作 Outlook PST 文件及其内容。

MS Exchange Server

  • WebDav 和 Exchange Web Services 支持
  • 统一消息操作
  • 发送电子邮件和会议邀请

高级递归支持

  • 轻松可靠地计算事件递归
  • 支持 iCalendar (RFC 2445)

Aspose.Email 所有功能的详细开发人员文档可在此处在线获取:此处

因此,无论您的应用程序需要处理 Exchange、Outlook 文件、POP3/SMTP,还是通过 IMAP 与 Gmail 通信,Aspose.Email 都提供相应的 API 来帮助解决每种情况。Aspose.Email 中还提供了每种功能的示例应用程序,以帮助开发人员走上正确的道路。

一个 IMAP 控制台应用程序

Aspose.Email 随附有数十个示例应用程序。要开始,请启动 Aspose 示例仪表板。

示例应用程序按功能集分组。开发人员可以在“示例浏览器”中查看代码,在 C# 或 VB 中启动解决方案,或直接从浏览器应用程序运行示例应用程序。

我决定仔细研究其中一个 IMAP 示例。我选择的是“从 IMAP 服务器获取消息并保存到磁盘”,它正如其名称所示。这是一个控制台应用程序,它通过 IMAP 连接到 Gmail 帐户,选择“收件箱”文件夹,然后遍历所有消息,将每条消息以“.eml”格式保存到本地文件夹。这是经过几次 ReSharper 重构后,该应用程序的完整代码实现。

public static void Main(string[] args)
{
    // The path to the documents directory.
    string dataDir = Path.GetFullPath("../../../Data/");
    Directory.CreateDirectory(dataDir);

    //Create an instance of the ImapClient class
    var client = new ImapClient
                 {
                     Host = "imap.gmail.com",
                     Username = "asposetest123@gmail.com",
                     Password = "F123456f",
                     Port = 993,
                     SecurityMode = ImapSslSecurityMode.Implicit,
                     EnableSsl = true
                 };

    try
    {
        client.Connect();
       
        //Log in to the remote server.
        client.Login();

        // Select the inbox folder
        client.SelectFolder(ImapFolderInfo.InBox);

        // Get the message info collection
        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");
        }

        //Disconnect to the remote IMAP server
        client.Disconnect();

        System.Console.WriteLine("Disconnected from the IMAP server");
    }
    catch (System.Exception ex)
    {
        System.Console.Write(ex.ToString());
    }
}

使用起来简单直观。

PST 存档实用程序

我没有时间编写使用该库所有功能的应用程序,所以我决定专注于一套功能。多年来,我一直想将我的工作相关的 PST 文件整理成年度存档。实际上,我有一个 PST 文件涵盖了将近七年的电子邮件。它的大小接近 6GB,包含数量不明的上千个项目。

我构建了一个小型实用程序,它可以读取选定的 PST 文件,遍历其所有文件夹,并将指定年份的所有项目移动到一个新的 PST 文件中,在新 PST 文件名前面加上年份,同时镜像原始 PST 的文件夹结构。我决定将该实用程序构建为 WPF 应用程序,但它也可以很好地用作命令行实用程序。

使用该实用程序非常简单,只需

  1. 输入要读取的 PST 的完整路径。
  2. 点击“打开 PST”。
  3. 将显示可用年份。选择一个年份。
  4. 点击“处理 PST”。
  5. 完成后,状态消息将更新为“已为年份 xxxx 创建新 PST”。

用于显示可用年份的代码会遍历文件夹和项目,将唯一的年份收集到一个 `List` 中。然后对它们进行排序,然后再设置绑定到“可用年份列表框”的 ViewModel 中的属性。

/// <summary>
/// Gets all the years of items in a PST file.
/// </summary>
private void GetPstYears()
{
    if (String.IsNullOrWhiteSpace(PstPath) || !File.Exists(PstPath)) return;

    using (PersonalStorage mainPst = PersonalStorage.FromFile(PstPath, true))
    {
        CurrentStatus = "Processing Years...";

        List<int> years = GetAvailableYears(mainPst.RootFolder);
        years.Sort();
        Years.Clear();

        foreach (int year in years)
        {
            Years.Add(year);
        }

        CurrentStatus = "PST Ready";
    }
}

/// <summary>
/// Gets the available years in a specified Outlook folder.
/// </summary>
/// <param name="folder">The folder.</param>
/// <returns>A list of years.</returns>
private List<int> GetAvailableYears(FolderInfo folder)
{
    var years = new List<int>();

    foreach (MapiMessage message in
                folder.EnumerateMapiMessages().Where(message => !years.Contains(message.DeliveryTime.Year)))
    {
        years.Add(message.DeliveryTime.Year);
    }

    foreach (int subYear in from folderInfo in folder.EnumerateFolders()
        where folderInfo.HasSubFolders
        select GetAvailableYears(folderInfo)
        into subYears
        from subYear in subYears
        where !years.Contains(subYear)
        select subYear)
    {
        years.Add(subYear);
    }

    return years;
}

同样,用于将选定年份的消息移动到新 PST 的代码会遍历文件夹结构以查找任何匹配的项目。

/// <summary>
/// Process a PST by moving items from a selected year to a new PST
/// while creating the same folder structure.
/// </summary>
private void ProcessPst()
{
    if (SelectedYearIndex < 0 || String.IsNullOrWhiteSpace(PstPath) || !File.Exists(PstPath)) return;

    int year = Years[SelectedYearIndex];

    using (PersonalStorage mainPst = PersonalStorage.FromFile(PstPath, true))
    {
        string newFileName = PstPath.Insert(PstPath.LastIndexOf("\\", StringComparison.Ordinal) + 1, year.ToString(CultureInfo.InvariantCulture));

        using (PersonalStorage pstWithYear = PersonalStorage.Create(newFileName, FileFormatVersion.Unicode))
        {
            ProcessSubfolders(mainPst.RootFolder, pstWithYear.RootFolder, year);
        }
    }

    CurrentStatus = String.Format("New PST Created for Year {0}", Years[SelectedYearIndex]);
}

/// <summary>
/// Processes the subfolders of a provided PST folder and adds items
/// from the specified year to the new folder provided.
/// </summary>
/// <param name="folder">The source folder.</param>
/// <param name="newParentFolder">The new folder.</param>
/// <param name="year">The year of items to move.</param>
private void ProcessSubfolders(FolderInfo folder, FolderInfo newParentFolder, int year)
{
    foreach (FolderInfo folderInfo in folder.EnumerateFolders())
    {
        FolderInfo newFolder = newParentFolder.GetSubFolder(folderInfo.DisplayName) ??
                               newParentFolder.AddSubFolder(folderInfo.DisplayName);

        if (folderInfo.HasSubFolders)
        {
            ProcessSubfolders(folderInfo, newFolder, year);
        }

        newFolder.AddMessages(folderInfo.EnumerateMapiMessages().Where(m => m.DeliveryTime.Year == year));

        if (newFolder.ContentCount == 0 && !newFolder.HasSubFolders && newFolder.DisplayName != "Deleted Items")
            newParentFolder.DeleteChildItem(newFolder.EntryId);
    }
}

您可以看到所有的 PST 操作都非常直观。我需要知道的一切,我都能从文档和示例应用程序中快速学到。感觉这些类就像是 .NET Framework 的一部分。这是一个编写得非常好的 API。

您可以在此处下载项目的完整源代码。

摘要

如果您正在进行任何涉及电子邮件处理或访问的项目,Aspose.Email 绝对可以简化完成工作所需的代码。我以后一定会记住这些库,您也应该记住。

祝您编码愉快!

披露材料连接:我免费获得了上述产品或服务中的一项或多项,希望在我的博客上提及。无论如何,我只推荐我自己使用并认为我的读者会喜欢的产品或服务。我根据美国联邦贸易委员会 (FTC) 的规定披露这一点,即 16 CFR 第 255 部分:“关于在广告中使用认可和推荐的指南”。

© . All rights reserved.