借助Aspose.Email,在 C# 中将 EML 导入 PST

将 EML 消息导入 PST 文件是一项常见要求,尤其是对于在电子邮件客户端之间迁移或存档电子邮件以进行存储和备份的用户。 PST 格式保留了内容的结构、格式和附件,使其适合在 Outlook 应用程序中无缝集成和管理。

这种专有的 Microsoft 文件格式的主要优势是能够创建电子邮件数据的本地存档,从而可以离线管理和访问电子邮件、联系人和其他相关信息。 在本文中,我们将探讨如何使用渐进式 C# 库以及代码示例和步骤轻松高效地将 EML 导入 PST。

Aspose.Email 是用于轻松的开发 email 功能的应用程序的一组控件,基于  ASP.NET 的Web应用、Web服务和Windows 应用。支持 Outlook PST, EML, MSG, and MHT 格式. 允许开发者直接与 SMTP, POP, FTP, 和 MS Exchange 服务器进行工作。支持邮件合并、行事历、定制邮件标题和内容、嵌入文件等,Aspose API支持流行文件格式处理,并允许将各类文档导出或转换为固定布局文件格式和最常用的图像/多媒体格式。

Aspose.Email 最新下载

.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 文件的步骤:

  • 使用PersonalStorage类的Create方法创建一个新的个人存储文件,并指定文件名和格式版本作为参数。
  • 使用PersonalStorage类的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 文件中。FolderInfo类的AddMessages方法允许您将多条 EML 消息导入存储文件中的收件箱文件夹。以下代码示例将向您展示如何在项目中实现此功能:

  1. 使用PersonalStorage类的Create方法创建一个新的个人存储文件,并指定文件名和格式版本作为参数。
  2. 使用PersonalStorage类的CreatePredefinedFolder方法在 PST 文件中创建预定义的“收件箱”文件夹,指定“收件箱”作为文件夹名称,指定 StandardIpmFolder.Inbox 作为文件夹类型。
  3. 使用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 集合:

  1. 定义“MapiMessageEnumerator”类接受“folderPath”参数,该参数指示.eml 文件所在的目录。
  2. 使用“GetEnumerator”方法创建并返回“Enumerator”类的新实例,传递文件夹路径。
  3. 将“folderPath”存储在一个字段中,并使用“IEnumerator”遍历文件夹内的文件路径。
  4. 当构造“Enumerator”类时,初始化“folderPath”并调用“Reset()”方法来准备“fileEnumerator”。
  5. 明确实现“Current”属性和 IEnumerator 的 Current 属性。
  6. 如果存在“fileEnumerator”和当前“MapiMessage”,则提供“Dispose”方法来处理它们。
  7. 使用“MoveNext”方法遍历文件路径,尝试从文件加载“MapiMessage”,并记录或处理发生的任何错误。
  8. 在“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 格式,使其成为一个高效而直接的过程。借助直观的代码示例和全面的文档,开发人员可以毫不费力地将这一基本功能实现到他们的项目中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自定义指令实现Element Plus分页组件内容样式修改

改之前是这样的 改之后是这样的 因为之前我也有写过文章讲解Vue2-ElementUI分页组件的样式修改。 ElementUI 分页组件内容样式修改https://blog.csdn.net/qq_54548545/article/details/139728064且通常情况下&#xff0c;一个项目若是大量使用到分页组件&#xff0c;咱们也不可…

linux vim编辑文件界面的所有命令

Vim 是一个高度可配置的文本编辑器&#xff0c;广泛用于 Unix、Linux 和 macOS 系统。它提供了一套丰富的命令和快捷键来高效地进行文本编辑。下面列举了一些 Vim 编辑文件界面中最常用和基础的命令和快捷键&#xff0c;但请注意 Vim 的命令集非常庞大&#xff0c;这里只涵盖了…

nginx配置反向代理404问题

使用Nginx进行反向代理,代码如下: server {listen 85;server_name _;charset utf-8;location /thirdServiceApi/ {proxy_pass https://www.test.net/thirdServiceApi/;proxy_set_header Host $http_ho

Mac怎么录屏带声音,学会这2种方法,轻松解决

在数字化时代&#xff0c;录屏已经成为我们工作、学习和娱乐中不可或缺的一部分。对于Mac用户来说&#xff0c;Mac怎么录屏带声音是一个非常实用又重要的操作&#xff0c;无论是为了保存会议内容、制作教学视频还是为了录制游戏视频&#xff0c;这一功能都能为我们提供极大的便…

会员运营体系设计及SOP梳理

一些做会员的经验和方法分享给大家&#xff0c;包括顶层思考、流程的梳理、组织的建立&#xff0c;后续会做成系列&#xff0c;最近几期主要围绕顶层策略方面&#xff0c;以下是核心内容的整理&#xff1a; 1、会员运营体系设计 顶层设计与关键业务定位&#xff1a;建立客户运营…

Web学习day03

maven&Mybatis 目录 maven&Mybatis 文章目录 一、maven 1.1作用 1.2仓库 1.3命令 1.4依赖范围 1.5生命周期 二、MyBatis 2.1简介 2.2API 2.3增删改的实现&案例 总结 一、maven 1.1作用 统一项目结构&#xff1b;项目构建&#xff1a;通过简单命令&a…

Java 枚举教程

Java 枚举是一种特殊的类&#xff0c;用于表示一组固定的常量值。枚举类使用 enum 关键字来定义&#xff0c;通常用于表示一组相关的常量&#xff0c;比如季节、月份、星期天等。本文将详细介绍 Java 枚举的基本概念、使用方法以及一些高级用法。 1. 定义枚举类 枚举类使用 e…

GitHub 站点打不开

遇到的问题 您是否遇到过GitHub网站打不开的情况&#xff0c;正如下图所示&#xff1a; 解决方案 以下是一些常见的解决方案&#xff1a; 1. 检查网络连接 确保你的设备已连接到互联网。尝试访问其他网站&#xff0c;确保不是你的网络问题。 C:\Vinca>ping github.…

Vue+SpringBoot实现仿网盘项目

目录 一、效果展示 二、前端代码 三、后端代码及核心解释 四、进阶开发与思路 一、效果展示 1.1读取文件夹内的文件 1.2删除功能 1.3 上传文件 1.4 文件下载 对应的网盘实际地址与对应下载内容&#xff1a; 二、前端代码 2.1 创建vue项目&#xff08;需要有vuex与router&…

称重传感器有哪些种类

有关称重传感器的知识&#xff0c;称重传感器是众多传感器产品中的一种&#xff0c;也是很常用的传感器之一&#xff0c;那么称重传感器有哪些种类&#xff0c;称重传感器的分类方式是什么样的&#xff0c;一起来了解下。 称重传感器的分类 主要有六种称重传感器类型&#xf…

C++笔试真题

可变分区管理方案 最佳适应&#xff1a;空闲区按容量递增最坏适应&#xff1a;空闲区按容量递减首先适应&#xff1a;空闲区按地址递增 C的结构体中有构造函数。 Linux新建用户或组 useradd&#xff1a;命令用于建立用户账号usermod&#xff1a;修改用户账号groupadd&#…

【模块化与包管理】:解锁【Python】编程的高效之道

目录 1.什么是模块&#xff1f; 2. 模块的导入过程 3. 理解命名空间 4. import语句的多种形式 5. 模块的执行与重新导入 6. 包&#xff08;Package&#xff09; 7. sys模块和os模块 sys模块 常用属性 示例&#xff1a;使用sys模块 os模块 常用功能 示例&#xff1…

【鸿蒙学习笔记】使用动画

官方文档&#xff1a;使用动画 目录标题 属性动画&#xff1a;通用属性发生改变时而产生的属性渐变效果animationanimateTo自定义属性动画 AnimatableExtend 转场动画&#xff1a;是页面或组件的切换动画 , 显示/隐藏 切换时的动画出现/消失转场&#xff1a;实现一个组件出现或…

redis内存分析

阿里云redis集群对key进行hash后保存在对应的后端节点&#xff0c;使每个节点的key数量大致相同&#xff0c;但是如果存在大key&#xff0c;就会导致单个节点内存用满&#xff0c;可以使用redis-rdb-tools 或rdr来对内存进行分析。 redis-rdb-tools redis-rdb-tools通过对dum…

【Superset】dashboard 自定义URL

URL设置 在发布仪表盘&#xff08;dashboard&#xff09;后&#xff0c;可以通过修改看板属性中的SLUG等&#xff0c;生成url 举例&#xff1a; http://localhost:8090/superset/dashboard/test/ 参数设置 以下 URL 参数可用于修改仪表板的呈现方式&#xff1a;此处参考了官…

SolidWorks滚花螺栓制作-cnblog

目标 规划基准图形 确定尺寸&#xff0c;单位mm 我 对固定好的图形进行旋转 倒角 设置螺纹 注意改变深度为15mm 收尾位置补全 滚花 建立基准面 制作多边形 添加穿透 扫描切除 圆周阵列 成品完成

春风得意特斯拉(六)

占据顶流的炼金术 科技企业的创始人&#xff0c;也是品牌传播的载体和IP&#xff0c;他们自觉或不自觉的人设和流量会自动加持到品牌身上&#xff0c;让品牌和人设双向赋能&#xff0c;成为媒体的流量宠儿。纵观全球&#xff0c;科技行业创始人个人品牌打造之路也各有千秋。国外…

【深度学习】手动完成线性回归!

&#x1f34a;嗨&#xff0c;大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; )&#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官、CSDN人工智能领域优质创作者 。 易编橙&#xff1a;一个帮助编程小…

现代码头装卸系统:技术创新与效率提升

引言 码头装卸系统在全球贸易和物流链中扮演着至关重要的角色。随着全球化进程的加快&#xff0c;国际贸易量不断增加&#xff0c;港口作为货物进出主要枢纽&#xff0c;其装卸效率直接影响到整个物流链的运作效率和成本。一个高效、现代化的码头装卸系统不仅能提高港口的货物处…

JVM是如何创建一个对象的?

哈喽&#xff0c;大家好&#x1f389;&#xff0c;我是世杰。 本文我为大家介绍面试官经常考察的**「Java对象创建流程」** 照例在开头留一些面试考察内容~~ 面试连环call Java对象创建的流程是什么样?JVM执行new关键字时都有哪些操作?JVM在频繁创建对象时&#xff0c;如何…