下载第 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对象库的结构析这些通用 /共享对象开始。如果一个对象根据其父对象的不同,具有不同的用法或属性,则在介绍父对象时会给出相应的解释。
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下载
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
(续 )
名 称 值
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计计 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
第 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 ) 此时隙内收件人中至少有一个不在
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对象。
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下载遗憾的是这不是一个定位特定 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 高级编程 下载第 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所示。
表 23-18 AddressEntryFilter对象的属性及说明属 性 说 明
A d d r e s s 返回被过滤 A d d r e s s E n t r y对象的消息地址
F i e l d s 返回一个包括了过滤使用的条件的 F i e l d s集合
N a m e 设置和返回用于模糊名称过滤的名称
N o t 设置和返回是否所有的条件在添加到过滤器之前都求“反”
O r 设置和返回是否条件由“或”代替“与”进行组合一眼看上去,可能不明白 N o t和 O r是怎样使用的,这将在后面介绍,先来介绍这个对象的功能。
A d d r e s s E n t r y F i l t e r对象的关键是它的 F i d d s集合。所指定的过滤器使用的所有条件都在这个集合中。在 F i e l d s集合里可以有零或更多的条目,每一个条目都代表了一个条件。
例如,添加一个条件,使得只有家庭地址在,C A”的 A d d r e s s E n t r y被过滤出来,程序代码如下:
缺省状态下,当添加附加条件到过滤器中时,它们包含在一个 A n d子句中。因此,为了完成集合的过滤,集合中的每一个 A d d r e s s E n t r y对象都必须与所有的条件比较。如果想在过滤器中使用 O r子句,就需要在此对象中设置 O r属性。例如,过滤家庭地址在,C A”或者远程用户的 A d d r e s s E n t r y对象,代码应如下:
另一个影响如何处理条件的属性是 N o t。如果想要找到所有不在,C A”的 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对象赋予程序员对于 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 i e s集合。
在使用此对象时,必须记住释放此对象 (设置为 N o t h i n g )并不能从 A d d r e s s E n t r i e s集合中删除过滤器。要想从集合中删除过滤器,就必须设置 AddressEntries集合的 Filter属性为 Nothing。
现在已经学习了可以有不同父对象类型的集合和对象。从对这些对象的讨论中可以清楚地知道它们是消息的构件,如果不能与消息的附件、字段、收件人、地址交互就不可能发送
694计计 ASP 3 高级编程 下载第 2 3章 A S P,C D O与 Exchange Serv e r计计 695下载信息。在下一节中,将介绍几个较高级的 C D O库对象,这些对象使用以上的构件并对它们进行扩充。
23.1.2 Session对象与 C D O N T S库一样,C D O库也以 S e s s i o n对象作为根对象。正像 CDONTS Session对象提供了比 N e w M a i l对象更多的功能一样,C D O的 S e s s i o n对象提供了比 CDONTS 的 S e s s i o n对象更强大的功能。
CDO Session对象提供的属性很好地说明了这一点,如表 2 3 - 1 9所示。
表 23-19 Session对象的属性及说明属 性 说 明
A d d r e s s L i s t s 返回当前会话的 A d d r e s s L i s t s集合
C u r r e n t U s e r 返回当前用户的 A d d r e s s E n t r y对象
I n b o x 返回代表当前用户的收件箱的 F o l d e r对象
I n f o S t o r e s 返回当前会话 /用户的信息存储的一个集合
N a m e 返回当前会话的用户 /显示名称
O p e r a t i n g S y s t e m 返回关于当前操作系统的信息 (类型及版本 )
O u t B o x 返回代表当前用户的发件箱的 F o l d e r对象
O u t O f O ff i c e 返回表示用户是否离位的布尔值 ( Tu r e / F a l s e )
O u t O f O ff i c e Te x t 返回用于离位响应消息的文本字符串
CDO Session对象的方法也比 CDONTS Session对象的方法多得多。
用到的第一个 S e s s i o n对象的方法为 L o g o n,它与 C D O N T S中的 L o g o n S M T P相似。在这种情况下,L o g o n能使用户登录进入一个 M A P I会话,并不只限于 S M T P服务器。必须成功地调用一次 L o g o n方法,才能对一个 C D O对象进行访问。否则,当试图访问对象时,会出现一个
C d o E _ N O T _ I N I T I A L I Z E D错误。
L o g o n方法的语法为:
其参数及说明如表 2 3 - 2 0所示。
表 23-20 Logon方法的参数及说明参 数 说 明
P r o f i l e N a m e 供会话使用的配置文件的名称
P r o f i l e P a s s w o r d 用于指定的配置文件的口令
S h o w D i a l o g 在 A S P代码中忽略
N e w S e s s i o n 指定是创建一个新的会话,还是使用共享的 M A P I会话
P a r e n t Wi n d o w 在 A S P代码中忽略
N o M a i l 指定是否向 M A P I假脱机系统注册会话
P r o f i l e I n f o 指定用来建立一个会话配置文件的服务器和信箱的名称对于 N e w S e s s i o n参数,如果当前没有共享的 M A P I会话,那么就忽略 N e w S e s s i o n,并建立一个新的会话。如果当前有一个共享的会话,此参数就用来确定是使用当前会话还是创建一个新会话。如果 N e w S e s s i o n为 Tu r e,且 M A P I会话存在,那么就使用此会话。如果 N e w S e s s i o n
为 F a l s e,且 M A P I会话存在,那么就建立一个新的会话。
N o M a i l参数的值指定一条消息能否通过假脱机系统发送。如果 N o M a i l的值为 Tu r e,消息就只能从一个紧密耦合的消息存储和邮件通路中传递。当 N o M a i l的值为 F a l s e (默认 )时,消息可以通过邮件假脱机系统发送和接收。
为创建一个连接,M a i l S e v e r 1”服务器和,J e a n i e”邮箱的新会话,可以使用以下代码:
如果登录失败,就会产生 C d o E _ L O G O N _ FA I L E D错误。一旦成功地调用了 L o g o n方法,
就可以访问在 S e s s i o n对象级别之下的对象。
L o g o ff方法用来终止当前的 M A P I会话。当用户退出时,必须调用此方法来释放分配给
S e s s i o n对象的资源。通过使用同一个 S e s s i o n对象来创建另一个会话是可能的。例如,想要退出 J e a n i e的会话并让 J a c k登录,程序代码如下:
然而,如果试图在调用 L o g o ff方法之后,在成功调用 L o g o n方法之前就访问 S e s s i o n对象,
就会得到这 C d o E _ N O T _ I N I T I A L I Z E D错误。
另一个有趣的方法叫作 S e t O p t i o n。它用来指定影响 CDO Rendering库对象如何显示日历信息的选项。使用 S e t O p t i o n方法可以影响日历显示的某些选项。
日历显示的选项、类型及可能值如表 2 3 - 2 1所示。
表 23-21 日历显示的选项、类型及可能值选 项 类 型 可 能 值
B u s i n e s s D a y E n d Ti m e Ti m e 5:00 PM
B u s i n e s s D a y S t a r t Ti m e Ti m e 9:00 AM
C a l e n d a r S t o r e S t r i n g " O u t l o o k "
F r i s t D a y O f We e k L o n g 1 (星期一 )到 7 (星期日 )
I s 2 4 H o u r C l o c k B o o l e a n F a l s e
Ti m e Z o n e L o n g C D O T m z *常量之一
Wo r k i n g D a y s L o n g C D O M o n d a y ~ C d o F r i d a y
696计计 ASP 3 高级编程 下载会话的选项既不会自动地转换到 R e n d e r i n g库对象,这些选项也不保持同步,这一点很重要。使用时需要小心地设置 S e s s i o n对象和 R e n d e r i n g库对象之间的所有选项的值并保持同步。
在使用 C D O N T S库时,通过调用 S e n d方法来发送信息。对于 C D O库,新的消息放置在
O u t b o x里。在 O u t b o x里的消息可能不立即发送,但是在急需发送所有等待传出的消息时,可以使用 S e s s i o n对象的 D e l i v e r N o w方法。运行此方法请求假脱机系统立即发送所有当前会话提交的消息。此方法的一个副作用是所有等待的消息都要经假脱机系统处理。
还有一个 A d d r e s s B o o k方法,用来显示一个模态对话框,让用户从地址簿选择一个地址。我们正在 A S P中编程,不允许有用户界面口,不能使用此方法。
23.1.3 文件夹
CDO Session对象的 G e t D e f a u l t F o l d e r方法的功能比 C D O N T S库中的更强。 C D O的
G e t D e f a u l t F o l d e r方法允许访问更多的文件夹,而不像 C D O N T S库中的 G e t D e f a u l t F o l d e r方法那样只能访问收件箱 ( I n b o x )或发件箱 ( O u t b o x )。其语法为:
唯一的参数是 O b j e c t Ty p e,其可能的值如表 2 3 - 2 2所示。
表 23-22 ObjectTy p e参数的值及对应的文件夹
O b j e c t Ty p e 文件夹
C d o D e f a u l t F o l d e r C a l e n d a r ( 0 ) C a l e n d a r
C d o D e f a u l t F o l d e r I n b o x ( 1 ) I n b o x
C d o D e f a u l t F o l d e r O u t b o x ( 2 ) O u t b o x
C d o D e f a u l t F o l d e r S e n t I t e m s ( 3 ) Sent Items
C d o D e f a u l t F o l d e r D e l e t e d I t e m s ( 4 ) D e l e t e d I t e m s
C d o D e f a u l t F o l d e r C o n t a c t s ( 5 ) C o n t a c t s
C d o D e f a u l t F o l d e r J o u r n a l ( 6 ) J o u r n a l
C d o D e f a u l t F o l d e r N o t e s ( 7 ) N o t e s
C d o D e f a u l t F o l d e r Ta s k s ( 8 ) Ta s k s
注意,C o n t a c t s,N o t e s,J o u r n a l和 Ta s k s文件夹只对 Microsoft Outlook有效。
如果只使用 Micrsoft Schedule+,那么引用以上文件夹就会出现 C d o E _ N O T _ F O U N D错误。
另外,不是所有的消息存储都支持以上所有文件夹类型。例如,如果当前会话的配置文件只有一个个人消息存储,那么它可能没有 N o t e s文件夹,这时如果指定 O b j e c t Ty p e 为
C d o D e f a u l t F o l d e r N o t e s,就会得到 C d o E _ N O _ S U P P O RT错误。
C D O中 (不是 C D O N T S中 )的一个明显特性是 S e s s i o n对象有一个 G e t F o l d e r方法。此方法允许访问消息存储中的任何一个文件夹,只要文件夹的 I D属性已知。其语法为:
其参数及说明如表 2 3 - 2 3所示。
第 2 3章 A S P,C D O与 Exchange Serv e r计计 697下载
698计计 ASP 3 高级编程 下载表 23-23 GetFolder方法的参数及说明参 数 说 明
F o l d e r I D 所需的文件夹的唯一的 I D
S t o r e I D 可选,包含此文件夹的消息存储的唯一的 I D
对于一个用户来说,在一个会话中拥有多个消息存储 (例如,一个个人消息存储和一个
E x c h a n g e邮箱 )是可能的。所以能确定一个消息存储,在其中检索 F o l d e r对象是必要的。如果有一个页面可以传递 f o l d e r I D和 s t o r e I D,就可以得到此文件夹中的消息集合:
23.1.4 地址列表除了能访问一个消息存储中的消息和约会之外,也需要与地址交互。在 S e s s i o n对象中有两个方法能与地址交互。第一个方法是 G e t A d d r e s s E n t r y方法,用来检索一个特定的
A d d r e s s E n t r y对象。语法为:
当所需对象的 e n t r y I D已知时,此方法很有用。如果想打印一个 I D为 6 0 0的 A d d r e s s E n t r y的显示名称,可以这样做:
另一个与地址有关的方法是 G e t A d d r e s s L i s t。此方法允许访问一个指定的 A d d r e s s L i s t对象,
其语法为:
O b j e c t Ty p e参数指定返回的地址列表的类型。其可能值如表 2 3 - 2 4所示。
表 23-24 ObjectTy p e参数的值及返回的地址列表的类型值 返回的地址列表的类型
C d o A d d r e s s L i s t s G A L ( 0 ) 全局地址列表
C d o A d d r e s s L i s t s PA B ( 1 ) 用户 /会话的个人地址簿
1,AddressList对象
G e t A d d r e s s L i s t方法能返回一个 A d d r e s s L i s t条目,它包含了地址簿容器中所有地址的列表。地址簿容器就像是一个列出了一个公司的所有雇员的全局地址簿。一个 A d d r e s s L i s t条目包括一个 A d d r e s s E n t r i e s集合和一个 F i e l d s集合。这些集合已经在前面讲到了,这里就不再重复了。
A d d r e s s L i s t对象的属性及说明如表 2 3 - 2 5所示。
表 23-25 AddressList对象的属性及说明属 性 说 明
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 i e s集合
F i e l d s 返回与地址列表一个或全部相关的字段
I D 返回 A d d r e s s L i s t对象的唯一的 I D
I n d e x 返回 A d d r e s s L i s t s集合中的当前 A d d r e s s L i s t的索引
I s R e a d O n l y 返回当前 A d d r e s s L i s t是否允许修改
N a m e 返回地址簿容器的名称除了这些属性外,A d d r e s s L i s t对象还有一个 I s S a m e A s方法。此方法用于判断是否从同一个地址容器创建了两个 A d d r e s s L i s t对象。语法为:
要想看一下当前的 A d d r e s s L i s t是否与另一个相同,应这样:
23.1.5 信息存储与 E x c h a n g e类似,用户可以有多个消息存储。一个用户可以有一个 E x c h a n g e邮箱和一个个人消息存储,每个服务都可以看作是一个信息存储。 S e s s i o n对象有一个默认的
I n f o S t o r e,也可以通过它的 I n f o S t o r e s属性访问另一个 I n f o S t o r e对象。此属性的语法为:
正如所看到的,既可以得到一个会话的所有 I n f o S t o r e的集合,也可以通过它在集合内的索引或它的 n a m e属性来指定一个特定 I n f o S t o r e。当使用一个个人 I n f o S t o r e时,可以与它的
F o l d e r对象交互,就像通过 S e s s i o n对象与一个 F o l d e r对象交互一样。
现在已经介绍了 C D O库的分层结构,下面介绍怎样在 A S P页面上使用这些对象。
23.1.6 消息每个 CDO Folder对象都有一个 M e s s a g e属性,它返回一个 M e s s a g e 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或 G r o u p H e a d e r对象。 CDO Messages
集合与 CDONTS Messages集合非常相似,但添加了一个 F i l t e r属性。由于 CDO Messages集合是一个较大的集合,要访问此集合中的对象,最好的方法是指定一个唯一的标识符或者使用此集合提供的 G e t方法。此集合具有的属性如表 2 3 - 2 6所示。
第 2 3章 A S P,C D O与 Exchange Serv e r计计 699下载表 23-26 Messages集合的属性及说明属 性 说 明
C o u n t 返回集合中对象的数量
F i l t e r 返回集合的 M e s s a g e F i l t e r对象
I t e m (Z) 返回集合中索引为 Z的对象在关于 CDO MessageFilter对象的小节中将讲到 F i l t e r属性以及其用法。
1,Messages集合的 I t e m属性为访问一个集合中的单个消息,可以使用 I t e m属性。此属性会从集合中给出单个 M e s s a g e
对象。
其语法为:
参数 i n d e x的值可以从 1到集合中对象的数目。如果想要集合中的第一个消息,应这样编写代码:
由于 I t e m属性是 M e s s a g e s集合的默认属性,所以下面的代码功能相同:
(1) Add方法此集合还有一个允许开发者添加一个新的消息到集合中的 A d d方法。执行此方法时,
将创建一个新的 M e s s a g e对象,并把它添加到集合中,然后返回这个对象的一个引用。它允许用户添加一条消息,然后可以在不需要预先在集合中定位它的情况下修改它的内容及属性。
A d d方法的语法为:
其参数及说明如表 2 3 - 2 7所示。
表 23-27 Add 方法的参数及说明参 数 说 明
S u b j e c t 可选,消息的主题行
Te x t 可选,消息的主体文本
I m p o r t a n c e 可选,消息的优先级设置。默认值为 C d o N o r m a l ( 1 )
下面的代码将添加一个新的消息到 O u t b o x:
700计计 ASP 3 高级编程 下载
(2) Delete方法如果可以添加一条消息到集合中,那么能从集合中删除消息也是有用的。你首先想到的可能是在 M e s s a g e s集合中调用 D e l e t e方法,但是正如在别处看到的,如果这样做就会把集合中所有的消息都删掉。要记住,D e l e t e方法能把集合中的所有消息立即删除,并且此操作不能撤消,因此当代码中涉及删除消息操作时要特别谨慎。
如果想从集合中只删除一条消息,应在 M e s s a g e对象中调用 D e l e t e方法。另一方面,如果想从 I n b o x中删除所有的消息,应使用以下代码:
(3) GetFrist,G e t N e x t,G e t L a s t和 G e t P r e v i o u s方法
M e s s a g e s集合提供了允许在集合中定位消息的方法,G e t F r i s t,G e t N e x t,G e t L a s t和
G e t P r e v i o u s。这些方法分别返回消息集合中的第一条、下一条、最后一条或上一条消息。如果它们中的任一个不能得到消息,返回值为 N o t h i n g。
集合中消息的顺序是不确定的,因此这些方法返回的消息不能预测。当处理这些消息的集合时,集合应被看作是没被排序的,不能假设集合中的顺序。
要想显示 I n b o x中所有消息的主题行,可以用以下代码:
(4) Sort方法
S o r t方法只能在 CDO Messages集合中使用。使用此方法,可以根据一个指定的属性对
M e s s a g e s集合排序。 M e s s a g e s集合的 S o r t方法与 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属性排序。对于任一种属性设置,第一个参数确定排序顺序,其值及说明如表 2 3 - 2 8所示。
表 23-28 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方法,当前的排列顺序都不会保留。排序是同一级别的,不能嵌套。
第 2 3章 A S P,C D O与 Exchange Serv e r计计 701下载
702计计 ASP 3 高级编程 下载因此,不能同时用名称和地址排序。每次只能用一个属性作为集合的排序属性。
2,CDO MessageFilter 对象在多数情况下,总希望对一个 M e s s a g e s集合进行过滤以便只显示特定的消息。例如,可以过滤一个文件夹只显示来自某个人的消息。为做到这一点,需要 M e s s a g e F i l t e r对象。此对象包含的信息用于决定过滤后集合含有哪些消息。其属性及说明如表 2 3 - 2 9所示。
表 23-29 MessageFilter对象的属性及说明属 性 说 明
C o n v e r s a t i o n 设置 /返回消息或对象的 Conversation To p i c属性的过滤器值
F i e l d s 返回用于过滤的 F i e l d集合
I m p o r t a n c e 设置或返回消息或对象的 I m p o r t a n c e属性的过滤器值
N o t 确定是否对过滤器的值取“反”
O r 确定过滤器条件是由“或” ( Tr u e )还是由“与” ( F a l s e )进行组合
R e c i p i e n t s 设置或返回消息或对象的 R e c i p i e n t s集合的过滤器值
S e n d e r 设置或返回消息或对象的 S e n d e r属性的过滤器值
S e n t 设置或返回消息或对象的 S e n t属性的过滤器值
S i z e 设置或返回消息或对象的 S i z e属性的过滤器值
S u b j e c t 设置或返回消息或对象的 S u b j e c t属性的过滤器值
Te x t 设置或返回消息或对象的文本的过滤器值
Ti m e F r i s t 设置或返回过滤器值为在某日期 /时刻或之后收到的消息
Ti m e L a s t 设置或返回过滤器值为在某日期 /时刻或之前收到的消息
Ty p e 设置或返回消息或对象的 C l a s s属性的过滤器值
U n r e a d 设置或返回消息或对象的 U n r e a d属性的过滤器值例如,想要过滤 I n b o x,只显示来自 John Smith的,U n r e a d属性为 Tr u e (未读 )的消息,可以使用以下代码:
请注意在 M e s s a g e F i l t e r对象或 M e s s a g e s集合中没有必要调用 U p d a t e方法,因为对 M e s s a g e s
集合的 M e s s a g e F i l t e r对象进行的改变在设置它们时就持久化了。在使用 G e t方法访问集合或通过使用一个 F o r.,,E a c h循环遍历集合时,过滤器才实际应用到集合。
3,CDO Message对象这个对象除了有一些新的属性和方法外,与 C D O N T S库中的 M e s s a g e对象相似,需要通过一个 F o l d e r对象的 M e s s a g e s集合来访问。它能够代表文件夹中的一个邮件消息、一个文档或一个窗体。其属性及说明如表 2 3 - 3 0所示。
表 23-30 Message对象的属性及说明属 性 说 明
A t t a c h m e n t s 表示此消息的附件的 A t t a c h m e n t对象的集合
C a t e g o r i e s 字符串数组,用来指定分配给此消息的类别
C o n v e r s a t i o n I n d e x 如果消息是在一个会话线索中,指定此线索中的消息的索引
(续 )
属 性 说 明
C o n v e r s a t i o n To p i c 如果消息是在一个会话线索中,指定此线索的主题
D e l i v e r y R e c e i p t 如果发件人要求一个投递“回执”则为 Tr u e,否则为 F a l s e
E n c r y p t e d 若消息已被加密则为 Tr u e,否则为 F a l s e
F i e l d s 返回消息的 F i e l d s集合
F o l d e r I D 指定消息驻留的文件夹的标识符
I D 指定当前消息的标识符
I m p o r t a n c e 指定消息的优先级
R e a d R e c e i p t 如果发件人要求一个读取“回执”则值为 Tr u e,否则为 F a l s e
R e c i p i e n t s 返回消息的 R e c i p i e n t s集合
S e n d e r 返回表示发件人的 A d d r e s s E n t r y对象
S e n s i t i v i t y 设置或返回当前消息的阅读权限
S e n t 若消息已被发送则为 Tr u e,若消息被保存则为 F a l s e
S i g n e d 若消息包括一个数字签名则为 Tr u e
S i z e 返回消息的容量,以字节为单位
S t o r e I D 返回存有此消息的消息存储的唯一的标识符
S u b j e c t 设置或返回消息的主题
S u b m i t t e d 若已在此 M e s s a g e对象上调用 S e n d方法则为 Tr u e,否则为 F a l s e
Te x t 设置或返回包含消息主体文本的字符串
Ti m e C r e a t e d 包含第一次创建此消息的日期和时间
Ti m e E x p i r e d 包含消息过期并可以安全地删除的日期和时间
Ti m e L a s t M o d i f i e d 包含最后一次保存消息的日期和时间
Ti m e R e c e i v e d 包含接收消息的日期和时间
Ti m e S e n t 包含发送消息的日期和时间
Ty p e 设置或返回消息的 M A P I类
U n r e a d 若消息未被读取过则为 Tr u e,否则为 F a l s e
S e n s i t i v i t y属性的值及说明如表 2 3 - 3 1所示。
表 23-31 Sensitivity属性的值及说明值 说 明
C d o N o S e n s i t i v i t y ( 0 ) 没定义阅读权限
C d o P e r s o n a l ( 1 ) 个人
C d o P r i v a t e ( 2 ) 专用
C d o C o n f i d e n t i a l ( 3 ) 机密就像 CODNTS Message对象一样,CDO Message对象也有 S e n d,I s S a m e A s和 D e l e t e方法。
但是,在 C D O库中,M e s s a g e对象有几个另外的方法可供使用。
4,CopyTo和 M o v e To方法
C o p y To和 M o v e To方法用来拷贝或移动一个 M e s s a g e对象到另一个文件夹。这可以在当前的消息存储中执行,也可以在不同的消息存储中执行。
语法为:
C o p y To 和 M o v e To方法的参数及说明如表 2 3 - 3 2所示。
第 2 3章 A S P,C D O与 Exchange Serv e r计计 703下载
704计计 ASP 3 高级编程 下载表 23-32 CopyTo和 M o v e To方法的参数及说明参 数 说 明
f o l d e r I D 复制操作的目标文件夹的唯一的标识符
s t o r e I D 复制操作的目标消息存储的唯一的标识符为了提交复制或移动操作,必须执行 U p d a t e方法。在下面的例子中,常量 F L D R _
R E A D M A I L包含了,Read Mail”文件夹的唯一的标识符,而且常量 P E R S O N A L S TO R E包含了用户的个人消息存储的唯一的标识符:
5,Forward,R e p l y和 R e p l y A l l方法
M e s s a g e对象包括几个用来简化回复、全部回复及转发消息操作的方法。调用这些方法都不需要参数,而且它们都返回一个新的 M e s s a g e对象。所有这些方法都创建此消息及它们全部附件的拷贝。
对于 R e p l y和 R e p l y A l l方法来说,也创建正确的 R e c i p i e n t s集合。对于 F o r w a r d方法来说,
R e c i p i e n t s集合中没有收件人,因此在发送消息之前必须添加他们。
6,Update方法就像刚提到的,为了提交对一个 M e s s a g e s集合所做的所有改变,必须调用 U p d a t e方法。
这个方法会使消息以当前状态保存到 M A P I系统中。
其语法为:
M a k e P e r m a n e n t参数决定是否将变化提交到下层信息存储。 Tr u e值 (缺省 )会影响下层信息存储,而 F a l s e则不影响。同时,r e f r e s h O b j e c t参数决定是否重新加载 M e s s a g e对象的属性缓存。
Tr u e将使缓存更新。 r e f r e s h O b j e c t的缺省值为 F a l s e。
23.1.7 通用属性与 C D O N T S库一样,也有几个属性对所有 S e s s i o n对象层次结构中的对象是通用的。它们是:
Session。
Class。
Parent。
Application。
S e s s i o n属性能返回一个 S e s s i o n对象。这个 S e s s i o n对象是指定对象的根对象,并且代表指定对象所在的会话。
C l a s s属性能返回一个长整型值,并且指出指定对象的类型。表 2 3 - 3 3显示了 C l a s s属性的值及对应的对象类型。
表 23-33 Class属性的值及对应的对象类型值 对象类型
0 S e s s i o n
2 F o l d e r
3 M e s s a g e
第 2 3章 A S P,C D O与 Exchange Serv e r计计 705下载
(续 )
值 对象类型
4 R e c i p i e n t
5 A t t a c h m e n t
8 A d d r e s s E n t r y
1 6 M e s s a g e s
1 7 R e c i p i e n t s
1 8 A t t a c h m e n t s
P a r e n t属性将返回指定对象的父对象。注意两个特殊情况:
Session对象的 P a r e n t属性值为 N o t h i n g。
一个 A d d r e s s E n t r y对象的 P a r e n t对象是一个 M e s s a g e对象。
最后,A p p l i c a t i o n属性返回一个当前应用程序名称的字符串值。在 C D O库中调用此对象时,将返回,Collaboration Data Objects for NTS Version 1.2。
23.2 邮件客户端应用程序为了展示 C D O库的工作,现在介绍另一个简单的 A S P应用程序 M a i l C l i e n t。该应用程序提供了一个与 O u t l o o k界面相似的 We b界面。它与前一章的应用程序例子的主要不同在于它使用
C D O库,而且利用 Exchange Server 5.5作为后台。
23.2.1 概述当一个用户登录时,将看到一个他的文件夹的列表。点击一个文件夹时,将得到这个文件夹中的消息列表。点击一条消息就会打开它供用户修改。然后可以回复消息、转发消息或删除消息。
为创建这个应用程序将使用下面 6个 A S P页面:
Login.asp。
FolderList.asp。
FolderContents.asp。
Vi e w M e s s a g e,a s p。
SearchMessages.asp。
Logout.asp。
此外将使用一个框架设置页面 ( F r a m e S e t,a s p ),提供所需的用户界面。
23.2.2 服务器配置为了登录到一个 E x c h a n g e邮箱,L o g i n,a s p只需获得一个服务器名称和一个邮箱名称。如果这样就能访问一个邮箱,那么这是一个很不安全的应用程序。在这种情况下,应用程序的安全性由 Exchange Server操纵。
对于服务器上的每一个邮箱,都有一个 Windows NT User帐户与它相关。当一个应用程序试图访问一个邮箱时,它必须提供正确的身份验证信息。如果企图用不正确的身份验证信息访问邮箱,则会被拒绝。
此安全措施的一个副作用是必须配置 We b应用程序,以便向 Exchange Server提供正确的身份验证信息。默认时 We b应用程序不提供正确的身份验证信息,即使是有权限的用户也会被拒绝访问他们的邮箱。这是因为 A S P应用程序的默认设置允许匿名验证 ( a n o n y m o u s
a u t h e n t i c a t i o n )。
为了调整该设置,需要进入此 A S P应用程序的 P r o p e r t i e s对话框,并且设置安全验证为 N T
Challenge Response。为此,需要打开 A S P应用程序的 P r o p e r t i e s对话框并单击 D i r e c t o r y
S e c u r i t y选项卡,如图 2 3 - 2所示。
图 23-2 安全设置的屏幕 1
然后在 Anonymous access and authentication control部分单击 E d i t按钮,这时显示
Authentication Methods对话框。如图 2 3 - 3所示,对于这个应用程序,只启用 I n t e g r a t e d
Windows authentication,因此不选中 Anonymous access复选框。
图 23-3 安全设置的屏幕 2
706计计 ASP 3 高级编程 下载一旦这样做,可能会使 N e t s c a p e的用户不能访问此 A S P应用程序,因为它不能提供必要的身份验证。
23.2.3 类型库在学习任何 A S P之前,最好引用 C D O类型库,这样就能使用 C D O常量。需在应用程序的
g l o b a l,a s a里或在 M e s s a g e L i s t,a s p,S e n d M a i l,a s p和 Vi e w M e s s a g e,a s p页面的顶端放置 C D O类型库的引用。这个文件通常定位于:
现在已经正确设置了应用程序,下面介绍一下组成此应用程序的页面。
23.2.4 Login.asp
用户见到的第一个页面是 L o g i n,a s p。对于这个应用程序,它与上一章用于 I n b o x例子程序的 L o g i n,a s p相似。下面是此页面的代码,其显示如图 2 3 - 4所示。
图 23-4 运行 L o g i n,a s p时的窗口由图 2 3 - 4可见,登录需要的是要连接的服务器和邮箱的名称,而不是用户的名称和口令。
另外,当提交此窗体时,数据就会发送到一个叫做 F r a m e S e t,a s p的新页面。
第 2 3章 A S P,C D O与 Exchange Serv e r计计 707下载
708计计 ASP 3 高级编程 下载
23.2.5 FrameSet.asp
F r a m e S e t,a s p创建的界面与 O u t l o o k相似。主要特点是它有一个框架来显示用户的文件夹列表,另一个框架显示文件夹的内容或显示消息的内容。此页面的源代码是:
用户看不到此页面本身,它只是创建两个框架并且把 F o l d e r L i s t,a s p和 M e s s a g e L i s t,a s p页面载入到它们的目标框架。然而,F r a m e S e t,a s p确实执行了一些重要的 A S P代码。
在此页面内创建和初始化用户的会话。在 I n b o x例子应用程序中,把用户的显示名称和 e -
m a i l地址存储到会话变量中。在这个应用程序中,不需要存储服务器名称和邮箱的值,但为方便访问将它们存放到局部变量中:
一旦这样做,就创建了一个新的 CDO Session对象,而且使用在登录页面指定的信息,把用户登录到他们新的会话中。然后,存储 CDO Session对象到 A S P会话变量中,这样
F o l d e r L i s t,a s p和 M e s s a g e,a s p页面就可以访问它了:
注意,此会话并没有用 C D O,S e s s i o n P r o g I D创建,而是用 M A P I,S e s s i o n创建。这是因为
C D O对象库在内部标识为,M A P I” 。
在使用 C D O N T S时可以使用 CDONTS.Session ProgID是因为 C D O N T S库在内部标识为,C D O N T S” 。
此页面的最后一项作用是把 U s e r N a m e存储到一个会话变量中。虽然这个名称总可以在当前的 CDO Session对象中得到,但是在某些情况下可以方便快捷地访问 U s e r N a m e,而不必先得到一个 S e s s i o n对象,是有好处的。下面的代码创建了一个新的会话变量并把当前用户的显示名称存储到此对象中:
此页面的剩余部分建立起框架结构,对每个框架命名,然后把文件夹列表页面和信息列表页面加载到它们各自的框架。用户在他们的浏览器中看到的屏幕如图 2 3 - 5所示。
图 23-5 运行 F r a m e S e t,a s p时的屏幕注意,左边的窗口显示文件夹列表 ( F o l d e r L i s t,a s p ),右边的窗口显示一个文件夹的内容 ( M e s s a g e L i s t,a s p ) 。下面先看一下 F o l d e r L i s t,a s p的代码,然后再介绍 M e s s a g e
L i s t,a s p。
23.2.6 FolderList.asp
通常注意到的关于邮件客户程序的第一件事是文件夹层次结构。这通常在一个树状 (或类似 )视图中,并且显示存在于消息存储中的文件夹。对于 O u t l o o k,默认的文件夹是 I n b o x、
O u t b o x,C a l e n d a r,Ta s k s,J o u r n a l,N o t e s,Sent Items和 C o n t a c t s。 F o l d e r L i s t,a s p也会呈现给用户一个存在于他们的消息存储中的文件夹的列表。源代码如下:
第 2 3章 A S P,C D O与 Exchange Serv e r计计 709下载
710计计 ASP 3 高级编程 下载正如所看到的,此页面中的客户代码较多。此客户代码允许用户单击一个文件夹并做出响应。但是在分析此代码的工作方式之前,先来分析一下文件夹列表是如何生成的。
第一步是获得 S e s s i o n对象,然后访问用户的信息存储集合。代码如下:
第一行检索出由 F r a m e s e t,a s p页面存储的 MAPI Session对象。然后,得到此会话的消息存储集合。这将返回此用户的所有消息存储。它们可以是公共文件夹、私人消息存储或它们的
E x c h a n g e换邮箱。
有了信息存储集合,就能浏览它们并且列出每个消息存储内的文件夹。对于公共文件夹,
由于它们的分层结构相当巨大,下面的代码忽略了它们:
此代码在每个文件夹的名称周围构造 < D I V >标记。这样做是为了能使用客户端代码来响应某个用户单击一个文件夹。 < D I V >标记提供了对 C l i c k事件做出反应的机制,允许使用它们的 I D属性来确定此文件夹的名称。每一个文件夹都有唯一的 I D与之相关联,并且如果知道了文件夹的 I D,就没有必要遍历一个 F o l d e r s集合来再次访问这个文件夹。这样做的好处在讨论本页面结尾的客户代码时就会变得更清楚。
不幸的是,一个文件夹的 I D是一个 G U I D,很容易溢出一个查询字符串,因此为了方便访问一个特定文件夹的 I D,应把每个文件夹的唯一的文件夹 I D存储到一个会话变量中。
即使本书的重点是 A S P程序设计,也不可能完全忽略客户端代码。在本例中,客户端代码提供了与用户交互的能力。在客户代码块中有三个函数,下面一个一个地分析它们。
第一个函数,b t n L o g o u t _ O nCl i c k是最简单的函数,为用户提供了一个方便的方式来退出他们的邮件会话:
当单击此按钮时,浏览器转向 L o g o u t,a s p页面。此页面将结束当前的 M A P I会话,然后使浏览器回到 L o g i n,a s p页面。
下一个函数是 b t n N e w M s g _ O n C l i c k事件处理器。当用户想创建一个新的邮件消息时,就第 2 3章 A S P,C D O与 Exchange Serv e r计计 711下载
"","
单击此按钮:
按此按钮后使浏览器转向另一个 A S P页面 ( S e n d M e s s a g e,a s p ),允许用户发送一条消息。
此页面的最后一个函数是最有用的 G o F o l d e r函数:
它与 < D I V >标记一起工作,允许方便地选择一个文件夹来浏览它的消息。当用户单击任何一个文件夹名称时,就调用此函数。此函数的第一行能获得用户单击的 < D I V >标记的 I D。
这个 I D就是想要列出消息的文件夹的名称。此函数的第二行调用 M e s s a g e L i s t,a s p页面,并指定要显示消息列表的文件夹的名称。当 M e s s a g e L i s t,a s p载入时,能快速访问此文件夹并显示其中的消息。
现在已经知道 F o l d e r L i s t,a s p页面是如何把信息传送到 M e s s a g e L i s t,a s p页面的,下面来分析一下 M e s s a g e L i s t,a s p页面是如何处理这些信息的。
23.2.7 MessageList.asp
对用户来说,仅仅列出一个消息存储里的文件夹不是很有用,他们必须能够访问这些文件夹里的信息。 M e s s a g e L i s t,a s p提供了这种访问。下面是此页面的源代码:
712计计 ASP 3 高级编程 下载第 2 3章 A S P,C D O与 Exchange Serv e r计计 713下载与其他页面一样,第一步是获得用户当前的 M A P I会话:
一旦得到了 S e s s i o n对象,就可以访问其中的文件夹。在此页面中,仅想列出一个指定的文件夹的内容,这个文件夹由查询字符串变量指定。首先,把此名称存储到一个局部变量中以便于处理,接着用它把此文件夹的 I D从一个 S e s s i o n对象中提取出来:
然后,确定已获得的操作的类型 (如果有的话 )并设置合适的变量:
接下来检索出当前的 F o l d e r对象。由于这些页面在逻辑上是自引用的,在删除对象时就必须确保当前位置是在正确的文件夹中。另外,由于此页面也可能在查询字符串中没有指定文件夹的情况下载入 (例如用户第一次登录时 ),因此如果没有指定别的文件夹的话,页面就按缺省显示 I n b o x文件夹:
一旦获得了 F o l d e r对象,下一步就是检索在此文件夹中的消息。下面的代码是利用 F o l d e r
对象的 M e s s a g e s集合来完成这个任务:
接下来,代码会检查选定的消息是否将被删除或销毁。由于 D e l e t e方法是不能撤销的,把消息放到 Deleted Items文件夹中比立即销毁它们好一些。当然,当访问 Deleted Items文件夹时,
可永远删除它们:
714计计 ASP 3 高级编程 下载当用户单击一条消息的 D e l e t e或 D e s t o r y链接时,M e s s a g e L i s t,a s p就会带着查询字符串中指定的附加信息一起重新载入。这一代码段检查此信息,如果已经选定的信息将要删除,那么就删除选定的消息。此页面随后会继续执行,同时此 M e s s a g e s集合中减少一条消息。
紧接着要生成文件夹的视图。界面的第一部分是一个显示当前文件夹的标题栏:
此代码创建了一个灰色背景的段落风格,以便与消息列表区分开。当前文件夹的名称在此段落中显示。
接下来看一下此文件夹中的消息列表。为此,要使用文件夹的 Me s s a g e s集合。此页面首先检查 M e s s a g e s集合中是否有消息:
如果有消息,就创建一个列出每条消息的发送者、主题、优先级和发送时间的表。另外,
主题文本做成一个链接,允许用户通过点击消息的主题来查看它。这样做会载入
Vi e w M e s s a g e,a s p页面,同时在查询字符串中指定消息的 I D。
如果集合中没有消息,此页面就会向用户显示一条消息:
页面的最后一部分是 S h o w I m p o r t a n c e I c o n函数。此函数已在 I n b o x应用程序例子中提过,
这里就不再赘述。
通常,用户从此页面中选取一条消息来查看。此页面构造了一个指向 ViewMessage,asp的链接,同时指定需要显示的消息的 I D。下面分析 Vi e w M e s s a g e,a s p页面,并介绍如何显示选定的消息。
23.2.8 Vi e w M e s s a g e,a s p
任何邮件客户程序都必须能为用户显示单个消息及其细节。在 M a i l C l i e n t应用程序中提供此项功能的页面是 Vi e w M e s s a g e,a s p。当用户选定了要查看的消息时,浏览器如图 2 3 - 6所示。
Vi e w M e s s a g e,a s p的源代码为:
第 2 3章 A S P,C D O与 Exchange Serv e r计计 715下载
716计计 ASP 3 高级编程 下载要查看一条消息需要两条信息:它驻留的文件夹和它在文件夹的 M e s s a g e s集合中的位置。
这些细节都在查询字符串中提供了,检索它的代码如下:
第 2 3章 A S P,C D O与 Exchange Serv e r计计 717下载
>
图 23-6 运行 Vi e w M e s s a g e,a s p时的窗口知道了这些信息,下一步就是得到指定的文件夹的 M e s s a g e s集合,首先,需要得到当前的 MAPI Session对象,然后用它的 G e t F o l d e r方法访问所需的文件夹。最后,从文件夹的
M e s s a g e s集合中检索出代表所需消息的 M e s s a g e对象:
在 C D O N T S中,M e s s a g e对象有分别对应于 To,C C和 B C C收件人的属性。在 C D O中,消息的所有收件人都放在 R e c i p i e n t s集合中。为了产生 To,C C和 B C C收件人的列表,需要遍历
R e c i p i e n t s集合。以下代码产生显示 To和 C C收件人的字符串。
718计计 ASP 3 高级编程 下载对于在集合中的每一个 R e c i p i e n t对象,Ty p e属性用来决定它是一个 To收件人还是一个 C C
收件人。 C d o To类型的收件人的名称添会加到 s t r To字符串中,而 C d o C C类型的收件人的名称会添加到 s t r C C字符串中。
处理完了所有的必需信息,就构成了 H T M L。 R e p l y,Reply All和 F o r w a r d按钮就会显示出来。然后,消息的细节和主体就会在一个 H T M L表中显示出来。
此页面代码的最后一部分是客户端代码,用于处理用户点击 R e p l y,Reply All或 F o r w a r d
按钮。此代码调用 S e n d M e s s a g e,a s p页面,并指定关于此消息的必要信息及应对此消息执行的操作。
23.2.9 SendMessage.asp
S e n d M e s s a g e,a s p页面不仅仅是发送消息,也处理消息的回复和转发。例如,如果点击了
Vi e w M e s s a g e,a s p页面上的 R e p l y按钮,就会看到如图 2 3 - 7所示的屏幕。
图 23-7 在 Vi e w M e s s a g e,a s p页面上点击 R e p l y按钮时的屏幕注意,To字段已经添上了消息发送者的名称,B u ff y”,S u b j e c t字段已经添上了消息的主题,RE:This a sample message” 。 S e n d M e s s a g e,a s p页面的源代码如下:
第 2 3章 A S P,C D O与 Exchange Serv e r计计 719下载
720计计 ASP 3 高级编程 下载第 2 3章 A S P,C D O与 Exchange Serv e r计计 721下载由于此页面具有处理新消息、回复及转发消息的功能,所以页面的第一步是决定执行哪项操作。页面执行的操作在查询字符串变量 A c t i o n中传送:
最简单的情况是构成一条新消息,这时没有需要此页面处理的数据。然而,对于回复及转发消息,为了填充适当的字段变量,必须进行一些工作。邮件客户一般会填写 To,C C、
S u b j e c t和 B o d y字段。代码的这一部分会依据将要进行的操作 ( F o r w a r d,R e p l a y,R e p l a y A l l )为
To 和 C C字段生成合适的值。检索 M e s s a g e对象并分析它的 R e c i p i e n t s集合的代码与
Vi e w M e s s a g e,a s p页面的代码相同。此代码中新的部分是:
不管操作是什么类型,消息的主体都不会改变。 To和 C C的列表依赖于操作,此代码段也为它们设置正确的值。而且,会添加正确的前缀到主题中。
现在,你也许想知道为什么不使用 M e s s a g e对象的 F o r w a r d,R e p l y或 R e p l y A l l方法。虽然这些方法很有用,而且它们确实创建了正确的 To和 C C收件人,但是如果想允许用户编辑这些列表,它们不太方便。问题是为了显示此消息 (并允许用户进行编辑 ),就不得不分析整个 R e c i p i e n t s集合并生成 To和 C C列表。如果此任务是不经任何编辑就转发一条消息,那么使用 M e s s a g e对象的方法完成此任务是很好的。就现在的目的而言,这些方法确实没有多少用处。
此页面产生的 H T M L有可编辑的控件,控件被封闭在一个 < F O R M >标记中,其余的部分很像 Vi e w M e s s a g e,a s p页面。这个可编辑的输入控件允许用户在发送消息之前对此消息进行修改。 < F O R M >标记用来把所有的消息信息提交到 S e n d M e s s a g e,a s p页面,由该页面完成消息的实际发送。
23.2.10 SendMail.asp
此页面根本没有用户界面。它的唯一用途是使用传递进来的信息创建一个有效的消息,
并发送此消息。源代码如下:
722计计 ASP 3 高级编程 下载第 2 3章 A S P,C D O与 Exchange Serv e r计计 723下载在查询字符串中已指定了消息的所有细节,此页面的第一步操作是检索出这些值:
然后,在发件箱中添加一个新的 M e s s a g e对象。由于 S u b j e c t和 B o d y属性不需要进行处理,
这些属性就用查询字符串的值进行设置:
消息的 To,C C和 B C C收件人必须进行处理。在每一个处理循环中除收件人类型外,没什么差异,下面只分析对 To收件人的处理:
724计计 ASP 3 高级编程 下载每循环一次,一个收件人的显示名称就会从收件人列表中检索出来。对于每一个显示名称,在消息中增加一个 R e c i p i e n t对象。一旦在新的 R e c i p i e n t对象中设置了 N a m e和 Ty p e属性,
就调用 R e s o l v e方法以获得完整的消息地址,然后就用新的收件人更新此消息。此代码对于 To、
C C和 B C C收件人列表是相同的,只在收件人的 Ty p e属性上有所差异。
一旦处理了所有的收件人列表,设置了消息的优先级属性,最后要做的工作就是发送消息。这通过调用 M e s s a g e对象的 S e n d方法来完成:
由于此页面没有用户界面,用户将返回到 M e s s a g e L i s t,a s p页面。
2 3,2,11 Logout.asp
在本章结束之前,需要简单地分析一下 L o g o u t,a s p。此页面的功能是调用 S e s s i o n对象的
L o g o ff方法,然后载入 L o g i n页面:
到目前为止,M a i l C l i e n t应用程序全部完成。通过添加对不同文件夹类型的支持和高级的邮件选项,它还有很大的扩充余地。
23.3 小结
C D O和 C D O N T S都在进行发展。在 1,2版中,虽然对象生成的可能的格式还不够丰富,而且还不能与 O u t l o o k提供的视图相比,然而 C D O已经添加了一些重要的 H T M L表现功能。还有,
某些 O u t l o o k / E x c h a n g e的特性也没有包括在 1,2版的 C D O中。 C D O没有为 C o n t a c t I t e m、
J o u r n a l I t e m或 Ta s k I t e m提供一个对象。如果将来实现了这些对象并包含在 C D O中,更适合的办法是生成完整的应用程序,以替代 O u t l o o k。
然而,正如从 MailClient We b应用程序看到的,C D O库为处理消息提供了更加细致完美的方法。
这使得它的编程比 C D O N T S复杂一点,但是复杂的编程换来了对消息系统更大的控制权。
总的来说,对于一个只涉及到一些非常简单的消息处理和仅需从一个 A S P应用程序中发送邮件的 We b页来说,C D O N T S是一个明智的选择。对于任何可能需要更复杂的消息 /邮件功能的 A S P应用程序,C D O和 Exchange 5.5是很值得采用的。
第 2 3章 A S P,C D O与 Exchange Serv e r计计 725下载