C# 从 .msg 获取特定命名的 MAPI 属性 时出现问题
C# Problems getting a specific named MAPI property from a .msg
我在从 C# 控制台应用程序中的 MailItem 获取一对 "custom" MAPI 属性时遇到了与 this question 类似的问题,但有一个额外的问题,即它在本地工作但不工作在服务器上。
这两个属性是 PR_SERVERID 和 PR_MSGID,当通过 MFCMAPI 检查时,这两个属性都在邮件项目上可用,我按如下方式访问它们:
MessageDetails.PR_SERVERID = Message.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/PR_SERVERID").ToString();
MessageDetails.PR_MSG_ID = Message.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/PR_MSGID").ToString();
其中 Message 的类型为 Outlook.MailItem
。当我 运行 在本地(从构建的 exe 或在调试中)它工作但在单独的服务器上完全相同的消息失败:
15:17:26 Error getting getting MAPI properties from the stub:
System.ApplicationException: System.Runtime.InteropServices.COMException (0x8004010F):
The property "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/PR_SERVERID" is unknown or cannot be found.
在此之前,我成功地从同一项目中检索了两个 "standard" MAPI 属性(PR_CREATOR_NAME 和 PR_INTERNET_MESSAGE_ID),因此可以访问 MailItem。
MFCMAPI 中显示的属性的 DASL 在两台服务器和我的本地计算机之间是相同的,两者都是 运行ning Outlook 2010 并通过调用 Outlook 会话访问 mailItem。
我唯一能想到的是,如果远程服务器上缺少某些配置,Outlook 本身无法识别自定义属性,Outlook 是否必须在 属性 配置即使被 DASL 识别也能被识别的命名空间级别?
编辑:关于邮件的附加信息:
邮件是 "stubs" 从存档系统下载的,然后这两个属性为 "full" 邮件内容提供标识符。我正在从远程服务器下载存根,将其保存在本地,然后使用以下方法访问集合中的每个存根:
Outlook.NameSpace NS = _outlookApplication.GetNamespace("MAPI");
Object item = _outlookApplication.Session.OpenSharedItem(MessageDetails.FilePath)
Outlook.MailItem Message = (Outlook.MailItem)item;
并尝试通过从 Message
.
获取属性来将这两个属性添加到 MessageDetails
对象
编辑 2:
我注意到,在 "fresh" 主机上检索属性时,当我访问自定义属性时,我会收到 "a program is trying to access e-mail address information stored in Outlook" 的安全提示,但当我访问时,会收到 而不是 来自标准属性的 subjectline/sender 等。这似乎表明这些自定义属性在使用 outlook 通过 COM 互操作访问时是 "different"。 没关系,这只是调用 PropertyAccessor.GetProperty 时的默认保护。
答案:
德米特里是正确的,我已将他的回复标记为答案,这些属性无法访问,因为它们从未在商店中创建过。对于用户机器,这些已经创建,因为在某些时候我们 "archived" 将邮件发送到远程存储并在我们邮箱中留下的存根上设置自定义属性。在服务器上从来没有这样做过,所以我为 "first run" 添加了一个选项,它创建一个虚拟对象,在其上设置两个空的自定义属性,保存它然后删除它。随后的 运行 可以使用 PropertyAccessor.GetProperty.
访问属性
我猜服务器上没有安装{00020329-0000-0000-C000-000000000046}定义的接口。在它工作的机器上搜索它(例如使用 Regedit),并记下它与什么 dll 相关联(这将在 InprocServer32 子键中作为默认 属性。然后在服务器上执行相同的操作:它可能根本找不到 CLSID。
如果是这种情况,那么您需要安装缺少的 dll - 及其所有依赖项,即包含它的包。
Outlook 对象模型始终假设“字符串”命名空间中的属性为 PT_UNICODE
/ PT_STRING8
类型。你的类型是 PT_LONG
(0x0003
).
作为测试,你能安装Redemption (I am its author) and try the following script from OutlookSpy吗(我也是它的作者-点击脚本,粘贴脚本,点击运行)
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Msg = Session.GetMessageFromMsgFile("c:\temp\yourmsg.msg")
MsgBox Msg.Fields("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/PR_SERVERID/0x00000003")
更新
在代码失败的机器上的 OutlookSpy 中尝试以下脚本。当 IMessage window 弹出时,你看到命名属性了吗?
set msg = Application.Session.OpenSharedItem("c:\temp\yourmsg.msg")
BrowseObject(msg.MAPIOBJECT)
我在从 C# 控制台应用程序中的 MailItem 获取一对 "custom" MAPI 属性时遇到了与 this question 类似的问题,但有一个额外的问题,即它在本地工作但不工作在服务器上。
这两个属性是 PR_SERVERID 和 PR_MSGID,当通过 MFCMAPI 检查时,这两个属性都在邮件项目上可用,我按如下方式访问它们:
MessageDetails.PR_SERVERID = Message.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/PR_SERVERID").ToString();
MessageDetails.PR_MSG_ID = Message.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/PR_MSGID").ToString();
其中 Message 的类型为 Outlook.MailItem
。当我 运行 在本地(从构建的 exe 或在调试中)它工作但在单独的服务器上完全相同的消息失败:
15:17:26 Error getting getting MAPI properties from the stub:
System.ApplicationException: System.Runtime.InteropServices.COMException (0x8004010F):
The property "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/PR_SERVERID" is unknown or cannot be found.
在此之前,我成功地从同一项目中检索了两个 "standard" MAPI 属性(PR_CREATOR_NAME 和 PR_INTERNET_MESSAGE_ID),因此可以访问 MailItem。
MFCMAPI 中显示的属性的 DASL 在两台服务器和我的本地计算机之间是相同的,两者都是 运行ning Outlook 2010 并通过调用 Outlook 会话访问 mailItem。
我唯一能想到的是,如果远程服务器上缺少某些配置,Outlook 本身无法识别自定义属性,Outlook 是否必须在 属性 配置即使被 DASL 识别也能被识别的命名空间级别?
编辑:关于邮件的附加信息: 邮件是 "stubs" 从存档系统下载的,然后这两个属性为 "full" 邮件内容提供标识符。我正在从远程服务器下载存根,将其保存在本地,然后使用以下方法访问集合中的每个存根:
Outlook.NameSpace NS = _outlookApplication.GetNamespace("MAPI");
Object item = _outlookApplication.Session.OpenSharedItem(MessageDetails.FilePath)
Outlook.MailItem Message = (Outlook.MailItem)item;
并尝试通过从 Message
.
MessageDetails
对象
编辑 2:
我注意到,在 "fresh" 主机上检索属性时,当我访问自定义属性时,我会收到 "a program is trying to access e-mail address information stored in Outlook" 的安全提示,但当我访问时,会收到 而不是 来自标准属性的 subjectline/sender 等。这似乎表明这些自定义属性在使用 outlook 通过 COM 互操作访问时是 "different"。 没关系,这只是调用 PropertyAccessor.GetProperty 时的默认保护。
答案: 德米特里是正确的,我已将他的回复标记为答案,这些属性无法访问,因为它们从未在商店中创建过。对于用户机器,这些已经创建,因为在某些时候我们 "archived" 将邮件发送到远程存储并在我们邮箱中留下的存根上设置自定义属性。在服务器上从来没有这样做过,所以我为 "first run" 添加了一个选项,它创建一个虚拟对象,在其上设置两个空的自定义属性,保存它然后删除它。随后的 运行 可以使用 PropertyAccessor.GetProperty.
访问属性我猜服务器上没有安装{00020329-0000-0000-C000-000000000046}定义的接口。在它工作的机器上搜索它(例如使用 Regedit),并记下它与什么 dll 相关联(这将在 InprocServer32 子键中作为默认 属性。然后在服务器上执行相同的操作:它可能根本找不到 CLSID。
如果是这种情况,那么您需要安装缺少的 dll - 及其所有依赖项,即包含它的包。
Outlook 对象模型始终假设“字符串”命名空间中的属性为 PT_UNICODE
/ PT_STRING8
类型。你的类型是 PT_LONG
(0x0003
).
作为测试,你能安装Redemption (I am its author) and try the following script from OutlookSpy吗(我也是它的作者-点击脚本,粘贴脚本,点击运行)
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Msg = Session.GetMessageFromMsgFile("c:\temp\yourmsg.msg")
MsgBox Msg.Fields("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/PR_SERVERID/0x00000003")
更新 在代码失败的机器上的 OutlookSpy 中尝试以下脚本。当 IMessage window 弹出时,你看到命名属性了吗?
set msg = Application.Session.OpenSharedItem("c:\temp\yourmsg.msg")
BrowseObject(msg.MAPIOBJECT)