Aspose.Email 最新发布评测





0/5 (0投票)
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 应用程序,但它也可以很好地用作命令行实用程序。
使用该实用程序非常简单,只需
- 输入要读取的 PST 的完整路径。
- 点击“打开 PST”。
- 将显示可用年份。选择一个年份。
- 点击“处理 PST”。
- 完成后,状态消息将更新为“已为年份 xxxx 创建新 PST”。
用于显示可用年份的代码会遍历文件夹和项目,将唯一的年份收集到一个 `List
/// <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 部分:“关于在广告中使用认可和推荐的指南”。