使用 Microsoft Outlook 2002 开发解决方案
Paul Cornell 和 Acey Bunch
Microsoft Corporation
2001年11月
适用于:
Microsoft® Outlook® 2002
摘要:本文讨论如何通过使用 Microsoft Outlook 10.0 对象库以及创建自定义窗体来开发 Microsoft Outlook 2002 解决方案。
目录简介 了解 Outlook 对象模型 了解 Outlook 窗体 发布 Outlook 解决方案 总结 其他资源 简介使用 Microsoft® Outlook 开发解决方案有许多不同的方法。其中关键一点是:不论使用什么方法,必然要用到 Microsoft Outlook 10.0 对象库,也称为 Outlook 对象模型。在使用 Outlook 对象模型时,通常要用到 Outlook 中的 Visual Basic® 编辑器以及 Visual Basic for Applications (VBA) 编程语言。
开发 Outlook 解决方案的方法之一是开发交互式 Outlook 窗体,然后使用 Outlook 中的窗体设计器、Outlook 窗体对象模型以及 Visual Basic Scripting Edition (VBScript) 编程语言进行相应设计(Outlook 窗体不能在 Outlook 之外设计或使用)。
另一种方法是通过其他组件对象模型 (COM) 应用程序开发工具(例如 Microsoft Visual Basic 或 Microsoft Visual C++®)来使用 Outlook 对象模型,这时只要设置一个指向 Microsoft Outlook 9.0 对象库(用于 Microsoft Outlook 2000)或 Microsoft 10.0 对象库(用于 Microsoft Outlook 2002)的引用即可。
此外,还可以使用 VBScript 通过 Web 页来调用 Outlook 对象模型的各项功能。您可以改编本专栏中的代码以用于上述任何方案。如果 VBA 和 VBScript 有较大差异,我们将提供详细的代码示例来演示如何使用它们。
了解 Outlook 对象模型通过 Outlook 对象模型可以编程访问各种 Outlook 组件和功能,例如:Outlook 用户界面、文件夹、电子邮件消息、地址列表以及联系人等。在 Outlook 2002 中,对象模型被称为 Microsoft Outlook 10.0 对象库。
要查看 Outlook 对象模型的各个成员,请启动 Outlook,然后显示 Visual Basic 编辑器,方法是:在菜单中依次单击“工具”|“宏”|“Visual Basic 编辑器”,或按 ALT+F11 键。显示 Visual Basic 编辑器后,可以使用对象浏览器来浏览 Outlook 对象模型,方法是:在菜单中依次单击“视图”|“对象浏览器”,或按 F2 键。在对象浏览器中,可以使用“项目/库”列表来选择特定的对象模型进行查看。在本例中,我们查看的是 Outlook 对象模型,如图 1 所示。
图 1:对象浏览器中显示的 Outlook 对象模型
在“类”窗格中选择成员时,“成员”窗格中将显示与给定类相关的成员。请注意,如果在“类”或“成员”窗格中选择了给定对象模型的成员,可以按 F1 键打开该成员的 Outlook 语言参考帮助主题。
使用 Outlook 对象模型编程时,有几个最常用的对象:
Application
这是根对象,提供对其他对象模型的访问。在 Outlook 中使用 VBA 时,Application 对象被隐含声明,这样您可以选择是否使用 Application 关键字。 NameSpace
此对象用于访问存储项目(如文件夹)。“MAPI”是唯一可以使用的名称空间。 Item
此对象用于包含特定的 Outlook 数据,例如电子邮件消息、约会或联系人。 Folder
此对象是 Outlook 项目的默认存储容器。 Explorer
此对象是显示 Outlook 项目集合的默认界面。每个不同的项目类型都有不同的浏览器。 Inspector
此对象是显示单个 Outlook 项目的默认界面。它们通常都显示为窗体。 下表列出了 Outlook 对象模型中的某些其他对象。
对象/集合代表Action、Actions
可以在一个项目上执行的特定操作。例如,一个邮件项目具有“答复”、“全部答复”、“转发”以及“答复到文件夹”等操作。
AddressList、AddressLists、AddressEntry、AddressEntries
地址列表(如联系人列表、个人通讯簿或全局通讯簿),不包含地址或包含多个地址。
Application
根 Outlook 应用程序对象。
AppointmentItem、ContactItem、DistListItem、DocumentItem、JournalItem、MailItem、MeetingItem、NoteItem、PostItem、RemoteItem、ReportItem、TaskItem、TaskRequestAcceptItem、TaskRequestDeclineItem、TaskRequestItem、TaskRequestUpdateItem
这些是存储在 Outlook 文件夹中的项目类型。
Attachment、Attachments
Outlook 项目中的文档链接或文档。
Exception、Exceptions
周期性约会计划的例外情况。
Explorer、Explorers、Panes
Outlook 用户界面,以及 Outlook 用户界面中的窗格。
Folders
在 Outlook 文件夹层次结构的某一层上所有可用的 Outlook 文件夹。
Inspector、Inspectors、Pages
一种窗口,包含特定 Outlook 项目(如电子邮件消息或联系人)以及 Outlook 项目中的任何选项卡页(如任务项中的“详细信息”选项卡)。
Items、ItemProperty(Outlook 2002 的新功能)、ItemProperties(Outlook 2002 的新功能)
文件夹中的 Outlook 项目(及其相关的内置属性和用户定义属性)。Outlook 项目是 Outlook 中的基本存储单位,类似于文件夹中的文件。项目包括电子邮件消息、约会、联系人、任务、日记条目、记事以及张贴的项目和文档。
MAPIFolder
包含多种 Outlook 项目类型之一的 Outlook 文件夹。
NameSpace
数据源的抽象根对象。“MAPI”是所支持的唯一数据源,它允许访问用户邮件库中存储的所有 Outlook 数据。
OutlookBarGroup、OutlookBarGroups、OutlookBarPane、OutlookBarShortcut、OutlookBarShortcuts、OutlookBarStorage
“Outlook 面板”位于 Outlook 窗口的左边,包含组(如“Outlook 快捷方式”或“其他快捷方式”)和快捷方式(如“收件箱”或“我的电脑”)。
Recipient、Recipients
电子邮件消息的收件人。
RecurrencePattern
约会项目或任务项目的周期性计划。
Reminder(Outlook 2002 的新功能)、Reminders(Outlook 2002 的新功能)
Outlook 的提醒功能,用于提醒任务、联系人以及电子邮件消息。
RemoteItem
远程电子邮件消息。此项目只包含主题、接收的日期和时间、发件人、大小以及电子邮件消息的前 256 个字符。用于给处在远程连接模式下的收件人提供足够的信息,以帮助其判断是否要下载相应的电子邮件消息。
ReportItem
电子邮件发送确认报告。
Results(Outlook 2002 的新功能)、Search(Outlook 2002 的新功能)
Outlook 搜索以及 Outlook 搜索的结果。
TaskItem、TaskRequestAccept、TaskAcceptDecline、TaskRequestItem、TaskRequestUpdate
任务和任务请求,以及针对这些项目的接受、拒绝或更新操作。
UserProperty、UserProperties
Outlook 项目的用户定义属性。
View(Outlook 2002 的新功能)、Views(Outlook 2002 的新功能)
可自定义的 Outlook 项目表示方法。视图的类型包括 olTableView、olCalendarView、olCardView、olIconView 以及 olTimeLineView。
使用 Application 和 NameSpace 对象与其他 Office 对象模型一样,可以使用 Application 对象来进入 Outlook 对象模型。因为在任何时候都只能运行一个 Outlook 实例,因此请使用 New 关键字(如果使用 VBScript,则使用 CreateObject 函数)来创建新的隐藏的 Outlook 实例(如果没有运行 Outlook),或返回正在运行的实例的引用。
得到正在运行的 Outlook 实例的引用后,使用 NameSpace 对象和“MAPI”名称空间类型来访问 Outlook 文件夹和项目。例如:
' VBA
...
Dim objApp As Outlook.Application
Dim objNameSpace As Outlook.NameSpace
Set objApp = New Outlook.Application
Set objNameSpace = objApp.GetNamespace(Type:="MAPI")
...
' VBScript
...
Dim objApp
Dim objNameSpace
Set objApp = CreateObject("Outlook.Application")
Set objNameSpace = objApp.GetNamespace("MAPI")
...
使用 Outlook 文件夹和项目Outlook 项目(例如电子邮件消息、约会、任务等)包含在 Outlook 文件夹中,类似于 Windows 文件系统中的文件和文件夹。MAPIFolder 对象可以包含 Outlook 文件夹和项目。也可以使用 Folders 集合,返回在 Outlook 文件夹层次结构的某一层上的 MAPIFolder 对象。
GetDefaultFolder 方法基于 FolderType 参数返回默认的文件夹(例如,olFolderInbox 常量将“收件箱”文件夹返回给当前登录的用户)。其他默认文件夹包括:
包含 AppointmentItem 对象(会议、一次性约会以及周期性会议或约会)的“日历”文件夹 (olFolderCalendar)。 包含 ContactItem 对象和 DistListItem 对象的“联系人”文件夹 (olFolderContacts)。 “已删除项目”文件夹 (olFolderDeletedItems)。 “草稿”文件夹 (olFolderDrafts)。 包含 JournalItem 对象的“日记”文件夹 (olFolderJournal)。 包含 NoteItem 对象的“记事”文件夹 (olFolderNotes)。 “发件箱”文件夹 (olFolderOutbox)。 “已发送邮件”文件夹 (olFolderSentMail)。 包含 TaskItem 对象的“任务”文件夹 (olFolderTasks)。 “所有公用文件夹”文件夹 (olPublicFoldersAllPublicFolders)。 下面的示例报告了“收件箱”中今天及以前发送的邮件项目的数量。
Public Sub InboxSendDates()
Dim objApp As Outlook.Application
Dim objNameSpace As Outlook.NameSpace
Dim objMAPIFolder As Outlook.MAPIFolder
Dim objMailItem As Outlook.MailItem
Dim lngOldMailCounter As Long
Dim lngNewMailCounter As Long
Set objApp = New Outlook.Application
Set objNameSpace = objApp.GetNamespace(Type:="MAPI")
Set objMAPIFolder = _
objNameSpace.GetDefaultFolder(FolderType:=olFolderInbox)
For Each objMailItem In objMAPIFolder.Items
' 如果需要验证结果,请取消注释下一行。
' Debug.Print objMailItem.SentOn & vbTab & _
objMailItem.Subject
If objMailItem.SentOn < Date Then
lngOldMailCounter = lngOldMailCounter + 1
Else
lngNewMailCounter = lngNewMailCounter + 1
End If
Next objMailItem
MsgBox Prompt:="收件箱中有 " & lngOldMailCounter & _
" 个在今天之前发送的邮件,以及 " & _
lngNewMailCounter & " 个今天发送的邮件。"
End Sub
要处理子文件夹,请使用 Folders 集合。例如:
...
Set objMAPIFolder = _
objNameSpace.GetDefaultFolder(FolderType:=olFolderInbox) _
.Folders("我的紧急项目")
...
要创建新的 Outlook 项目,可以使用 Application 对象的 CreateItem 方法,而无需使用 NameSpace 对象。下面的示例创建了一个私人约会,并将其添加到当前用户的“日历”中:
Public Const SUBJECT_MATTER As String = "午餐会"
Public Const PLACE As String = "Championzone 餐厅"
Public Const START_TIME As String = #8/13/2001 6:00:00 PM#
Public Const DURATION_MINUTES As Long = 90
Public Const MINUTES_BEFORE_START As Long = 45
Public Const BODY_TEXT = "别忘记带礼物!"
Public Sub AddAppointment()
Dim objApp As Outlook.Application
Dim objAppointment As Outlook.AppointmentItem
Set objApp = New Outlook.Application
Set objAppointment = objApp.CreateItem(ItemType:=olAppointmentItem)
With objAppointment
.Subject = SUBJECT_MATTER
.Location = PLACE
.Start = START_TIME
.Duration = DURATION_MINUTES
.ReminderMinutesBeforeStart = MINUTES_BEFORE_START
.BusyStatus = olOutOfOffice
.Body = BODY_TEXT
.Sensitivity = olPrivate
.Save
.Display
End With
End Sub
可以使用 CreateItem 方法创建的项目包括联系人 (olContactItem)、通讯组 (olDistributionListItem)、日记条目 (olJournalItem)、电子邮件消息 (olMailItem)、记事 (olNoteItem)、张贴 (olPostItem) 和任务 (olTaskItem)。还可以使用 CreateItemFromTemplate 方法通过 Outlook 模板文件 (*.oft) 创建新的项目。
使用 Inspector 和 Explorer 对象Outlook 浏览器相当于 Outlook 的用户界面。而检查器是在 Outlook 用户界面中打开的单独的 Outlook 项目。
可以直接通过 Application 对象访问 Inspector 对象和 Explorer 对象。下面的示例将显示“Outlook 面板”、“文件夹列表”和“预览窗格”(如果尚未显示)。
' VBA
Public Sub EnableExplorerUI()
Dim objApp As Outlook.Application
Dim objExplorer As Outlook.Explorer
Set objApp = New Outlook.Application
Set objExplorer = objApp.ActiveExplorer
With objExplorer
If .IsPaneVisible(Pane:=olFolderList) = False Then
.ShowPane Pane:=olFolderList, Visible:=True
End If
If .IsPaneVisible(Pane:=olOutlookBar) = False Then
.ShowPane Pane:=olOutlookBar, Visible:=True
End If
If .IsPaneVisible(Pane:=olPreview) = False Then
.ShowPane Pane:=olPreview, Visible:=True
End If
End With
End Sub
' VBScript
...
Dim objApp
Dim objExplorer
Set objApp = CreateObject("Outlook.Application")
Set objExplorer = objApp.ActiveExplorer
With objExplorer
If .IsPaneVisible(1) = False Then
.ShowPane 1, True
End If
If .IsPaneVisible(2) = False Then
.ShowPane 2, True
End If
If .IsPaneVisible(3) = False Then
.ShowPane 3, True
End If
End With
...
下面的示例使用 Inspectors 集合来显示当前打开的所有 Outlook 项目的名称:
Public Sub InspectorList()
Dim objInspector As Outlook.Inspector
Dim strInspectors As String
Set objInspector = Application.ActiveInspector
If TypeName(VarName:=objInspector) = "Nothing" Then
MsgBox Prompt:="当前未打开任何 Outlook 项。"
Exit Sub
Else
For Each objInspector In Application.Inspectors
strInspectors = strInspectors & vbCrLf & _
objInspector.Caption
Next objInspector
MsgBox Prompt:="打开的 Outlook 项目:" & vbCrLf & _
strInspectors
End If
End Sub
使用 Outlook 面板“Outlook 面板”位于 Outlook 窗口的左边,包含组(如“Outlook 快捷方式”)和组中的快捷方式(如“收件箱”)。
通过以下对象和集合可以编程处理 Outlook 面板的所有内容:OutlookBarPane | OutlookBarStorage | OutlookBarGroups | OutlookBarGroup | OutlookBarShortcuts | OutlookBarShortcut。例如,以下代码行可在 Outlook 面板的“我的快捷方式”组中添加一个指向 MSDN 的快捷方式:
ActiveExplorer.Panes.Item("OutlookBar").Contents.Groups _
.Item("我的快捷方式").Shortcuts _
.Add "http://msdn.microsoft.com", "MSDN"
使用视图通过视图对象可以创建自定义的视图,以帮助您排序、分组和查看所有不同类型的数据。视图的类型有多种:
表视图类型 (olTableView) 通过简单的字段表来查看数据。 日历视图类型 (olCalendarView) 通过日历格式来查看数据。 卡视图类型 (olCardView) 通过一系列卡片来查看数据。每张卡都显示项目所包含的信息,并且可以排序。 图标视图类型 (olIconView) 通过图标来查看数据,类似于 Windows 文件夹或浏览器。 时间线视图类型 (olTimelineView) 通过可自定义的线性时间线按照数据接收的顺序来查看数据。 可以使用 View 对象的 XML 属性来定义和自定义视图。XML 属性允许您返回或设置自定义的 XML 定义,该定义可确定视图的各个特性。XML 定义通过一系列标记和关键字(对应于视图本身的各个属性)来描述视图。下面的示例创建了一个新的“收件箱”文件夹视图,使用了 View 对象的 XML 属性,并将该视图的 XML 定义显示在 Visual Basic 编辑器的“立即”窗口中。
Sub XMLView()
' 创建新视图并在“立即”窗口中
' 显示 XML 定义。
Dim olApp As Outlook.Application
Dim objViews As Views
Dim objView As View
Set olApp = Outlook.Application
Set objViews = _
olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Views
Set objView = objViews.Add _
("新的表视图", olTableView, _
olViewSaveOptionAllFoldersOfType)
Debug.Print objView.XML
End Sub
下面是显示在 Visual Basic 编辑器“立即”窗口中的 XML 定义:
图 2:“收件箱”文件夹视图的 XML 定义(单击图像以查看大图片)
了解 Outlook 窗体为 Outlook 解决方案开发自定义的用户界面时,可以使用两种窗体。一种是在 VBA 环境中用 VBA 编程语言创建的 UserForm。另一种是自定义的 Outlook 窗体,允许您自定义其中一个内置的 Outlook 窗体(如“联系人”窗体),但需要在 Outlook 脚本编辑器中使用 VBScript 编程语言。
使用 UserFormUserForm 最适合创建不需要显示内置 Outlook 项目功能的自定义窗体。通过 UserForm 可以创建自己的窗体,并使用窗体设计器向窗体中添加各种控件。然后可以为窗体添加 VBA 代码以响应各种事件。图 3 所示为 Visual Basic 编辑器中用于创建 UserForm 的各种组件。要创建 UserForm:
打开 Visual Basic 编辑器 (ALT+F11)。 在“插入”菜单上单击“UserForm”。 在“视图”菜单上,单击“工具箱”以显示基本的内部控件。 根据需要添加控件并设置其属性。 在“视图”菜单上,单击“代码”打开代码窗口,并根据需要为窗体和控件的事件编写代码。 注意:UserForm 及其相关编程代码都保存在您本地计算机的 VbaProject.OTM 文件中。
图 3:Visual Basic 编辑器中的窗体设计器(单击图像以查看大图片)
使用 Outlook 窗体创建自定义 Outlook 窗体与创建 UserForm 的过程大不相同。对于自定义 Outlook 窗体,可以从现有的 Outlook 窗体(如联系人、约会或任务窗体)开始创建。然后根据需要使用 Outlook 窗体设计器修改现有窗体,包括添加自定义字段以存储自定义信息。您可以自定义标准窗体,或基于标准窗体创建新窗体。要创建新的自定义 Outlook 窗体:
在 Outlook 中,在菜单中依次单击“工具”|“窗体”|“设计窗体”。显示“设计窗体”对话框,如图 4 所示。
图 4:“设计窗体”对话框
在“设计窗体”对话框中,选择要自定义的窗体类型,然后单击“打开”。显示窗体的设计模式,如图 5 所示。
图 5:设计模式下的“联系人”窗体(单击图像以查看大图片)
在设计模式中打开窗体之后,即可进行修改,例如:
使用“字段选择器”添加额外字段。 更改现有字段的位置。 删除现有字段。 添加自定义字段。 添加新控件,例如复选框、列表框和命令按钮。 更改控件的 Tab 键切换顺序。 在窗体中启用新页面,并给出自定义名称。 更改默认属性。 更改或添加新的操作。 如前面所述,Outlook 窗体与 UserForm 的一个重要差别就是使用 VBScript 编程语言来自动化窗体的各个方面。Outlook 具有一个内置的 VBScript 编辑器,可通过单击“窗体”菜单上的“查看代码”来打开。图 6 所示即为 Outlook 脚本编辑器:
图 6:Outlook 脚本编辑器
进入 Outlook 脚本编辑器之后,便可以创建 VBScript 函数和过程,与窗体和 Outlook 对象模型进行交互。另外,您可以使用“插入事件处理器”对话框为标准事件输入函数声明,这些事件与您正在自定义的特定类型窗体相关。要插入事件处理器:
在菜单中依次单击“Outlook 脚本编辑器”|“脚本”|“事件处理器”。显示“插入事件处理器”对话框,如图 7 所示。 单击要为其编写代码的事件,然后单击“添加”将函数声明插入到 Outlook 脚本编辑器中。
图 7:“插入事件处理器”对话框
完成对窗体的更改之后,便可将其另存为 Outlook 模板文件 (*.oft),或将窗体发布到个人窗体库或组织窗体库中。
对自定义 Outlook 窗体过程的完整描述超出了本文的范围。有关详细信息,请参阅 Microsoft 出版社出版的 Building Applications with Microsoft Outlook 2002(英文)。
发布 Outlook 解决方案如果发布并非由 Outlook 创建的 Outlook 解决方案,则需确保接收方的计算机安装有正确的 Outlook 许可版本。另外,还可以使用“打包和展开”向导、Microsoft Visual Studio® 安装程序或其他类型的软件发布工具。
如果发布的 Outlook 解决方案完全是在 Outlook 中使用 VBA 创建的,则应注意 Outlook 只支持一个 VBA 项目。此项目仅与一个用户和一个运行中的 Outlook 实例相关联。Outlook 不支持将 VBA 代码与单个 Outlook 项目相关联(可以使用 VBScript 来编写与单个 Outlook 项目关联的代码)。覆盖计算机上的 VbaProject.OTM 文件会破坏文件以前的内容。单个 Outlook VBA 项目文件 VbaProject.OTM 位于下列文件夹之一:
如果使用 Microsoft Windows NT® 之前的 Microsoft Windows® 版本,并且为多个用户建立了用户配置文件,则 VbaProject.OTM 将位于 C:\Windows\Profiles\UserName\Application Data\Microsoft\Outlook 文件夹中。如果尚未建立用户配置文件,VbaProject.OTM 将位于 C:\Windows\Application Data\Microsoft\Outlook 文件夹中。 如果使用 Windows NT 或更新的版本,VbaProject.OTM 将位于 C:\Documents and Settings\UserName\Application Data\Microsoft\Outlook 文件夹中。 发布基于 VBA 的 Outlook 解决方案的更好方法是使用组件对象模型 (COM) 插件。有关创建 COM 插件的详细信息,请参阅 Microsoft 知识库中的文章 HOW TO: Create Office COM Add-Ins by Using VBA and Office Developer(英文)。
如果发布附加了 VBScript 的单个 Outlook 项目,可将 Outlook 项目另存为 Outlook 模板文件 (*.oft),然后如同发布任何其他类型文件一样进行发布。如果使用 Microsoft Exchange Server,还可以将 Outlook 模板文件保存在组织窗体库中,以便更容易地在您的组织中访问它们。
总结本文讨论了一些创建 Outlook 解决方案时的基本技术问题。创建 Outlook 解决方案时,可以配合使用编程代码和 Outlook 对象模型:VBA 与 UserForm,VBScript 编程代码与自定义 Outlook 窗体。开发自定义的 Outlook 解决方案之后,用于部署该方案的方法就取决于您组织的需要了。
其他资源有关用于开发 Outlook 解决方案的技术的详细信息,请访问以下 Web 资源:
Outlook Product Page(英文) Office Developer Center(英文) Exchange Developer Center(英文) Windows Script Developer Center(英文) Visual Basic for Applications Home Page(英文)