我想在我的驱动器中保存outlook消息,但我得到一个运行时错误287:"应用程序定义或对象错误">
Sub extract_outlook_emails()
Dim ap As Outlook.Application
Dim fl As Outlook.MAPIFolder
Dim it As Outlook.MailItem
Dim space As Outlook.Namespace
Dim i As Long
Dim p As Variant
Dim str As String
Set ap = New Outlook.Application
Set space = ap.GetNamespace("MAPI")
Set fl = space.GetDefaultFolder(olFolderInbox)
For Each it In fl.Items
If it.Class = olMail Then
If VBA.InStr(1, it.Subject, "Product_19854") Then
p = SaveSelectMail(it.Subject)
str = "c:"&environ("user profile") & p & "-" & VBA.Format(it.ReceivedTime, "ddmmyyyy", vbUseSystemDayOfWeek) & ".msg"
it.SaveAs str, OlSaveAsType.olMSG
End If
End If
Next it
end sub
首先,Outlook文件夹可能包含不同类型的项目-邮件,日历,任务,文档项目等。但在代码中,您将迭代所有类型为MailItem
的项目:
Dim it As Outlook.MailItem
...
For Each it In fl.Items
您需要将it
定义为对象,并使用后绑定技术来避免代码中的错误。
遍历文件夹中的所有项目也不是一个好主意。要查找主题包含关键字的所有邮件(任何您的搜索条件),您可以使用Items
类的Find
/FindNext
或Restrict
方法。在以下文章中阅读更多关于它们的信息:
- 如何:使用Find和FindNext方法从文件夹中检索Outlook邮件项目(c#, VB.NET)
- 如何:使用Restrict方法从文件夹 中检索Outlook邮件项目
但是如果您需要在多个文件夹中搜索项目,您可以考虑使用Application
类的AdvancedSearch
方法。在Outlook中使用AdvancedSearch
方法的主要好处是:
- 在另一个线程中执行搜索。你不需要手动运行另一个线程,因为
AdvancedSearch
方法会在后台自动运行它。 - 可以在任何位置搜索任何项目类型:邮件,约会,日历,笔记等,即超出某个文件夹的范围。
Restrict
和Find
/FindNext
方法可以应用于特定的Items
集合(参见Outlook中Folder
类的Items
属性)。 - 完全支持DASL查询(自定义属性也可以用于搜索)。您可以在MSDN的过滤文章中阅读更多相关内容。为了提高搜索性能,如果商店启用了即时搜索,可以使用即时搜索关键字(参见
Store
类的IsInstantSearchEnabled
属性)。 - 可以使用
Search
类的Stop
方法随时停止搜索进程。
参见Outlook编程高级搜索:c#, VB。. NET获取更多信息。