
将 EML 消息导入 PST 文件是一个常见需求,尤其是对在电子邮件客户端之间迁移或归档电子邮件以进行存储和备份的用户而言。PST 格式保留内容的结构、格式和附件,使其适合在 Outlook 应用程序中无缝集成和管理。此专有 Microsoft 文件格式的主要优势是能够创建电子邮件数据的本地档案,使得可以管理和离线访问电子邮件、联系人和其他相关信息。在本文中,我们将探讨如何使用渐进的 C# 库轻松有效地将 EML 导入 PST,并提供代码示例和步骤。
.NET API 管理 EML
Aspose.Email for .NET 是一个强大且多功能的 API,提供广泛的功能以在 .NET 应用程序中处理电子邮件消息和邮件服务器。该 API 与流行的电子邮件协议和格式无缝集成,使开发人员能够轻松创建和操作电子邮件消息。
Aspose.Email 的一个显著特点是其对在不同格式之间转换电子邮件的广泛支持,包括将 EML 转移到 PST。通过利用 Aspose.Email 提供的丰富类和方法集,开发人员可以执行复杂的电子邮件相关任务,例如处理附件、管理文件夹以及在各种格式之间转换电子邮件。在深入代码之前,您需要将库集成到您的 C# 项目中。您可以通过 下载 Aspose 网站上的库或使用 NuGet 轻松获取。
Install-Package Aspose.Email
一旦库成为您项目的一部分,您就可以开始编码。
将单个 EML 消息导入 PST 文件
Aspose.Email 综合 API 提供简单直观的代码示例和步骤,以将 EML 消息添加到 PST 文件中:
- 使用 Create 方法创建一个新的个人存储文件,指定文件名和格式版本作为参数。
- 使用 CreatePredefinedFolder 方法在 PST 文件中创建一个预定义的 “收件箱” 文件夹,指定 “收件箱” 作为文件夹名称,StandardIpmFolder.Inbox 作为文件夹类型。
- 使用 MapiMessage 类的 ‘Load’ 方法从文件加载电子邮件消息,指定其名称和 EmlLoadOptions 实例作为参数。
- 使用 FolderInfo 类的 AddMessage 方法将加载的电子邮件消息添加到 PST 文件中之前创建的收件箱文件夹中。
using (var pst = PersonalStorage.Create("test.pst", FileFormatVersion.Unicode)) | |
{ | |
var inboxFolder = pst.CreatePredefinedFolder("Inbox", StandardIpmFolder.Inbox); | |
var msg = MapiMessage.Load("test.eml", new EmlLoadOptions()); | |
inboxFolder.AddMessage(msg); | |
} |
结果是创建一个名为 “test.pst” 的新的个人存储文件,从文件 “test.eml” 加载的消息被添加到收件箱文件夹中,并可供进一步操作或存储。
将多个 EML 消息导入 PST 文件
Aspose.Email 使得可以将文件夹中的一组消息添加到 PST 文件中。AddMessages 方法允许您将多个 EML 消息导入到 PST 文件中的收件箱文件夹中。以下代码示例将向您展示如何将此功能实现到您的项目中:
- 使用 Create 方法创建一个新的个人存储文件,指定文件名和格式版本作为参数。
- 使用 CreatePredefinedFolder 方法在 PST 文件中创建一个预定义的 “收件箱” 文件夹,指定 “收件箱” 作为文件夹名称,StandardIpmFolder.Inbox 作为文件夹类型。
- 使用 AddMessages 方法将一个或多个电子邮件消息从文件夹添加到 PST 文件中之前创建的收件箱文件夹,指定一个表示要从指定文件夹路径导入的消息的 MapiMessageEnumerator 对象。
using (var pst = PersonalStorage.Create("test.pst", FileFormatVersion.Unicode)) | |
{ | |
var inboxFolder = pst.CreatePredefinedFolder("Inbox", StandardIpmFolder.Inbox); | |
inboxFolder.AddMessages(new MapiMessageEnumerator("PathToFolder")); | |
} |
在这里,我们利用 ‘MapiMessageEnumerator’ 来遍历源文件夹中的 EML 文件并将其添加到 PST 文件中。
MapiMessage 枚举器实现
使用 Aspose.Email,您可以定义实现 IEnumerable 接口的 ‘MapiMessageEnumerator’ 类。该类允许遍历集合中的 MapiMessage 对象,代表存储为 .eml 文件的电子邮件消息。MapiMessageEnumerator 内部的 Enumerator 嵌套类充当迭代器,执行将 EML 文件加载为 MapiMessage 对象并管理迭代过程。它具有用于遍历文件、释放资源和重置枚举器的方法。
以下代码示例将向您展示如何以编程方式遍历 MapiMessages 集合:
- 定义 ‘MapiMessageEnumerator’ 类,接受一个 ‘folderPath’ 参数,指示 .eml 文件所在的目录。
- 使用 ‘GetEnumerator’ 方法创建并返回 ‘Enumerator’ 类的新实例,传递文件夹路径。
- 在字段中存储 ‘folderPath’ 并使用 ‘IEnumerator’ 遍历文件夹内的文件路径。
- 当构造 ‘Enumerator’ 类时,初始化 ‘folderPath’ 并调用 ‘Reset()’ 方法,以准备 ‘fileEnumerator’。
- 显式实现 ‘Current’ 属性和 IEnumerator 的 Current 属性。
- 提供一个 ‘Dispose’ 方法以释放 ‘fileEnumerator’ 和当前的 ‘MapiMessage’(如果存在)。
- 使用 ‘MoveNext’ 方法遍历文件路径,尝试从文件加载 ‘MapiMessage’,并记录或处理发生的任何错误。
- 在 ‘Reset’ 方法中,释放 ‘fileEnumerator’ 并通过在 ‘folderPath’ 中枚举 .eml 文件创建一个新的枚举器。
public class MapiMessageEnumerator : IEnumerable<MapiMessage> | |
{ | |
private readonly string folderPath; | |
public MapiMessageEnumerator(string folderPath) | |
{ | |
this.folderPath = folderPath; | |
} | |
public IEnumerator<MapiMessage> GetEnumerator() | |
{ | |
return new Enumerator(folderPath); | |
} | |
IEnumerator IEnumerable.GetEnumerator() | |
{ | |
return GetEnumerator(); | |
} | |
private class Enumerator : IEnumerator<MapiMessage> | |
{ | |
private readonly string folderPath; | |
private IEnumerator<string> fileEnumerator; | |
public Enumerator(string folderPath) | |
{ | |
this.folderPath = folderPath; | |
Reset(); | |
} | |
public MapiMessage Current { get; private set; } | |
object IEnumerator.Current | |
{ | |
get { return Current; } | |
} | |
public void Dispose() | |
{ | |
fileEnumerator.Dispose(); | |
Current?.Dispose(); | |
} | |
public bool MoveNext() | |
{ | |
while (fileEnumerator.MoveNext()) | |
{ | |
var filePath = fileEnumerator.Current; | |
try | |
{ | |
Current?.Dispose(); // Dispose previous MailMessage if any | |
Current = MapiMessage.Load(filePath, new EmlLoadOptions()); | |
return true; | |
} | |
catch (Exception ex) | |
{ | |
// Log or handle the error | |
Console.WriteLine($"Failed to parse message: {ex.Message}"); | |
} | |
} | |
return false; | |
} | |
public void Reset() | |
{ | |
fileEnumerator?.Dispose(); | |
fileEnumerator = Directory.EnumerateFiles(folderPath, "*.eml").GetEnumerator(); | |
Current = null; | |
} | |
} | |
} |
结论
总之,无论您是在电子邮件客户端之间迁移,还是将电子邮件数据归档以进行存储和备份,Aspose.Email for .NET 提供了一种可靠且功能丰富的解决方案,将 EML 文件转换为 PST 格式,使其成为一个高效且简单的过程。通过直观的代码示例和全面的 文档,开发人员可以轻松地将此基本功能实现到他们的项目中。此外,免费的 论坛 提供了一个社区驱动的支持系统,以解答在实施过程中可能出现的任何问题或疑问。要获取有关 API 高级代码功能的更多信息,请访问我们的 参考资源。