第23章ASP、CDO与 Exchange Server 在上一章里,讲述了协作数据对象(CDO)的发展,特别研究了 CDONTS库及其使用。但 是 CDONTS库的功能有一定的限制。因此为了m了 提供更强大、复杂的消息应用程序,需要进一步C 学习CDO库。由于 CDONTS库是CDO库的子集 进一步学习CDO理所当然会给开发者提供更多 的编程能力 本章将介绍 CDO的对象模型 CDO与 CDONTS的不同 ·使用CDO库创建一个邮件客户应用程序。 23.1CDO库 CDO实际上提供了两个独立的库 LAiwu ·CDO库:提供用来发送和接收消息以及编 程访问和操作地址簿和文件夹的对象 CDO Rendering库:提供了这样一个对象 集合,能够把CDO对象转换成HIML格式, 从而使在浏览器上显示这些对象变得比较 容易 从本书的目的出发,注重介绍CDO库, 只简要介绍一下 CDO Rendering库 首先,像介绍 CDONTS时一样,看一下 CDO对象库的结构,如图23-1所示。 正如所看到的,CDO库比 CDONTS包含了 ineson 更多的对象,一些与 CDONTS共同的对象具有 更丰富的属性和功能。本书不对所有这些对象的 细节做深入研究,这超出了本书的范围。实际上 本书将深入研究其中的某些对象,对于其它的只 在一个较高的层次上浏览一下 23.1.1通用/共享对象 正如从图23-1中看到的,有几个属于多个父 对象的对象和集合。关于CDO库的讨论将从分 图23-1CDO对象库的结构
下载 第23章 A S P、C D O与Exchange Server 在上一章里,讲述了协作数据对象 ( C D O )的发展,特别研究了 C D O N T S库及其使用。但 是C D O N T S库的功能有一定的限制。因此为了 提供更强大、复杂的消息应用程序,需要进一步 学习C D O库。由于C D O N T S库是C D O库的子集, 进一步学习 C D O理所当然会给开发者提供更多 的编程能力。 本章将介绍: • CDO的对象模型。 • CDO与C D O N T S的不同。 • 使用C D O库创建一个邮件客户应用程序。 23.1 CDO库 C D O实际上提供了两个独立的库: • C D O库:提供用来发送和接收消息以及编 程访问和操作地址簿和文件夹的对象。 • CDO Rendering库:提供了这样一个对象 集合,能够把C D O对象转换成H T M L格式, 从而使在浏览器上显示这些对象变得比较 容易。 从本书的目的出发,注重介绍 C D O库, 只简要介绍一下CDO Rendering库。 首先,像介绍 C D O N T S时一样,看一下 C D O对象库的结构,如图2 3 - 1所示。 正如所看到的, C D O库比C D O N T S包含了 更多的对象,一些与 C D O N T S共同的对象具有 更丰富的属性和功能。本书不对所有这些对象的 细节做深入研究,这超出了本书的范围。实际上, 本书将深入研究其中的某些对象,对于其它的只 在一个较高的层次上浏览一下。 23.1.1 通用/共享对象 正如从图2 3 - 1中看到的,有几个属于多个父 对象的对象和集合。关于 C D O库的讨论将从分 图23-1 CDO对象库的结构
hina" coM ms AS,, CDO Ending smr 685 载 析这些通用/共享对象开始。如果一个对象根据其父对象的不同,具有不同的用法或属性,则 在介绍父对象时会给出相应的解释 ments集合 Attachments集合是具有零个或更多附件的集合,由 AppointmentItem对象、 Meetingltem对 象和 Message对象提供 Attachments集合提供了两个属性,如表23-1所示 表23-1 Attachments集合的属性及说明 属性 Count Item(index) 返回集合中索引为 index的附件项目 像 CDONTS一样,此集合也支持使用 For each等ⅤB(或 VBScrip)语句。 Attachments集合也提供了一个Add和一个 Delete方法。 Delete方法会删除集合中所有的项 目,要谨慎使用。如果想从集合中删除一个附件,应当使用 Attachment对象的 Delete方法。删 除会立即执行且不能撤消。 Delete方法不使用参数,只需这样简单地使用: colAttachments. Delete( Ad方法稍微复杂一点,有四个参数 Set objAttachment colAttachments Add( name] [, position] [ type] [ 其参数和说明如表23-2所示。 表232Add方法的参数及说明 说明 Name 选,附件的标题/显示名 可选,附件在消息主体内出现的字符位置 可选,附件的类型,可以是 CdoFileData(1)、 Cdo filelink(2) DooLe(3)Fl Cdo EmbeddedMessage(4) Source 可选,包含附件数据的文件的完全限定路径 例如,如果想添加一个 Excel文件( (inventory Report. xls)作为一个标题为“ Inventory Report 的消息附件,代码可以这样写: Set objAttachment colAttachments Add("Inventory Report,0,& leData, 'C: \Inventory. xIs") 需要添加一个附件到集合中去时,既可以在Add方法中定义所有的信息,也可以在产生的 Attachment对象上设置属性。下面将讨论 Attachment对象本身,并看一下如何用此对象的属性 添加一个附件 Attachment对象 个 Attachment对象代表一个 Message、 Meetingltem或 AppointmentItem对象的单个附件 这些附件可以是文件、OLE对象或其他的 Message对象 Attachment对象的属性及说明如表23-3所示
析这些通用/共享对象开始。如果一个对象根据其父对象的不同,具有不同的用法或属性,则 在介绍父对象时会给出相应的解释。 1. Attachments集合 A t t a c h m e n t s集合是具有零个或更多附件的集合,由 A p p o i n t m e n t I t e m对象、M e e t i n g I t e m对 象和M e s s a g e对象提供。 A t t a c h m e n t s集合提供了两个属性,如表 2 3 - 1所示。 表23-1 Attachments集合的属性及说明 属 性 说 明 C o u n t 返回集合的项目数 I t e m (i n d e x) 返回集合中索引为i n d e x的附件项目 像C D O N T S一样,此集合也支持使用For Each等V B (或V B S c r i p t )语句。 A t t a c h m e n t s集合也提供了一个A d d和一个D e l e t e方法。D e l e t e方法会删除集合中所有的项 目,要谨慎使用。如果想从集合中删除一个附件,应当使用 A t t a c h m e n t对象的D e l e t e方法。删 除会立即执行且不能撤消。 D e l e t e方法不使用参数,只需这样简单地使用: A d d方法稍微复杂一点,有四个参数: 其参数和说明如表2 3 - 2所示。 表23-2 Add方法的参数及说明 参 数 说 明 N a m e 可选,附件的标题/显示名 P o s i t i o n 可选,附件在消息主体内出现的字符位置 Ty p e 可选,附件的类型,可以是C d o F i l e D a t a ( 1 )、Cdo FileLink (2)、 CdoOle(3)和 CdoEmbeddedMessage(4) S o u r c e 可选,包含附件数据的文件的完全限定路径 例如,如果想添加一个E x c e l文件( i n v e n t o r y R e p o r t . x l s )作为一个标题为“Inventory Report” 的消息附件,代码可以这样写: 需要添加一个附件到集合中去时,既可以在 A d d方法中定义所有的信息,也可以在产生的 A t t a c h m e n t对象上设置属性。下面将讨论 A t t a c h m e n t对象本身,并看一下如何用此对象的属性 添加一个附件。 A t t a c h m e n t对象 一个A t t a c h m e n t对象代表一个M e s s a g e、M e e t i n g I t e m或A p p o i n t m e n t I t e m对象的单个附件。 这些附件可以是文件、O L E对象或其他的M e s s a g e对象。 A t t a c h m e n t对象的属性及说明如表2 3 - 3所示。 第2 3章 A S P、C D O与Exchange Serv e r计计685 下载
686Ap3高编程 Chinapub.com 下载 表23-3 Attachment对象的属性及说明 返回与 Attachment对象关联的字段的一个集合 返回在 Attachments集合之内当前 Attachment对象的索引位置 设置或返回附件的标题/显示名 设置或返回附件在消息主体内的字符位置 Source 设置或返回包含附件数据的文件的完全限定路径 设置或返回附件的类型,可以是: CdoFile Data、 CdoFilelink、 DooLe和 CdoEmbeddedMessage 注意到在 Attachments集合的Add方法中的参数映射到 Attachment对象的属性中。 上面看到如何用Add方法通过定义所有的信息来添加一个附件。下面是利用 Attachment对 象的属性添加一个附件的程序 Set objAttachment colAttachments Add with objAttachment Inventory Report Position 0 Type CdoFileData Source = 'C: \Inventory Report. xl End with bjcurMessage. Update 注意到在 Message对象上调用了 Update方法。这是为了提交 Attachments属性的变动 2. Fields集合 Fields集合是一个或多个 Field对象的集合。与 Attachments集合相同, Fields集合也有 Count属性、Item属性、Add方法和 Delete方法。这些属性与 Delete方法在功能上与 Attachments 集合中的一样。 然而,但Add方法的参数列表不同: Set objField s ob3Fieldscoll Add(name, Class [ value] [, PrapsetID] 其参数和说明如表23-4所示。 表23-4Add方法的参数及说明 参数 可选,一个定制的MAP属性的名称 Class Field对象的数据类型。可以是表23-5列出的值中的一个 「选,MAP属性的值 PropsetID 可选,MAP属性组的唯一的ID。与 Fields对象的ID相似 表23-5 Class属性的可能值 CoaRray 912(&H2000) 65(&H41) Cdoboolean frency Cdo Dataobject
686计计ASP 3 高级编程 下载 表23-3 Attachment对象的属性及说明 属 性 说 明 F i e l d s 返回与A t t a c h m e n t对象关联的字段的一个集合 I n d e x 返回在A t t a c h m e n t s集合之内当前A t t a c h m e n t对象的索引位置 N a m e 设置或返回附件的标题/显示名 P o s i t i o n 设置或返回附件在消息主体内的字符位置 S o u r c e 设置或返回包含附件数据的文件的完全限定路径 Ty p e 设置或返回附件的类型,可以是: C d o F i l e D a t a、C d o F i l e L i n k、C d o O l e和 C d o E m b e d d e d M e s s a g e 注意到在A t t a c h m e n t s集合的A d d方法中的参数映射到A t t a c h m e n t对象的属性中。 上面看到如何用A d d方法通过定义所有的信息来添加一个附件。下面是利用 A t t a c h m e n t对 象的属性添加一个附件的程序: 注意到在M e s s a g e对象上调用了U p d a t e方法。这是为了提交A t t a c h m e n t s属性的变动。 2. Fields集合 F i e l d s集合是一个或多个 F i e l d对象的集合。与 A t t a c h m e n t s集合相同, F i e l d s集合也有 C o u n t属性、I t e m属性、A d d方法和D e l e t e方法。这些属性与D e l e t e方法在功能上与A t t a c h m e n t s 集合中的一样。 然而,但A d d方法的参数列表不同: 其参数和说明如表2 3 - 4所示。 表23-4 Add方法的参数及说明 参 数 说 明 N a m e 可选,一个定制的M A P I属性的名称 C l a s s F i e l d对象的数据类型。可以是表 2 3 - 5列出的值中的一个 Va l u e 可选,M A P I属性的值 P r o p s e t I D 可选,M A P I属性组的唯一的I D。与F i e l d s对象的I D相似 表23-5 Class属性的可能值 名 称 值 C d o A r r a y 8 9 1 2 ( & H 2 0 0 0 ) C d o B l o b 6 5 ( & H 4 1 ) C d o B o o l e a n 11 C d o C u r r e n c y 6 C d o D a t a O b j e c t 1 3
687 下载 第23章ASP、CDO与 Exchange Server CdoDouble CdoEmpty Cdolnteger Oolong 750231 Cdosinglo 除有普通的集合方法外, Fields集合还有可以定义缺省MAP属性组的方法。 MAPI属性组是一个命名的属性集合,不同的组具有不同的名字 SetNamespace方法允许定义缺省使用的属性组(名字空间)。此方法的语法如下: objFieldscoll. SetNamespace(PropsetID) 当访问一个命名的属性时,此属性是在一个属性组内的。所有在一个属性组内的命名的 属性的集合称为名字空间( Namespace) 当在缺省的 Namespace内添加一个属性时,调用Add方法时就不必再指定 PropsetID。 SetNamespace方法允许指定缺省的 Namespace。在再次调用 SetNamespace方法之前,对缺 省 Namespace的任何变化都将保持有效。 因此,如果想创建一个名为 Display Name、存储字符串值的MAPI属性,代码如下 objField colFields Add('Display Name, cdostring 在这种情况下,省略了Vaue和 PropsetID参数。这样做,“ Display Name”字段的值在缺 省的 Namespace内被设置为一个空字符串 Field对象 Field对象代表CDO库中的许多MAP属性中的一个 MAPI属性是一个描述关于消息的某些方面的属性:例如,消息的发送地址、消息的主题 行和消息的发送时间等。 除显示缺省的MAPI属性之外, Field对象也允许访问定制的MAPI属性。 Field对象的属性及说明如表23-6所示 表23-6Fied对象的属性及说明 返回Feld对象代表的MAPI属性的唯一的ID Index 返回Feld对象在 Fields集合中的索引位置 返回字段的名称 返回对象包含的数据类型 Value 置或返回字段及其下层MAPI属性的值 ID属性是一个32位的整数,既包括MAP属性的标识符又有属性类型信息,高16
(续) 名 称 值 C d o d a t e 7 C d o D o u b l e 5 C d o E m p t y 0 C d o I n t e g e r 2 C d o L o n g 3 C d o N u l l 1 C d o S i n g l e 4 C d o S t r i n g 8 除有普通的集合方法外,F i e l d s集合还有可以定义缺省M A P I属性组的方法。 M A P I属性组是一个命名的属性集合,不同的组具有不同的名字。 S e t N a m e s p a c e方法允许定义缺省使用的属性组 (名字空间)。此方法的语法如下: 当访问一个命名的属性时,此属性是在一个属性组内的。所有在一个属性组内的命名的 属性的集合称为名字空间( N a m e s p a c e )。 当在缺省的 N a m e s p a c e内添加一个属性时,调用 A d d方法时就不必再指定 P r o p s e t I D。 S e t N a m e s p a c e方法允许指定缺省的N a m e s p a c e。在再次调用S e t N a m e s p a c e方法之前,对缺 省N a m e s p a c e的任何变化都将保持有效。 因此,如果想创建一个名为 Display Name、存储字符串值的M A P I属性,代码如下: 在这种情况下,省略了 Va l u e和P r o p s e t I D参数。这样做,“Display Name”字段的值在缺 省的N a m e s p a c e内被设置为一个空字符串。 F i e l d对象 F i e l d对象代表C D O库中的许多M A P I属性中的一个。 M A P I属性是一个描述关于消息的某些方面的属性:例如,消息的发送地址、消息的主题 行和消息的发送时间等。 除显示缺省的M A P I属性之外,F i e l d对象也允许访问定制的M A P I属性。 F i e l d对象的属性及说明如表2 3 - 6所示。 表23-6 Field对象的属性及说明 属 性 说 明 I D 返回F i e l d对象代表的M A P I属性的唯一的I D I n d e x 返回F i e l d对象在F i e l d s集合中的索引位置 N a m e 返回字段的名称 Ty p e 返回对象包含的数据类型 Va l u e 设置或返回字段及其下层 MAPI 属性的值 I D属性是一个3 2位的整数,既包括M A P I属性的标识符又有属性类型信息,高 1 6 第2 3章 A S P、C D O与Exchange Serv e r计计687 下载
688:3商编程 下载 位定义属性标识符,低16位定义了属性类型(二进制、整型等 Ficd对象还包括三个方法: Delete.ReadFromFilei和 Write Toile,如表237所示。 表23-7Feld对象的方法及说明 方法 说明 从 Fields集合中删除当前的字段对象 Read From File 从指定的文件加载Fed对象的值 Write RoFile 把Fied对象的值写入一个文件。如果此文件存在数据,将被当前的数据覆盖 两个访问文件的方法的语法很相似 objField. ReadFromFile(fileName) fileName是从中读取 Field对象值的文件的完全限定路径。 objField. WriteToFile(fileName) 同样, FileName是写入 Field对象值的文件的完全限定路径。 3. Recipients集合 Recipients集合是零个或更多 Recipient对象的集合。这个集合用来指定预定的Mail对象收 件人。就像 Fields集合和 Attachments集合一样, Recipients集合也有 Count属性、Item属性和 Delete方法。 Add方法的语法如下 et obj Recipient objRecipColl Add( [name] [ address] [ type] [ entryID] 其参数和说明如表23-8所示。 表238Add方法的参数及说明 Name 可选,收件人的显示/友好名字 Address 可选,收件人的完全限定的消息地址 可选,收件人的类型。可为以下三值: DotO(1)、 CdcC(2)和 Cofco(3) EntryID 可选,收件人的 Address Entry对象的唯一ID Name、 Address和Type参数与 Recipient对象的Name、 Address和Type属性一样。如果没有 指定参数,创建的 Recipient对象是空值。以下例子代码向To、CC、BCC收件人添加一条信 objMsg.Recipients.Add(Jeanie",CdoTO,"Jeanie@Anywhere.com") objmsg.Recipients.Add('jeaniesboss",Cdocc,jeaniesboss@anywhere.com objMsg.Recipients.Add(Jack,CdoBCC,Jack@Anywhere.com) Recipients集合还提供了 Addmultiple方法,能够在集合中创建多个 Recipient对象 语法如下 collRecipients. AddMultiple( names [ type] 其参数和说明如表23-9所示 表23-9 AddMultiple方法的参数及说明 Names 收件人列表,由“;”分开 可选,收件人的类型,可为 Doto、 Cdcc和 Cdobcc
688计计ASP 3 高级编程 下载 位定义属性标识符,低1 6位定义了属性类型(二进制、整型等)。 F i e l d对象还包括三个方法:D e l e t e、R e a d F r o m F i l e和Wr i t e To F i l e,如表2 3 - 7所示。 表23-7 Field对象的方法及说明 方 法 说 明 D e l e t e 从F i e l d s集合中删除当前的字段对象 R e a d F r o m F i l e 从指定的文件加载F i e l d对象的值 Wr i t e To F i l e 把F i e l d对象的值写入一个文件。如果此文件存在数据,将被当前的数据覆盖 两个访问文件的方法的语法很相似: f i l e N a m e是从中读取F i e l d对象值的文件的完全限定路径。 同样,Fi l e N a m e是写入F i e l d对象值的文件的完全限定路径。 3. Recipients集合 R e c i p i e n t s集合是零个或更多 R e c i p i e n t对象的集合。这个集合用来指定预定的 M a i l对象收 件人。就像Fi e l d s集合和A t t a t c h m e n t s集合一样,R e c i p i e n t s集合也有C o u n t属性、I t e m属性和 D e l e t e方法。 A d d方法的语法如下: 其参数和说明如表2 3 - 8所示。 表23-8 Add方法的参数及说明 参 数 说 明 N a m e 可选,收件人的显示/友好名字 A d d r e s s 可选,收件人的完全限定的消息地址 Ty p e 可选,收件人的类型。可为以下三值: C d o To ( 1 )、C d o C C ( 2 )和C d o B C C ( 3 ) E n t r y I D 可选,收件人的A d d r e s s E n t r y对象的唯一I D N a m e、A d d r e s s和Ty p e参数与R e c i p i e n t对象的N a m e、A d d r e s s和Ty p e属性一样。如果没有 指定参数,创建的 R e c i p i e n t对象是空值。以下例子代码向 To、C C、B C C收件人添加一条信 息: R e c i p i e n t s集合还提供了A d d M u l t i p l e方法,能够在集合中创建多个 R e c i p i e n t对象。 语法如下: 其参数和说明如表2 3 - 9所示。 表23-9 AddMultiple方法的参数及说明 参 数 说 明 N a m e s 收件人列表,由“;”分开 Type 可选,收件人的类型,可为 C d o To、C d o C C和C d o B C C
Chinapub.comm244s9.cDOerTangesoner689 载 注意不能用 AddMutiple方法同时添加多于一种类型的收件人。 如果想要添加两个收件人到To列表,三个收件人到CC列表,就需要用类似以下的代码 colRecipients. Add('JeanieeAnywhere. Com; JeaniesBoss @Anywhere. Com., cdoTo) colRecipeints.Add("JackGNoWhereCom:Jill@Nowhere.Com;Jeanie@Nowhere.Com CDO提供了友好的或可解析的地址,而不使用完全限定的消息地址。例如,可以指定友 好名称“ Jeanie”来代替“ Jeanie@ Any Where,com”。为了把这些地址解析成消息地址 Recipients集合提供了 Resolve方法。执行 Resolve方法时将遍历整个 Recipients集合并尝试把每 个收件人地址解析为消息地址。任何不能解析出的地址作为不可解析的地址留下来。在企图 发送一个带有不可解析的地址的消息时,产生错误 虽然这个方法的文档显示一个可选参数用来定义是否显示一个对话框,但是当 应用程序在ASP中运行时,不允许对话框。因此就ASP程序而言,这个方法没有有效 的参数 excipients集合还提供了两个方法对不可解析的收件人对象进行操作 Get FirstUnresolved方法返回的 Recipients对象是第一个不可解析的 Recipients对象。如果 没有不可解析的 Recipients对象,它返回 Nothing GetNextUnresolved方法返回的 Recipients对象是下一个不可解析的 Recipients对象。当没 有余下的不可解析的 Recipients对象时,它返回 nothing. 另外, Recipients集合提供了一个 GetFree Busy方法,返回一个字符串,这个字符串能指示 出集合中所有收件人的空闲/忙碌时间。这是在特定时间范围内收件人组的有效性组合。 此方法的语法如下 strAvail= colRecipients GetFreeBusy (StartTime, EndTime, Interval) 其参数和说明如表23-10所示。 表23-10 GetFreeBusy方法的参数及说明 第一个时隙的日期和时间 最后一个时隙的日期和时间 每个时隙的分钟数 如果想要知道从上午9时到下午2时之间,以一小时为时隙会议收件人的有效性 ( availability),代码应这样写 trAvail colRecipients GetFreeBusy(1/1/1999 09: 00.,.1/1/1999 14: 00',60) 结果字符串的长度与 StartTime与 EndTime之间的间隔数目相等。字符串中的每个位置都 有一个表示收件人有效性的值,此处可能的值如表23-11所示。 表23-11字符串中可能的值及其代表的有效性 Cofree(o) 此时隙内有效 Cdo Tentative(l) 此时隙内收件人中至少一个有一个不确定的约会 CdoBusy(2 此时隙内收件人中至少一个有一个确定的约会 CdoOutOfoffice(3 此时隙内收件人中至少有一个不在
第2 3章 A S P、C D O与Exchange Serv e r计计689 下载 注意不能用A d d M u t i p l e方法同时添加多于一种类型的收件人。 如果想要添加两个收件人到To列表,三个收件人到CC列表,就需要用类似以下的代码: C D O提供了友好的或可解析的地址,而不使用完全限定的消息地址。例如,可以指定友 好名称“ J e a n i e”来代替“ J e a n i e @ A n y W h e r e . c o m”。为了把这些地址解析成消息地址, R e c i p i e n t s集合提供了R e s o l v e方法。执行R e s o l v e方法时将遍历整个R e c i p i e n t s集合并尝试把每 个收件人地址解析为消息地址。任何不能解析出的地址作为不可解析的地址留下来。在企图 发送一个带有不可解析的地址的消息时,产生错误。 虽然这个方法的文档显示一个可选参数用来定义是否显示一个对话框,但是当 应用程序在A S P中运行时,不允许对话框。因此就 A S P程序而言,这个方法没有有效 的参数。 R e c i p i e n t s集合还提供了两个方法对不可解析的收件人对象进行操作: • G e t F i r s t U n r e s o l v e d方法返回的R e c i p i e n t s对象是第一个不可解析的 R e c i p i e n t s对象。如果 没有不可解析的R e c i p i e n t s对象,它返回N o t h i n g。 • G e t N e x t U n r e s o l v e d方法返回的R e c i p i e n t s对象是下一个不可解析的 R e c i p i e n t s对象。当没 有余下的不可解析的R e c i p i e n t s对象时,它返回N o t h i n g。 另外,R e c i p i e n t s集合提供了一个G e t F r e e B u s y方法,返回一个字符串,这个字符串能指示 出集合中所有收件人的空闲/忙碌时间。这是在特定时间范围内收件人组的有效性组合。 此方法的语法如下: 其参数和说明如表2 3 - 1 0所示。 表23-10 GetFreeBusy方法的参数及说明 参 数 说 明 S t a r t Ti m e 第一个时隙的日期和时间 E n d Ti m e 最后一个时隙的日期和时间 I n t e r v a l 每个时隙的分钟数 如果想要知道从上午 9 时到下午 2时之间,以一小时为时隙会议收件人的有效性 ( a v a i l a b i l i t y ),代码应这样写: 结果字符串的长度与 S t a r t Ti m e与E n d Ti m e之间的间隔数目相等。字符串中的每个位置都 有一个表示收件人有效性的值,此处可能的值如表 2 3 - 11所示。 表2 3 - 11 字符串中可能的值及其代表的有效性 值 有效性 C d o F r e e ( 0 ) 此时隙内有效 C d o Te n t a t i v e ( 1 ) 此时隙内收件人中至少一个有一个不确定的约会 C d o B u s y ( 2 ) 此时隙内收件人中至少一个有一个确定的约会 C d o O u t O f O ff i c e ( 3 ) 此时隙内收件人中至少有一个不在
69053商级编程 Chinaopub coM 下载 当两个收件人在一个特定的时隙内有不同级别的约会时,将报告其中较高级别者。如果 个收件人有不确定的约会而另一个不在,有效性将为 Cdooutofoffice Recipient对象 Recipient对象代表了 Message对象中的单个收件人 Recipient对象具有表23-12所示的属性 表23-12 Recipient对象的属性及说明 收件人的完整消息地址 Addresss Entry 回代表收件人的 Address Entry对象(后面将详细说明) Ambiguous Names 当不能解析地址时返回可能的地址集合 回收件人的显示类型 回MAPI产生的收件人唯一ID 返回 Recipient对象在 Recipients集合中的索引位置 返回和设置收件人对会见邀请的响应 返回和设置 Recipient对象的名称 返回和设置收件人的类型,其值为 DotO、 Coco和 Cosco中的一个 Display Type参数可能的值如表23-13所示 表23-13 Display Type参数可能的值及说明 Clouser(o) 本地系统中的一个用户 CdoDistlist(1) 公共分发列表 CdoForum(2 开放论坛,通常为一个新闻组或公共文件夹 自动代理 CdoOrganization( 4) 表示一个大的组,诸如技术支持 CdoPrivate DistList(5) 私人分发列表 CdoRemoteUser(6) 远程系统中的一个用户 MeetingResponse Status参数可能的值如表23-14所示。 表23-14 Meeting Response Status参数可能的值及说明 CdoResponseNone(o) 收件人没有响应(由 Outlook使 CdoResponse Organized(1) 收件人没有响应(由 Schedule+使用) 收件人不确定接受请求 收件人确定接受请求 CdoResponse Declined(4) 收件人拒绝请求 CdoResponseNotResponded (5) 收件人没有响应 Recipient对象具有四个方法 · Delete。 Get Free busy Delete方法能立即永久地在 Recipients集合中删除 Recipient对象
690计计ASP 3 高级编程 下载 当两个收件人在一个特定的时隙内有不同级别的约会时,将报告其中较高级别者。如果 一个收件人有不确定的约会而另一个不在,有效性将为 C d o O u t O f O ff i c e。 R e c i p i e n t对象 R e c i p i e n t对象代表了M e s s a g e对象中的单个收件人。 R e c i p i e n t对象具有表2 3 - 1 2所示的属性。 表23-12 Recipient对象的属性及说明 属 性 说 明 A d d r e s s 收件人的完整消息地址 A d d r e s s s E n t r y 返回代表收件人的A d d r e s s E n t r y对象(后面将详细说明) A m b i g u o u s N a m e s 当不能解析地址时返回可能的地址集合 D i s p l a y Ty p e 返回收件人的显示类型 I D 返回M A P I产生的收件人唯一I D I n d e x 返回R e c i p i e n t对象在R e c i p i e n t s集合中的索引位置 M e e t i n g R e s p o n s e S t a t u s 返回和设置收件人对会见邀请的响应 N a m e 返回和设置R e c i p i e n t对象的名称 Ty p e 返回和设置收件人的类型,其值为 C d o To、C d o C C和C d o B C C中的一个 D i s p l a y Ty p e参数可能的值如表2 3 - 1 3所示。 表23-13 DisplayTy p e参数可能的值及说明 值 说 明 C d o U s e r ( 0 ) 本地系统中的一个用户 C d o D i s t L i s t ( 1 ) 公共分发列表 C d o F o r u m ( 2 ) 开放论坛,通常为一个新闻组或公共文件夹 C d o A g e n t ( 3 ) 自动代理 C d o O rg a n i z a t i o n ( 4 ) 表示一个大的组,诸如技术支持 C d o P r i v a t e D i s t L i s t ( 5 ) 私人分发列表 C d o R e m o t e U s e r ( 6 ) 远程系统中的一个用户 M e e t i n g R e s p o n s e S t a t u s参数可能的值如表2 3 - 1 4所示。 表23-14 MeetingResponseStatus参数可能的值及说明 值 说 明 C d o R e s p o n s e N o n e ( 0 ) 收件人没有响应(由O u t l o o k使用) C d o R e s p o n s e O rg a n i z e d ( 1 ) 收件人没有响应(由S c h e d u l e +使用) C d o R e s p o n s e Te n t a t i v e ( 2 ) 收件人不确定接受请求 C d o R e s p o n s e A c c e p t e d ( 3 ) 收件人确定接受请求 C d o R e s p o n s e D e c l i n e d ( 4 ) 收件人拒绝请求 C d o R e s p o n s e N o t R e s p o n d e d ( 5 ) 收件人没有响应 R e c i p i e n t对象具有四个方法: • Delete。 • GetFreeBusy。 • IsSameAs。 • Resolve。 D e l e t e方法能立即永久地在R e c i p i e n t s集合中删除R e c i p i e n t对象
691 载 第23章ASP、CDO与 Exchange Server GetFreeBusy方法与 Recipients集合中的 GetFreeBusy方法相似,但只能得到当前对象的有 如果一条消息有多个收件人而又想检查重复,可以用 Is Sameas方法检查一下是否有两个 或两个以上的收件人的地址相同。 Is sameas方法的语法如下 objRecipient. IssameAs(objRecip2 此处的 objRecip2参数是一个 Recipient对象,它与 objrecipient相比较。这个方法只有在两 个对象都代表同一消息系统中的一个永久对象时返回True。两个有相同值的收件人对象,如 果它们不能建立同一个物理对象就可以看作不同。因此,如果一个对象是另一个的拷贝,那 么 Is SameAs返回 False 最后, Recipient对象中的 Resolve方法与 Recipients集合中的 Resolve方法的工作方式相同 但它只解析当前的 Recipient对象的地址。 再次重申,虽然这个方法的文档显示一个可选参数用来定义是否显示一个对话 框,但是当应用程序在ASP中运行时,不允许对话框,也没有用户界面。 4. Addressentries集合 Addressentries集合是包括零或更多的 Address Entry对象的集合。 Address entries集合具有表23-15所示的属性。 表23-15 Addressentries集合的属性及说明 属性 返回集合中项目的数量 设置和返回集合的 Address Entry Filter对象 Item(indexs searchvalue) 从集合中返回一个 Address Entry条目 在后面介绍 Address Entry Filter对象时再详细讨论 ilter属性。本节将重点介绍其 他属性 像 Fields、 Recipients和 Attachments集合一样, AddressEntries集合有 Count属性和lem属性。 与其他集合不同的是它被看作一个大的集合,这就意味着此 Count属性不像它在小的集合中那 有效或有用。因此,在此集合中引用一个 Address Entry Filter对象,最可靠的方法是使用此 集合的Get方法,或指定一个唯一的标识符 此集合提供了的四个Get方法: Getlast 这些方法分别返回集合中的第一个、下一个、前一个和最后一个 Address Entry对象。例如 如果想要找到一个名为“ Jeanie”的 AddressEntry对象,可以在集合中这样搜寻 objAddEntry blnFound
G e t F r e e B u s y方法与R e c i p i e n t s集合中的G e t F r e e B u s y方法相似,但只能得到当前对象的有 效性。 如果一条消息有多个收件人而又想检查重复,可以用 I s S a m e A s方法检查一下是否有两个 或两个以上的收件人的地址相同。 I s S a m e A s方法的语法如下: 此处的o b j R e c i p 2参数是一个R e c i p i e n t对象,它与o b j R e c i p i e n t相比较。这个方法只有在两 个对象都代表同一消息系统中的一个永久对象时返回 Tr u e。两个有相同值的收件人对象,如 果它们不能建立同一个物理对象就可以看作不同。因此,如果一个对象是另一个的拷贝,那 么I s S a m e A s返回F a l s e。 最后,R e c i p i e n t对象中的R e s o l v e方法与R e c i p i e n t s集合中的R e s o l v e方法的工作方式相同, 但它只解析当前的R e c i p i e n t对象的地址。 再次重申,虽然这个方法的文档显示一个可选参数用来定义是否显示一个对话 框,但是当应用程序在A S P中运行时,不允许对话框,也没有用户界面。 4. AddressEntries集合 A d d r e s s E n t r i e s集合是包括零或更多的A d d r e s s E n t r y对象的集合。 A d d r e s s E n t r i e s集合具有表2 3 - 1 5所示的属性。 表23-15 AddressEntries集合的属性及说明 属 性 说 明 C o u n t 返回集合中项目的数量 F i l t e r 设置和返回集合的A d d r e s s E n t r y F i l t e r对象 I t e m (i n d e x或s e a rc h Va l u e) 从集合中返回一个A d d r e s s E n t r y条目 在后面介绍A d d r e s s E n t r y F i l t e r对象时再详细讨论 F i l t e r属性。本节将重点介绍其 他属性。 像F i e l d s、R e c i p i e n t s和A t t a c h m e n t s集合一样,A d d r e s s E n t r i e s集合有C o u n t属性和I t e m属性。 与其他集合不同的是它被看作一个大的集合,这就意味着此 C o u n t属性不像它在小的集合中那 么有效或有用。因此,在此集合中引用一个 A d d r e s s E n t r y F i l t e r对象,最可靠的方法是使用此 集合的G e t方法,或指定一个唯一的标识符。 此集合提供了的四个G e t方法: • GetFirst。 • GetNext。 • GetPrevious。 • GetLast。 这些方法分别返回集合中的第一个、下一个、前一个和最后一个 A d d r e s s E n t r y对象。例如, 如果想要找到一个名为“J e a n i e”的A d d r e s s E n t r y对象,可以在集合中这样搜寻: 第2 3章 A S P、C D O与Exchange Serv e r计计691 下载
6925:3高级程 False Set objAddEntry colAddEntries GetFirst hile (objAddEntry Is Not Nothing) And (Not blnFound If objAddEntry. Name ..Jeanie.Then blnFound = True End if Set objAddEntry colAddEntries GetNext 遗憾的是这不是一个定位特定 AddressEntry对象的高效方法。如果知道此集合是基于对象 的Name属性存储的,就能使用集合的Item属性,并指定一个搜索字符串来替代 Index。Item属 性的语法为 objAddrEntriescoll. Item(searchvalue) earch value参数是需查找的字符串值。当在Item属性调用中指定一个搜索字符串时,返 回的是其发现的第一个条目,该条目的当前排序属性的值等于(或大于) )search value中指定的字 符串值。例如,如果知道Name属性是当前的排序属性,下面的代码返回 Jeanie的 AddressEntry 对象 Set objAddEntry colAddEntries Item("Jeanie) 知道了能搜索基于当前排序属性的 Address Entry条目,现在可能想知道如何设置排序属性 在 Address entries集合中有一个Sort方法,允许指定使用的排序属性,以及基于此属性的排序 类型。语法为: COlAddEntries. Sort( [Sortorder] [ PropTag] colAddEntries. Sort( [Sortorder] [ name]) 这里有两套参数,其原因是既可以根据缺省的MAPI属性排序,也可以根据定制的MAPI 属性排序。当根据缺省的MAPI属性排序时,用第一个语法并指定用于排序的MAPI属性的属 性标记值。如果根据定制的MAPI属性排序,那么使用第二个语法。不管采用那种方法,第 个参数指定了排序的次序,其值及说明如表23-16所示 表23-16 Sortorder的值及说明 Cdonone(o) 不排序 deScending(1) 缺省,升序排列 Cdo Descending(2) 降序排列 注意到两个参数都是可选的,因此以下规则适用: 在两者都省略的情况下,集合使用与最后一次调用Sort方法相同的值排序。 ·如果省略了 Sortorder,就按升序排列。 ·如果 PropTag和Name都没指定,集合将用与最后一次调用Sort方法相同的值排列 对于任何一次调用Sort方法,当前的排列顺序都不会保留。排序是同一级别的,不能嵌套 因此,不能同时用名称和地址排序。每次只能用一个属性作为集合的排序属性。 Address entry对象
遗憾的是这不是一个定位特定 A d d r e s s E n t r y对象的高效方法。如果知道此集合是基于对象 的N a m e属性存储的,就能使用集合的 I t e m属性,并指定一个搜索字符串来替代 I n d e x。I t e m属 性的语法为: s e a r c h Va l u e参数是需查找的字符串值。当在 I t e m属性调用中指定一个搜索字符串时,返 回的是其发现的第一个条目,该条目的当前排序属性的值等于 (或大于) s e a r c h Va l u e中指定的字 符串值。例如,如果知道 N a m e属性是当前的排序属性,下面的代码返回 J e a n i e的A d d r e s s E n t r y 对象: 知道了能搜索基于当前排序属性的 A d d r e s s E n t r y条目,现在可能想知道如何设置排序属性。 在A d d r e s s E n t r i e s集合中有一个S o r t方法,允许指定使用的排序属性,以及基于此属性的排序 类型。语法为: 或: 这里有两套参数,其原因是既可以根据缺省的 M A P I属性排序,也可以根据定制的 M A P I 属性排序。当根据缺省的 M A P I属性排序时,用第一个语法并指定用于排序的 M A P I属性的属 性标记值。如果根据定制的 M A P I属性排序,那么使用第二个语法。不管采用那种方法,第一 个参数指定了排序的次序,其值及说明如表 2 3 - 1 6所示。 表23-16 SortOrder的值及说明 值 描 述 C d o N o n e ( 0 ) 不排序 C d o A s c e n d i n g ( 1 ) 缺省,升序排列 C d o D e s c e n d i n g ( 2 ) 降序排列 注意到两个参数都是可选的,因此以下规则适用: • 在两者都省略的情况下,集合使用与最后一次调用 S o r t方法相同的值排序。 • 如果省略了S o r t O r d e r,就按升序排列。 • 如果P r o p Ta g和N a m e都没指定,集合将用与最后一次调用 S o r t方法相同的值排列。 对于任何一次调用S o r t方法,当前的排列顺序都不会保留。排序是同一级别的,不能嵌套。 因此,不能同时用名称和地址排序。每次只能用一个属性作为集合的排序属性。 A d d r e s s E n t r y对象 692计计ASP 3 高级编程 下载
40N2.693 下载 AddressEntry对象包括消息系统需要的所有地址信息。大多情况下,它与一个人或投递消 息的分发列表相对应。其属性及说明如表23-17所示。 表23-17 AddressEntry对象的属性及说明 Address Address Entry的完整消息地址 Display Type 返回 Address Entry的显示类型 返回与当前的 Address Entry对象对应的用户的管理员的 Address Entry对象 返回MAP生成的 AddressEntry的唯一的ID Members 返回一个分发列表的全部成员的 Address Entries集合。如果当前 Address Entry不是一个分发列表,返回 nothing 返回和设置 Address Entry对象的显示名称 返回和设置地址类型。如SMTP、X400等 AddressEnt!y对象有五个方法 · Details Get FreeBusyo IsSameaso 这个 Delete方法与其他 Delete方法一样,从 AddressEntries集合中删除当前的 AddressEntry对 Get Free busy和 Is sameas方法与 Recipient对象中的相应方法的工作方式一样 如果不作为一个ASP应用程序运行, Details方法将显示一个对话框,表明当前 Address Entry对象的详细情况。在ASP应用程序中,不使用此方法。 另一方面, Update方法是一个能在我们的应用程序中使用的方法。这个方法用来提交 个 AddressEntry对象的变化。语法如下: ObjAddressEntry. Update( [makePermanent] [ refreshobject]) 此方法中的两个参数都是可选的,说明如下: make Permanent参数指定是否将改变保存到地址簿。如果没有保存这些改变,它们就只 供当前的 Addressentries集合使用。当更新或释放集合时,改变就会丢失。 refreshobject参数指定是否从地址簿中重新载入属性缓存 因此,如果想要更新集合中每一项 AddressEntry,在它们的显示名称后添加“(Wrox)”, 应使用下面的代码 For Each objAddEntry In colAddEntries objAddEntry Name objAddEntry Name&.(Wrox). objAddEntry. Update(makePermanent: =True) 5. Address Entry Filter对象 在浏览 Addressentries集合的属性时曾提到 Filter属性,它能设置或返回一个 Address Entry Filter对象。下面介绍这个对象,并分析它如何对 Addressentries集合产生影响 AddressEntry Filter对象用来指定一个信息,用它来过滤一个 Address Entries集合。例如 它能只显示有远程消息地址的 AddressEntry对象。 其属性及说明如表23-18所示
第2 3章 A S P、C D O与Exchange Serv e r计计693 下载 A d d r e s s E n t r y对象包括消息系统需要的所有地址信息。大多情况下,它与一个人或投递消 息的分发列表相对应。其属性及说明如表 2 3 - 1 7所示。 表23-17 AddressEntry 对象的属性及说明 属 性 说 明 A d d r e s s A d d r e s s E n t r y的完整消息地址 D i s p l a y Ty p e 返回A d d r e s s E n t r y的显示类型 M a n a g e r 返回与当前的A d d r e s s E n t r y对象对应的用户的管理员的 A d d r e s s E n t r y对象 I D 返回M A P I生成的A d d r e s s E n t r y的唯一的I D M e m b e r s 返回一个分发列表的全部成员的 A d d r e s s E n t r i e s集合。如果当前 A d d r e s s E n t r y不是一个分发列表,返回 N o t h i n g N a m e 返回和设置A d d r e s s E n t r y对象的显示名称 Ty p e 返回和设置地址类型。如S M T P、X 4 0 0等 A d d r e s s E n t r y对象有五个方法: • Delete。 • Details。 • GetFreeBusy。 • IsSameAs。 • Update。 这个D e l e t e方法与其他D e l e t e方法一样,从A d d r e s s E n t r i e s集合中删除当前的A d d r e s s E n t r y对 象。G e t F r e e B u s y和I s S a m e A s方法与R e c i p i e n t对象中的相应方法的工作方式一样。 如果不作为一个 A S P应用程序运行, D e t a i l s 方法将显示一个对话框,表明当前 A d d r e s s E n t r y对象的详细情况。在A S P应用程序中,不使用此方法。 另一方面,U p d a t e方法是一个能在我们的应用程序中使用的方法。这个方法用来提交一 个A d d r e s s E n t r y对象的变化。语法如下: 此方法中的两个参数都是可选的,说明如下: • m a k e P e r m a n e n t参数指定是否将改变保存到地址簿。如果没有保存这些改变,它们就只 供当前的A d d r e s s E n t r i e s集合使用。当更新或释放集合时,改变就会丢失。 • refreshObject参数指定是否从地址簿中重新载入属性缓存。 因此,如果想要更新集合中每一项 A d d r e s s E n t r y,在它们的显示名称后添加“ ( Wr o x )”, 应使用下面的代码: 5. AddressEntryFilter对象 在浏览 A d d r e s s E n t r i e s 集合的属性时曾提到 F i l t e r 属性,它能设置或返回一个 A d d r e s s E n t r y F i l t e r对象。下面介绍这个对象,并分析它如何对 A d d r e s s E n t r i e s集合产生影响。 A d d r e s s E n t r y F i l t e r对象用来指定一个信息,用它来过滤一个 A d d r e s s E n t r i e s集合。例如, 它能只显示有远程消息地址的 A d d r e s s E n t r y对象。 其属性及说明如表2 3 - 1 8所示