使用 EntryID 引用时的 MailItem.SaveAs
Posted
技术标签:
【中文标题】使用 EntryID 引用时的 MailItem.SaveAs【英文标题】:MailItem.SaveAs when referencing with EntryID 【发布时间】:2015-03-19 15:40:30 【问题描述】:我正在开发将 Outlook 中的 MailItem(我知道它是 MailItem 而不是任何其他类型)拖放到 Access 备忘录字段中。尝试在 MailItem 对象上调用 SaveAs。
我明白了
错误 287 - 应用程序定义或对象定义的错误。
我尝试过使用命名空间,不使用命名空间,使用 .Item 等。
这是我当前的代码:
Dim olApp As Outlook.Application
Set olApp = CreateObject("Outlook.Application")
Dim olNs As Outlook.NameSpace
Set olNs = olApp.GetNamespace("MAPI")
Dim olMail As Outlook.MailItem
Set olMail = olNs.GetItemFromID(olNs.Application.ActiveExplorer.Selection(1).EntryID)
olMail.SaveAs strPathAndFile, Outlook.OlSaveAsType.olMSG
Access 2010、Outlook 2010 均为 32 位。 Win 7机器是64位的。
在全 32 位机器上试过,同样的错误。
尝试了下面 Dmitry 的代码,同样的错误。
【问题讨论】:
【参考方案1】:确实没必要重新打开消息:
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.ActiveExplorer.Selection(1)
olMail.SaveAs strPathAndFile, Outlook.OlSaveAsType.olMSG
其次,strPathAndFile
变量的值是多少?
作为测试,您能否安装Redemption 并尝试以下脚本(您可以从OutlookSpy 运行它 - 单击脚本,按钮,粘贴脚本,单击运行)。如果 MAPI 级别存在问题,Redemption 将报告它,而不是给出模糊的错误消息。
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Msg = Session.GetMessageFromID(Application.ActiveExplorer.Selection(1).EntryID)
Msg.SaveAs "c:\temp\test.msg", olMsg
【讨论】:
谢谢,但 .SaveAs 行上的错误相同。 strPathAndFile 是一个指向网络路径 + 随机合法字符和 ".msg" 的字符串。我尝试使用映射路径、完全限定路径,甚至是本地路径,以确保不是那样。我对路径有写权限。 你能试试上面的脚本吗(我更新了答案)? 感谢您的帮助,但遗憾的是没有。没有管理员权限,因此无法安装 OutlookSpy。 Dmitry,仅供参考,我能够毫无问题地调用 MailItem.Copy() 方法。当然,这只是在收件箱中制作副本。我开始认为这是某种权限问题。 为什么需要 MailItem.Copy?【参考方案2】:最终使用 Dmitry Streblechenko 的出色 Redemption 库完成了这项工作。谢谢!
Dim olApp As Outlook.Application
Set olApp = CreateObject("Outlook.Application")
Dim olNs As Outlook.NameSpace
Set olNs = olApp.GetNamespace("MAPI")
Dim oRDOSession As Redemption.RDOSession
Set oRDOSession = CreateObject("Redemption.RDOSession")
oRDOSession.MAPIOBJECT = olNs.Application.Session.MAPIOBJECT
If Not oRDOSession.LoggedOn Then oRDOSession.Logon
Dim oMsgItem As Redemption.RDOMail
Set oMsgItem = oRDOSession.GetMessageFromID(olNs.Application.ActiveExplorer.Selection(1).EntryID)
strPathAndFile = "some\path\" & UniqueValueStr(Now()) & ".msg"
oMsgItem.SaveAs strPathAndFile
【讨论】:
【参考方案3】:为什么需要使用 Redemption?
我认为使用 OOM 和 Redempton 之间没有任何区别。
为什么需要在代码中使用GetItemFromID方法?
olNs.GetItemFromID(olNs.Application.ActiveExplorer.Selection(1).EntryID)
您已经在资源管理器窗口中获得了对所选对象的引用:
olNs.Application.ActiveExplorer.Selection(1)
我还建议打破调用链并在单独的行上声明每个属性或方法调用。
【讨论】:
以上是关于使用 EntryID 引用时的 MailItem.SaveAs的主要内容,如果未能解决你的问题,请参考以下文章
获取从 Outlook 表中获取的消息的 Outlook 邮件项
如何将Outlook发送的电子邮件唯一匹配到其对应的Outlook草稿(MAPI MailItem)