使用Outlook Redemption添加PST存储时触发MAPI_E_INTERFACE_NOT_SUPPORTED错误
解决Outlook Redemption添加PST时的MAPI_E_INTERFACE_NOT_SUPPORTED错误
错误原因分析
MAPI_E_INTERFACE_NOT_SUPPORTED错误通常和以下因素相关:
- 绑定到Outlook现有MAPI会话时,会话权限或状态限制了PST添加操作
- PST路径无效、无读写权限或文件被占用
- Redemption版本与Outlook位数不兼容
- 控制台应用权限不足
解决方案
1. 调整RDOSession初始化方式
不要直接绑定Outlook的MAPIOBJECT,改用Redemption自身的Logon方法创建独立MAPI会话,避免Outlook会话的权限限制:
RDOSession rdoSession = new RDOSession(); // 使用Redemption独立登录MAPI,而非绑定Outlook会话 rdoSession.Logon(null, null, false, false, null, false);
2. 确保PST路径有效且有读写权限
- 提前创建PST所在目录(比如
c:\Support),避免因目录不存在导致的错误 - 确认当前用户对目标目录有完全控制权限,必要时以管理员身份运行控制台程序
3. 匹配Redemption与Outlook的位数
Outlook默认是32位版本,需将控制台项目的平台目标设置为x86(而非Any CPU),确保Redemption与Outlook位数一致,避免跨位数调用的接口不兼容问题。
4. 更新Redemption到最新版本
旧版本Redemption可能存在MAPI接口兼容性问题,安装最新版本后重新引用项目中的Redemption库。
5. 修改后的完整示例代码
using System; using System.IO; using Redemption; class Program { static void Main(string[] args) { string pstPath = @"c:\Support\nicknames.pst"; // 确保目标目录存在 string pstDir = Path.GetDirectoryName(pstPath); if (!Directory.Exists(pstDir)) { Directory.CreateDirectory(pstDir); } RDOSession rdoSession = new RDOSession(); rdoSession.Logon(null, null, false, false, null, false); try { RDOPstStore pstStore = rdoSession.Stores.AddPSTStore(pstPath, 1, "Test Store"); RDONicknames defaultNicknames = rdoSession.GetNicknames(); RDONicknames pstNicknames = pstStore.GetNicknames(); pstNicknames.Clear(); foreach (RDONickName nickname in defaultNicknames) { pstNicknames.Add(nickname.GetAddressEntry()); } pstNicknames.Save(); foreach (RDONickName nickname in pstNicknames) { Console.WriteLine($"{nickname.Name}_{nickname.SMTPAddress}"); } } catch (Exception ex) { Console.WriteLine($"错误信息:{ex.Message}"); } finally { rdoSession.Logoff(); } Console.ReadLine(); } }
额外排查点
- 确保Outlook已配置有效邮件配置文件,无损坏或未完成的初始化状态
- 避免在Outlook启动过程中运行程序,等待Outlook完全加载后再执行代码
内容的提问来源于stack exchange,提问作者joeschwa
相关产品推荐
相关产品推荐

