MailItem.SaveAs拒绝工作

时间:2015-03-19 15:40:31

标签: vba ms-access outlook

这让我感到疯狂,因为错误287 - 应用程序定义或对象定义错误。我正在开发一个从Outlook中拖放MailItem(我知道它是一个MailItem而不是任何其他类型)到Access备注字段中。试图在MailItem对象上调用SaveAs,它根本不起作用。我尝试了在阳光下的每一种方法 - 使用命名空间,不使用命名空间,使用.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位计算机上尝试,同样的错误。

编辑:尝试下面的德米特里的代码,同样的错误。

3 个答案:

答案 0 :(得分:4)

确实没有必要重新打开消息:

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

答案 1 :(得分: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

答案 2 :(得分:2)

为什么需要使用赎回?

我认为使用OOM和Redempton之间没有任何区别。

为什么需要在代码中使用GetItemFromID方法?

  

olNs.GetItemFromID(olNs.Application.ActiveExplorer.Selection(1).EntryID)

您已在资源管理器窗口中获得对所选对象的引用:

olNs.Application.ActiveExplorer.Selection(1)

此外,我建议打破调用的chaing并在单独的行上声明每个属性或方法调用。