
將 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 作為文件夾類型。
- 使用 FolderInfo 類的 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 高級代碼功能的更多信息,請訪問我們的 參考資源。