如何通过代码将O365邮箱导出为.pst文件?求可行方案
O365邮箱导出为PST的实现方案
一、手动简便导出方法
如果用Outlook客户端连接了O365邮箱,直接用自带功能就能导出:
- 打开Outlook,选中要导出的O365账户
- 点击「文件」→「打开和导出」→「导入/导出」
- 选择「导出到文件」→「Outlook数据文件(.pst)」,跟着向导选择要导出的文件夹、设置保存路径即可
- 注意:导出过程中不要断网,Outlook也不能关闭
二、代码实现方案
1. 用Redemption库实现
你已有Redemption授权,可按以下流程操作:
- 初始化RDOSession对象,通过O365账号密码或已有的Outlook配置文件登录
- 创建目标PST文件:
RDOSession session = new RDOSession(); RDOPstStore pstStore = session.LogonPstStore(@"D:\O365Backup\MyMailBackup.pst"); - 递归遍历O365邮箱的所有文件夹(含收件箱、已发送、自定义文件夹),将文件夹内的邮件复制到PST对应路径:
// 示例:复制收件箱内容 RDOFolder sourceInbox = session.GetDefaultFolder(rdoDefaultFolders.olFolderInbox); RDOFolder targetInbox = pstStore.GetDefaultFolder(rdoDefaultFolders.olFolderInbox); CopyFolderContents(sourceInbox, targetInbox); // 递归复制文件夹内容的方法 void CopyFolderContents(RDOFolder source, RDOFolder target) { // 复制当前文件夹下的所有邮件 foreach (RDOItem item in source.Items) { item.CopyTo(target); } // 复制子文件夹 foreach (RDOFolder subFolder in source.Folders) { RDOFolder newSubFolder = target.Folders.Add(subFolder.Name); CopyFolderContents(subFolder, newSubFolder); } } - 复制完成后关闭PST存储,释放相关资源
2. 用EWS(Exchange Web Services)实现
EWS需先获取O365邮箱的访问权限,步骤如下:
- 初始化EWS服务,配置O365的EWS地址(
https://outlook.office365.com/EWS/Exchange.asmx),设置身份验证(O365推荐使用OAuth) - 递归遍历邮箱所有文件夹:通过
FindFolders方法获取根文件夹下的所有子文件夹 - 对每个文件夹,用
FindItems拉取所有邮件,并下载完整内容(含附件) - 借助第三方库(如Aspose.Email、MsgKit)将下载的邮件转换为MAPI格式,再写入PST文件:
// 示例用Aspose.Email创建PST并写入邮件 using (PersonalStorage pst = PersonalStorage.Create(@"D:\O365Backup\EWSBackup.pst", FileFormatVersion.Unicode)) { // 创建对应文件夹 FolderInfo pstFolder = pst.CreateFolder("自定义文件夹"); // 假设ewsItem是从EWS获取的邮件对象 MapiMessage msg = MapiMessage.Load(new MemoryStream(ewsItem.MimeContent.Content)); pstFolder.AddMessage(msg); }
三、Graph API相关补充
目前Graph API没有直接导出PST的原生功能,只能批量拉取邮件内容后,再通过第三方库生成PST,实现复杂度高于EWS和Redemption
内容的提问来源于stack exchange,提问作者thinkjohn
相关产品推荐
相关产品推荐

