下载第 22章 ASP和用于 NT服务器的 CDO
在前面几章中,我们已经了解了如何使用 A S P源代码在 Microsoft BackOff i c e中插入一些应用程序和服务。在本章中,将通过使用数据协作对象 (Collaboration Data Objects,
C D O )来集中研究 E - m a i l应用程序和服务之间的相互作用。特别是,将介绍 C D O的一个子集,
即用于 N T服务器的数据协作对象 (Collaboration Data Objects for Windows NT Server,
C D O N T S )。
先从 C D O的演化发展以及 C D O和 C D O N T S的区别开始,然后再研究 C D O和 C D O N T S的发展趋势。
作为本章的主体,将研究 C D O N T S对象模型,通过一些利用 C D O N T S的应用程序例子来总结一下 C D O N T S。下一章将更进一步地研究 C D O。
22.1 CDO是什么
C D O技术给开发者提供用于提供简单消息服务的简易方法,它是 M i c r o s o f t对象库的最新版本。除此之外,C D O也能够利用 Microsoft Exchange Server所提供的功能。在第 2 0章中,曾把 M S M Q比做应用程序的 e - m a i l。在本章中,将看到 C D O才是真正的应用程序的 e - m a i l。
CDO 1.1以前的版本,都被命名为,OLE Messaging”,其 1,1版本用一个新的名字
,Active Messaging”来命名。而现在的 1,2版本则被命名为数据协作对象 ( C D O )。这个对象库代替了先前的版本,并随 Microsoft Exchange Server 5.5提供,除此之外,还可以在 M i c r o s o f t
We b站上获得。 C D O兼容以前的版本,使用 Active Messaging 1.1写的源代码不需任何修改就能够在安装有 C D O的机器上运行。
有了 C D O,程序员不仅可以完成一些简单的收发邮件,工作而且能够利用 M i c r o s o f t
Exchange Server来提供日历、协作和工作流程等功能。另外,C D O能被客户、服务器应用程序或二者使用。
对于编程,C D O能够用于 V B ( 3,0以上版本 ),C/C++(Microsoft 1.5以上版本 ),V B S c r i p t和
J S c r i p t。因为 C D O被设计为用于交换,在此对象库中是没有用户界面 ( U I )元素的。然而,
C D O包含的一些表现对象,具有提供生成 H T M L以在浏览器中显示的能力 ( C D O以前的版本也提供此项功能 )。
22.2 使用 C D O的原因由于 C D O可以用于 V B S c r i p t和 J S c r i p t,因此可在 A S P页面中使用,使 We b应用程序能够创建一些邮件和消息。即使大部分用户已经有了一个邮件客户,但仍有一些迫不得已的原因让他们再拥有一个 We b邮件客户。
能用 C D O生成一个不需要用户下载任何组件 ( A c t i v e X或插件 )的网站,也允许用户从任何
We b系统访问他们的邮箱。例如,H o t m a i l就是 We b邮箱接口的一个例子。
从 A S P的另一面看,在许多的情形下,We b服务器具有发送邮件的能力对应用程序是很有益的。比如,应用程序将能够:
用户预订东西时,发送确认预订的邮件。
某个操作失败时,发送管理邮件给 We b管理员。
处理邮件收件人数据库清单,然后给每个收件人发送一个消息。
可能发生的事是无止境的,尤其是 C D O创建的客户和服务器类型。 C D O提供了一个对象库,使消息收发的编程和实现简单化。
22.2.1 NT服务器下的 C D O
在许多情况下,开发者可能不想使用 Exchange Server及 C D O的日历、协作和工作流程功能,而仅关注于简单邮件消息的收发,那么他们应使用 C D O N T S。
C D O N T S是 C D O功能的一个子集,它为应用程序提供一个可靠、快速、可扩展的消息机制,而不必使用 Exchange Server和 C D O提供的更先进的日历计算与工作流程。
C D O N T S是作为 SMTP Service的一部分安装的,包含在 Windows 2000 Server的一个可选组件中。由于 C D O N T S组件是 C D O对象库的一个子集,它们既可以依靠 Windows 2000中的
SMTP Service工作,也可以依靠 Exchange Server(5.5以上版本 )工作 (但必正运行有 S M T P
S e r v i c e,而且不需改动任何代码。正像 C D O N T S是 C D O功能的一个子集一样,Windows 2000
的 SMTP Service组件没有提供 Exchange 5.5中提供的所有功能。
C D O N T S是开发者用来创建有邮件和消息能力的应用程序的简单对象库。
作为 C D O N T S的一个简单例子,下面看一下使用 N e w M a i l对象发送一个邮件消息到底需要什么。有了这个对象,开发者可使用下列两行简短的代码来发送一个 e - m a i l。
虽然还没有深入讨论这个 C D O N T S对象,但你也能从这个例子看出,编写一个简单的发送邮件的程序是非常容易的。
22.2.2 CDO与 C D O N T S的比较在编写能够收发消息的应用程序时,首先要决定选择使用 C D O还是使用 C D O N T S,假如需要在两者中作一个选择的话,那么记住它们的设计目标是非常重要的。
CDO在影响 Exchange Server 5.5和支持其更先进的特性方面表现优良。
C D O N T S在开发快速、大规模的邮件应用程序或向已存在的应用程序添加消息和邮件能力方面表现很好。
假如需要支持日历、讨论、更复杂的消息收发、公共文件夹和工作流程管理等,那么
CDO 1.2版本是一个较好的选择。相反,假如想创建一个能够处理简单的邮件消息的应用程序,
则 C D O N T S更为适合一些。
648计计 ASP 3 高级编程 下载注意 C D O N T S应用程序与 C D O应用程序是兼容的,而不是相互抵触,这一点也是很重要。
因为 C D O N T S自身不含有任何 M A P I功能,也就是说它没有 A P I支持收发 e - m a i l,与此相反,
C D O N T S工作于 I I S或与 Microsoft Exchange Server联合在一起的 I I S上。
必须注意到 C D O能运行在 Windows 2000的 SMTP Service上或 Exchange Server 5.5
上。
然而,为了实现运行平台从 I I S / S M T P平台到 Exchange Server平台的升级,将需要使用
Exchange IMS向导,此向导删除 I I S的 SMTP Service,而代之以 Exchange Server。
2 2,3节研究 C D O N T S库,虽然它与 C D O拥有的大量功能相比功能是有限的,但它对使用
A S P创建的大部分简单应用程序是有效的。然后介绍 C D O库提供的附加对象以及 C D O与
C D O N T S的一些不同之处。
22.2.3 CDO for Windows 2000
除 C D O N T S和 C D O库外,还有第三个与 C D O N T S和 C D O不同的数据协作对象库,以前称为 CDO 2.0,现在将其命名为 Windows 2000。它随 Windows 2000的所有版本提供此版本与
C D O N T S相比功能更为强大,但不支持利用 C D O所提供的消息收发特性和功能。不像前两个
C D O库,CDO for Windows 2000不对 M A P I协议提供任何支持。因此,只能限制使用在
Windows 2000的 S M T P或 N N T P服务上。到编写本书时,CDO for Windows 2000仍然是处于版。尽管这样,仍然有些关键点应该注意。
CDO for Windows 2000第一个要注意的是它提供双重接口。即包含在 CDO for Wi n d o w s
中的每个 C O M组件都实现一些接口,这些接口允许组件在支持 C O M或自动化的编程语言中使用。
CDO for Windows 2000库也引入了一种新的依赖性。为了使 CDO for Windows 2000准确无误地工作,系统必须安装有 Microsoft ADO 2.5组件。在 Windows 2000操作系统中包含这个组件 (缺省时 ),不需要用户单独安装。 CDO for Windows 2000使用 A D O来为开发者提供了一个用来访问消息信息的一致的数据访问方法。
功能上,CDO for Windows 2000也与 C D O和 C D O N T S库有不同之处。除了具有同样的收发消息的功能外,CDO for Windows 2000库还支持事件的嵌入,这一功能允许开发者创建一些应用程序,拦截到达服务器的消息和新闻组邮件,并访问其中的信息。根据这些信息或邮件的内容,应用程序可以做一些诸如拒收消息、添加符号或别的文本等操作,
也可做病毒扫描和其他的一些操作。
正如先前所提到的,CDO for Windows 2000库仍然是 版,且它的功能也可能会变化。因此,对这一问题将不做深入的阐述,而将精力集中于 C D O库和 C D O N T S
库。
22.3 CDONTS库在使用一个组件时,第一步要做的就是搞清楚它的对象模型,下面将浏览 C D O N T S组件的对象模型。如图 2 2 - 1所示,这个对象模型是很直观的,而且不太大。
C D O N T S对象模型的主体由 S e s s i o n对象和其子对象构成。正如我们所看到过的,对于每第 2 2章 A S P和用于 N T服务器的 C D O计计 649下载个从服务器请求页面的用户,创建一个 ASP Session对象,它用来为指定用户保存信息。同样,
一个 CDONTS Session对象为每个登录进邮件服务器的用户创建,并包含此用户的特定信息。
除了 S e s s i o n对象外,C D O N T S还提供 N e w M a i l对象。下面将先从研究简单的 N e w M a i l对象开始,然后深入到 S e s s i o n对象。但是第一步,先看看如何引用类型库。
图 22-1 CDO N T S组件的对象模型
22.3.1 引用类型库当用 C D O N T S编程时,你可能会发现使用常量 (例如 C d o B o d y F o r m a t H T M L )代替与他们相关的值 ( C d o B o d y F o r m a t H T M L代表 0 )是很有用的。要加入一个类型库的引用,需要编辑
g l o b a l,a s p文件:
这个语法考虑到了 F i l e,U U I D,Ve r s i o n和 L C I D属性,U U I D对此类型库是全局唯一的,但是在多个安装间是一致的。
一旦在 g l o b a l,a s p中添加了这个 M E TA标记,就能在 A S P页面中使用 C D O N T S常量。它们能够减轻你记忆一些特定值的工作量。因此,不必记住 C d o H i g h等于 2,在 A S P程序中可以只使用 C d o H i g h常量。
另一个有用的小技巧是在所有的 A S P文件的顶端包含 <%Option Explicit%>。然后,假如要使用一个未声明的常量,在执行 A S P程序代码时,将得到一个错误。假如没有声明 Option Explicit,V B S c r i p t将把常量作为没有声明的变量,并给它分配 0值,
650计计 ASP 3 高级编程 下载发现这一类错误很难。
22.3.2 NewMail对象
N e w M a i l对象允许简单快捷地在 We b页上添加一个简单的邮件发送功能,下面几行程序将创建并发送一个邮件消息:
现在,分析一下这段程序是如何工作的。
程序运行时,就和 SMTP Service建立了一个连接,并且一个 S M T P消息发送到 J e a n i e @
R i g h t H e r e,c o m,消息的主题是,G r e e t i n g s”,主体是,How have you been?” 。当浏览此消息时,它看上去像是从,J o h n i e @ A n y w h e r e,c o m”发出的。
发送一个新的邮件消息的第一步是创建一个 N e w M a i l对象实例,程序的第一行就起到这个作用。程序的第二行发送消息,编排发送代码使用的是 S e n d方法的参数。在这一章稍后的部分将研究 S e n d方法的更多细节。现在,仅给出此方法的语法:
程序的第三行释放 N e w M a i l对象实例及所占用的的资源。该程序不需要开发者全面了解
F o l d e r对象或 M e s s a g e对象,也不需要用户登录。
程序中工作的主体在第二行,消息的所有重要信息都在 S e n d方法的参数中指定。另外,
也可以指定 N e w M a i l对象的每个属性值,如:
这九行代码和先前的三行代码一样创建同一消息,它们具有相同的功能。不同之处是这段代码具有更强的可读性,并且阅读者不必了解 S e n d方法的语法。这种代码特别适合属性包含多种值、信息量很大或很长的情况。当程序没有按期望执行时,这种代码比较容易调试。
这种方法的缺点是较复杂,当仅想发送一个简单的消息时,使用指定了参数的 S e n d方法是一种较好的方式。
正像先前所提到的,使用 N e w M a i l对象发送邮件不需要登录,这就允许发送匿名邮件,
除此之外,还可以模仿他人的邮件,它使开发者可以指定邮件是来自谁的。匿名邮件可通过不指定 F r o m属性来发送。
1,TO,C C和 B C C属性在先前的例子中,你可能已经注意到对于收件人必须指定完全限定的消息地址
( J e a n i e @ R i g h t H e r e,c o m )。
在 C D O N T S领域中,没有别名或地址簿之类的东西。每一个收件人必须用完全的 S M T P地址来指定。
第 2 2章 A S P和用于 N T服务器的 C D O计计 651下载
N e w M a i l对象允许为消息指定其 TO,C C和 B C C收件人,例如:
使用这些属性,消息将被发送到 J e a n i e @ R i g h t H e r e,c o m,J e a n i e s B o s s @ R i g h t H e r e,c o m将得到消息的副本,S t e v e @ R i g h t H e r e,c o m将得到消息的隐蔽副本。
B C C行上的任何收件人都得不到其他收件人的信息,同理,任何 TO或 C C收件人清单上的收件人也不知道消息副本发送给了 B C C收件人。在有多个 B C C收件人的情况下,B C C收件人不会察觉到其他的收件人。
可以给 TO,C C和 B C C属性指定多个名字 (地址 )。发送一个消息给多个收件人,只需用分号隔开各个地址就行了。
一个消息只能有一个发送者,故 F r o m属性永远不需要一个以上的地址。
2,Importance属性
N e w M a i l对象有一个 I m p o r t a n c e属性,允许设置邮件消息的优先级 (重要性 ),优先级有三个不同的值,它们中的每一个都在 C D O N T S,D L L库中有一个常量与之相对应:
高,C d o H i g h或者 2
正常,C d o N o r m a l或 1
低,C d o L o w或 0
消息缺省的优先级为正常。要设置消息的优先级为高或低,只需要分别设 I m p o r t a n c e属性为 C d o H i g h或 C d o L o w:
S e n d方法也允许指定消息中的主要信息。在第一个例子中,没有指明其优先级,它是一个任选参数,可用下面的方式来指明:
消息优先级的设置可能在其传送中不能起到任何作用,这一点非常重要。虽然一些服务器也有加速分发优先级最高的消息的功能,但不是所有的在传递线路上的服务器都有这种功能。类似,收件人的邮件客户也可能不能区分重要性不同的消息。
虽然有很多邮件客户能基于优先级来区分,但这不是普遍的,不能保证所有的收件人都有一个支持此功能的邮件客户。
3,邮件消息的主体
B o d y属性指明消息的主体内容,它可能是普通文本或 H T M L。例如,可以创建一个普通文本的主体,如下:
在缺省情况下,所有的消息都是格式化后的普通文本。
另外,可以发送有 H T M L格式主体的消息。要做到这一点,首先需要设置 N e w M a i l对象的
B o d y F o r m a t属性为 C d o B o d y F o r m a t H T M L,然后设置 B o d y属性为一个 H T M L格式的字符串:
652计计 ASP 3 高级编程 下载如果想在 H T M L消息的主体中包含多个 U R L,可以使用 C o n t e n t L o c a t i o n和 C o n t e n t B a s e属性。将它们放在一起,这些属性为包含在 H T M L消息主体内所有的 U R L提供了一个绝对路径,
它不仅包括与主体关联的 U R L,而且包括任何可能包含在主体的 H T M L标记中的 U R L:
C o n t e n t L o c a t i o n属性允许为包含在 H T M L消息主体内的所有 U R L指定一绝对或相对路径。
ContentBase属性允许为所有包含在消息主体内的 U R L指定一个基本路径。
当 C o n t e n t L o c a t i o n属性为非空 (不等于”,)时,消息主体内的所有 U R L作为相对路径来解释,相对于在 C o n t e n t L o c a t i o n属性中指定的路径。当 C o n t e n t B a s e属性也为非空时,
C o n t e n t L o c a t i o n路径被作为相对路径来解释,它相对于在 C o n t e n t B a s e属性中指定的路径。
这可能有点混淆不清,用一个例子来分清这两种情况:
第 2 2章 A S P和用于 N T服务器的 C D O计计 653下载当浏览器显示 G r e a t D a y,j p g文件时,它将把 C o n t e n t B a s e和 C o n t e n t L o c a t i o n属性值作为路径的前缀。在这种情况下,浏览器将显示的文件是 h t t p,/ / w w w,a n y w h e r e,c o m / p i c t u r e s /
G r e a t D a y,j p g。
在局域网设置中可能碰到过另一种情形。比如,一些公司设置一个不是 We b服务器的文档服务器,使用 h t t p格式的路径不能访问这个服务器,但 C o n t e n t B a s e和 C o n t e n t L o c a t i o n属性允许使用 U N C路径,例如:
4,附件
N e w M a i l对象有一个允许往消息里添加附件的方法,这个方法称为 A t t a c h F i l e,其语法描述如下,参数及说明如表 2 2 - 1所示。
表 22-1 AttachFile 方法的参数及说明参 数 说 明
s o u r c e 必须有,作为附件的文件的完全限定路径
F i l e N a m e 可选,在邮件客户浏览时在附件下显示这个标题
E n c o d i n g M e t h o d 可选,附件编码的方法,缺省的方法是 U U E N C O D E,可能的编码格式还有 C d o E n c o d i n g U U e n C o d e和 C d o E n c o d i n g B a s e 6 4
要发送一个带附件的消息,可以用如下程序:
A t t a c h F i l e方法把文件 C,\ I n v e n t o r y L i s t i n g,x l s作为一个附件添加到消息中,附件的标题就是 Inventory Report,没有指定编码格式,因此附件将使用 U U E N C O D E编码。所有附件都缺省用 U U E N C O D E来编码,除非改变了 M a i l F o r m a t属性或在 A t t a c h F i l e方法调用中指定了编码格式。
5,MailFormat属性用 N e w M a i l对象创建的消息的缺省邮件格式是普通文本。 M a i l F o r m a t属性允许在
MIME(Multipurpose Internet Mail Extension,多用途的网际邮件扩充 )和普通文本格式中选择一个。普通格式文本 ( C d o M a i l F o r m a t Te x t )使用 R F C 8 2 2和 U U E N C O D E格式化消息,M I M E格式 ( C d o M a i l F o r m a t M I M E )将邮件格式化为 M I M E格式。
M I M E格式为在混合网络和消息环境传递大量的消息内容而设计。
要改变使用的格式为 M I M E格式,可以这样设置 M a i l F o r m a t属性:
654计计 ASP 3 高级编程 下载也可以再把 M a i l F o r m a t改回为 C d o M a i l F o r m a t Te x t。
邮件格式的任何变化都只能适用于当前的 N e w M a i l对象,这些变化不影响在将来被实例化的任何 N e w M a i l对象的缺省邮件格式,缺省邮件格式将一直是普通文本。
改变 M a i l F o r m a t属性也会影响消息的缺省编码格式。对于普通文本格式的消息,附件使用 U U E N C O D E格式来编码;对于 M I M E格式的消息,附件使用 B a s e 6 4来编码。
同样,假如指定使用 B a s e 6 4格式来编码一个附件,那么与之相应的消息的格式将是
C D O M a i l F o r m a t M I M E。
6,格式选项因为有许多编码和格式化的可能方式,因此,不得不判断哪一个是最适合的。答案除了取决于发送消息的目的外,还取决于消息收件人的身份。下面有一些选择格式的原则:
当使用 C D O N T S仅仅发送简单的管理邮件或信息邮件到一个小组或用户自己时,关心消息的内容而不是它的格式。将消息格式化为 H T M L格式将多做些工作,这种情况下,得不到任何益处。无论消息是 H T M L格式还是普通文本格式,得到的都是同一信息。所以仅需使普通文本格式。
假如想使用 C D O N T S编排并发送邮件到邮件清单或订阅者之类的大组,那么格式就可能相对很重要。这种情况下,可能要额外花时间来创建一些能更好地显示发送者想法的
H T M L,可以使用 Visual InterDev,F r o n t P a g e和其他 H T M L制作工具来创建 H T M L并把它粘贴到 A S P页面中。
考虑消息的大小。一般来说,普通文本格式的消息相对较小。当使用 H T M L格式时,大量的标记和其它文本加入到消息中,这可能极大地增大了消息的大小,这些很大的邮件可能使收件人花费很长的时间去下载。虽然现在网络在加速,但那些相当大的文档 (带有大量图片或附件 )仍可能花费大量时间和上网。
应该考虑发件人的邮件客户,虽然很多的邮件客户都有处理 M I M E消息的能力,但仍有许多用户的邮件客户并不支持 M I M E。假如不能确定收件人的邮件客户的能力,就应该使用最通用的格式,对 e - m a i l来说,这应是普通文本。
7,修改消息的报头
N e w M a i l对象除了能提供一个从 A S P页面又快又简捷地发送邮件的方法外,它还有一些更高级的功能。在第一个例子中,你看到了如何用三行代码来发送一条消息:
在 Microsoft Outlook中打开这一条消息,
如图 2 2 - 2所示。
大多数邮件客户允许浏览消息的全部源码。在 Outlook 2000中打开消息,可以单击
Vi e w | O p t i o n s来浏览 Internet Headers列表栏中的所有消息报头,消息的实际源码如下所示。
第 2 2章 A S P和用于 N T服务器的 C D O计计 655下载图 22-2 Microsoft OutLook 中显示的消息可以看出包含在消息中的信息比包含在消息主体中的的信息多得多。阅读消息时有许多邮件报头没有显示出来。大部分报头消息都基于 N e w M a i l对象属性的设置值或作为 S e n d方法的参数,邮件服务器在处理消息时在报头中产生其他信息:
可以使用 N e w M a i l对象的 Va l u e集合来设置自己的报头值,并为将要发送的消息创建报头,
这样做的一个原因是,不是所有的消息服务器都能够解释一些不是通过 N e w M a i l对象自动产生的报头。另一方面,也可能有些服务器不能解释定制的报头,这种情况下,服务器将忽略不能解释的报头。
对于这些报头的更多信息,例如 K e y w o r d s,R e f e r e n c e s和 R e p l y - To报头,可在
h t t p,/ / w w w.cis.ohio-state.edu/htbin/rfc/rfc733.html 看到 A R PA互联网文本消息的格式标准 ( S T D 0 11 )。
下面的程序就添加了一个 K e y w o r d s报头:
当再来看消信息的源码时,可以看到已经添加了一个 K e y w o r d s报头:
N e w M a i l对象缺省的属性是 Va l u e集合,所以下面的代码可起到同样的效果:
656计计 ASP 3 高级编程 下载对加到 Va l u e集合上的项目个数是没有限制的,添加的每一个项目都将创建消息的另一个报头:
8,Ve r s i o n属性
N e w M a i l对象的 Ve r s i o n属性返回的是正在执行代码的 C D O N T S库的版本,下面程序可得到一个包含版本信息的字符串:
当前的 Ve r s i o n属性将返回字符串,1,2” 。
9,Send方法本章已使用过 N e w M a i l对象的 S e n d方法。使用 S e n d方法和列出参数,尽管不能使程序在可读性和易调试方面达到完美。但是,它仍然在一些应用程序中很有用,不应该完全忽视。
这儿有一个 S e n d方法的参数列表。
S e n d方法的参数及说明如表 2 2 - 2所示。
表22-2 Send方法的参数及说明参 数 描 述
F r o m 可选,字符串,消息发送者的地址
To 可选,字符串,消息收件人的清单
S u b j e c t 可选,字符串,消息的主题
B o d y 可选,字符串,消息的主体
I m p o r t a n c e 可选,长整型值,消息的优先级,缺省为 1 ( C d o N o r m a l )
如表 2 2 - 2所示,这些参数每个都是可选的。若它们为空的话,N e w M a i l对象就会使用缺省值。所有字符串参数缺省为空的字符串,I m p o r t a n c e缺省为 1 ( C d o N o r m a l )。
总之,为参数指定一些值在功能上与单独设置属性没有什么不同。然而有一个例外,若用 S e n d方法指定了收件人清单,而 N e w M s a i l对象的 To属性也指定了收件人清单,则消息将发往两个清单上的每一个收件人。
10,NewMail对象小结在讨论 C D O N T S提供的其他对象之前,先总结一下 N e w M a i l对象的要点:
C D O N T S库没有提供用户界面,也别指望和任何一个用户交互。因此,没有一个
N e w M a i l对象的属性 (除了 Ve r s i o n )能够运行时被读。所有的属性 (除了 Ve r s i o n )都是只写型的。与此有关的一个例子是,一旦一个报头或附件加到消息上,就不能删除它。要在收件人清单上删掉一个收件人,需要先删除收件人清单上的所有收件人,然后再添加上第 2 2章 A S P和用于 N T服务器的 C D O计计 657下载所需的收件人。
N e w M a i l对象是不能重复使用的。一旦在一个实例中调用了 S e n d方法,就不能再使用此实例,假如想在没有实例化一个新的 N e w M a i l对象实例时调用 S e n d方法,有可能在 A S P
代码中出现一个运行期错误,发送的每一个消息都需要创建一个新的 N e w M a i l对象实例。
N e w M a i l对象与 C D O N T S库提供的其他组件是分离的。大部分对象都在 S e s s i o n对象层下面,那些对象提供了非常高级的功能,允许创建更加复杂的应用程序,在需要做一些不仅仅是发送 e - m a i l的事情时,其他的对象更胜任这些任务。
22.3.3 其他的 C D O N T S对象现在将精力集中在 S e s s i o n对象及其以下的对象。
你也许会想到像发送消息这样的简单操作使用 S e s s i o n对象比使用 N e w M a i l对象所用的代码更多,这样认为是对的。但更多的代码换来了更的控制能力和更多的功能。
1,Session对象
S e s s i o n对象包含缺省消息信息、访问收件箱和发件箱以及绑定到一个用户的邮箱所需要的所有信息。在 C D O N T S库中,只有两个顶层对象,N e w M a i l和 S e s s i o n,用户的所有会话设置和选项都存储在这个用户的会话的 S e s s i o n对象中,S e s s i o n对象有四个方法。
Logon SMTP。
Logoff。
GetDefaultFolder。
SetLocaleIDs。
(1) LogonSMTP方法
L o g o n S M T P方法初始化 S e s s i o n对象,并将其绑定到指定的邮箱上,其语法结构如下:
objSession.LogonSMTP(DisplayName,Address)
L o g o n S M T P方法的参数及说明如表 2 2 - 3所示。
表 22-3 LogonSMTP方法的参数及说明参 数 描 述
D i s p l a y N a m e 必有的,登录用户的显示名
A d d r e s s 必有的,登录用户的完全 e - m a i l地址在使用一个 S e s s i o n对象之前,必须实例化它,并且必须成功执行 L o g o n S M T P方法。如果在调用 L o g o n S M T P方法之前,调用 S e s s i 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错误。
注意,有一个例外:可以在成功调用 L o g o n S M T P之前调用 S e t L o c a l e I D s方法。
于是,为了访问一个用户的信息,可这样做:
在上面程序中,首先创建一个新的 S e s s i o n对象。然后,在最后一行,使用用户的显示名
658计计 ASP 3 高级编程 下载和消息地址初始化会话。另外会话也被绑定到指定的 S M T P邮箱 ( J a c k R @ a n y w h e r e,c o m )。一旦初始化,就可以访问这个用户的消息。
要连接到另一个邮箱,可以创建另一个 S e s s i o n对象,或者调用 L o g o ff方法后用新的设置调用 L o g o n S M T P方法。
注意到 L o g o n S M T P方法没有执行任何身份验证是很重要的。这个方法仅设置了
S e s s i o n对象的属性,它们不一定是合法的。甚至指定了一个无效的或不正确的 e -
m a i l地址,也不会返回任何错误。 L o g o n S M T P方法仅会初始化这些值并试图绑定到指定的邮箱,很明显,有时可能不能正确地投递消息。
(2) GetDefaultFolder方法
G e t D e f a u l t F o l d e r方法为消息存储返回一个缺省的收件箱或发件箱的文件夹,此方法的语法为:
方法仅有一个参数 f o l d e r Ty p e,它可以是下列两个值中的一个:
根据 f o l d e r Ty p e的值,方法将为当前的消息存储返回缺省的收件箱或发件箱的文件夹,使用 C D O N T S,在 G e t D e f a u l t F o l d e r方法中没有别的文件夹可利用。
如下的程序创建了一个新的会话,并得到收件箱文件夹:
这个方法在 I I S平台和 IIS/Exchange Server平台都可以使用。而 IIS/Exchange Server代替
I I S / S M T P作为后端平台时更有用。当 Exchange Server是后端平台时,这个方法允许开发者编程访问用户的,C a l e n d a r”,,C o n t a c t s”和别的 E x c h a n g e文件夹。我们将在本章稍后进一步研究文件夹对象。
(3) SetLocaleID方法
S e t L o c a l e I D方法允许程序员指定标识符定义会话的“地域” ( L o c a l e ),即:基于语言、文化和习俗的环境特征,包括日期和时间的格式、货币符号的显示、排序次序和所使用的字符集。该方法的语法为:
方法的唯一参数是代码页标识符 C o d e P a g e I D,它是一个长整型值。
关于代码页的更多信息和细节可在 Windows 2000文档中找到。
有两个关于 S e t L o e a l e I D方法的关键之处要注意。第一,必须在执行 L o g o n S M T P方法前调用 S e t L o c a l e I D方法。第二,必须要检查指定的 C o d e P a g e I D以确保它是合法值,否则,将会得到一个 C d o E _ I N VA L I D _ PA R A M E T E R错误。
第 2 2章 A S P和用于 N T服务器的 C D O计计 659下载
(4) Logoff方法会话一旦完成,就要调用 L o g o ff方法结束会话,释放 S e s s i o n对象:
L o g o ff方法停止 S e s s i o n对象上的所有活动,终止对 S M T P邮箱的绑定,并清除 S e s s i o n对象的设置,通过再次调用 L o g o n S M T P方法可重新使用这个 S e s s i o n对象。
(5) 共有属性
S e s s i o n对象层次中的每一个对象都有一套与其他对象共有的属性,分别是 S e s s i o n,C l a s s、
P a r e n t和 A p p l i c a t i o n。
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 2 - 4
所示。
表 22-4 Class属性的值与对象类型的关系值 对象类型
0 S e s s i o n
2 F o l d e r
3 M e s s a g e
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
AddressEntry对象的父对象为一个 M e s s a g e对象最后,A p p l i c a t i o n属性返回一个当前应用程序名的字符串,当在 C D O N T S库的一个对象上调用时,它返回 Collaboration Data Objects for NTS Version 1.2。
(6) Session对象的属性除了所有 C D O N T S对象共有的属性外,S e s s i o n对象还有一些当前会话所特有的属性,这些属性和它们的返回值如表 2 2 - 5所示。
表 22-5 Session对象的属性及说明属 性 描 述
I n b o x 只读,当前会话的收件箱的 F o l d e r对象
O u t b o x 只读,当前会话的发件箱的 F o l d e r对象
M e s s a g e F o r m a t 可读写,返回或设置消息的格式 /编码,可能是 C D O M i m e ( M I M E消息 )或
C D O Te x t (普通文本消息 )
N a m e 只读,当前会话的显示名
Ve r s i o n 只读,C D O N T S库的版本
660计计 ASP 3 高级编程 下载
2,Folder对象
F o l d e r对象代表一个文件夹或容器,F o l d e r可以包含消息、文档和窗体、标准的文件夹是收件箱 ( I n b o x )和发件箱 ( O u t b o x ):
Inbox是收入邮件的投递场所,收件人的所有邮件都将投递到 I n b o x中。
O u t b o x是发送邮件暂时存放之处,要发送的消息先被放进 O u t b o x文件夹,当处理时消息被发送出去。
F o l d e r对象提供了访问指定文件夹的内容的方法。虽然我们能够访问消息,然而我们所能做的能改变它的唯一事情就是删除整条信息。 C D O N T S不允许修改的有:
附件 (添加或删除 )。
任何 TO,C C或 B C C收件人清单。
任何消息属性,甚至那些可写的属性也不可以修改。
(1) Folder对象属性除了共有属性,F o l d e r对象有表 2 2 - 6所示的属性。
表 22-6 Folder对象的属性及说明属 性 说 明
N a m e 只读,文件夹的显示名
M e s s a g e s 只读,文件夹中消息的集合
(2) Messages集合
M e s s a g e s集合为零或者多个 M e s s a g e对象的集合。对于 F o l d e r对象,M e s s a g e s属性返回一个文件夹中包含的所有 M e s s a g e s对象的集合,M e s s a g e s集合有一些属性和方法,使用它们可以很容易地访问消息和修改 M e s s a g e s集合。
a,Messages集合的属性
M e s s a g e s集合有二个附加的属性,如表 2 2 - 7所示。
表 22-7 Messages集合的属性及说明属 性 说 明
C o u n t 只读,返回 M e s s a g e s集合中 M e s s a g e对象的数目
I t e m 只读,从 M e s s a g e s集合中返回一个 M e s s a g e对象可以使用 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集合的缺省属性,下面的代码可起到相同的作用:
当用 C o u n t属性得到集合的大小后,可以用下面的程序来遍历整个集合。
第 2 2章 A S P和用于 N T服务器的 C D O计计 661下载
b,Add方法这个集合还有一个 A d d方法,允许往集合中添加新的消息。当执行这个方法时,将创建一个新的 M e s s a g e s对象,并把它加入到集合中,然后返回对这个 M e s s a g e s对象的引用。这样就可以添加一个消息,然后修改消息及其属性而不必先在集合中找到它。
A d d方法的语法结构为:
其参数及说明如表 2 2 - 8所示。
表 22-8 Add方法的参数及说明参 数 说 明
S u b j e c t 可选,消息的主题行
Te x t 可选,消息的主体文本
I m p o r t a n c e 可选,消息的优先级设置,缺省为 1 ( C d o N o r m a l )
下面的程序将添加一个新的消息到 O u t b o x:
假如不知道 R e c i p i e n t s集合如何工作的话也不必担心,在研究 M e s s a g e s对象时将讨论他。
c,Delete方法需要在集合中添加一个消息,同样也需要在集合中删除一个消息。你可能首先想到调用在 M e s s a g e s集合的 D e l e t e方法,错了!那将删除集合中所有的消息,这个操作是不可取的。而且删除后也不能取消删除操作,所以在程序涉及删除操作时一定要加倍小心。
假如想从集合中仅删除一个消息,应当调用那个 M e s s a g e s对象的 D e l e t e方法。另一方面,
如果想删除 I n b o x中所有的消息,可以使用下面的方法:
d,GetFirst,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 i r 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方法,这些方法分别返回 M e s s a g e s集合中的第一个、下一个、最后一个或前一个消息。假如不能得到要返回的消息,将返回 N o t h i n g。
集合中消息的顺序是未知的,所以返回消息的顺序将难以预料,在处理 M e s s a g e s集合时,
应将集合作为没有排序的集合处理,也不应去假想它的顺序是什么样子的。下面的程序将显示 I n b o x中所有消息的主题行:
662计计 ASP 3 高级编程 下载
(3) Message对象
M e s s a g e对象描述了消息存储中的一个对象,它可以是一个 e - m a i l消息、一个文档或文件夹中的一个窗体,可通过 M e s s a g e s集合访问 M e s s a g e s对象。
a,Message对象的属性除了公共属性外,M e s s a g e对象还有如表 2 2 - 9所示的属性。
表 22-9 Message对象的属性及说明属 性 描 述
A t t a c h m e n t s A t t a c h m e n t对象或其集合
C o n t e n t B a s e M I M E消息内容主要报头
C o n t e n t I D M I M E消息内容 I D报头
C o n t e n t L o c a t i o n M I M E消息内容定位报头
H T M LTe x t H T M L格式的消息主体
I m p o r t a n c e 消息的优先级
M e s s a g e F o r m a t 消息的编码格式
R e c i p i e n t s R e c i p i e n t对象或其集合
S e n d e r 发送消息的用户的 A d d r e s s E n t r y对象
S i z e 消息的字节大小
S u b j e c t 消息主题
Te x t 普通文本的消息主体
Ti m e R e c e i v e d 接收消息的日期和时间
Ti m e S e n t 发送消息的日期和时间在研究 N e w M a i l对象时已讨论过这些属性的绝大部分,所以这儿就不做更深的探讨。
b,Delete方法前面已提到过 M e s s a g e s集合的 D e l e t e方法将删除集合中所有的消息,假如只想删除集合中的一个消息,需要使用 M e s s a g e s对象的 D e l e t e方法。
例如,下面的程序将删除 I n b o x中的第一个消息:
正像 M e s s a g e s集合中的 D e l e t e方法一样,删除操作会立即发生作用而且不可取消。
c,Send方法这个方法与 N e w M a i l的 S e n d方法很相似,M e s s a g e对象的 S e n d方法把消息发送到指定的收件人。在讨论 M e s s a g e集合的 A d d方法时,已经看到过使用这个方法的一个例子:
第 2 2章 A S P和用于 N T服务器的 C D O计计 663下载
(4) Attachments集合消息自身可以包含附件 ( a t t a c h m e n t ),而且 C D O N T S提供了使用附件的编程方法,对每个
M e s s a g e对象都有一个 A t t a c h m e n t s集合,它包含零个或更多的附件。
A t t a c h m e n t s集合中包含 I t e m属性和 C o u n 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 d d方法,可以在消息中加入新的附件,A d d方法的语法结构如下:
其参数及说明如表 2 2 - 1 0所示。
表 22-10 Add方法的参数及说明参 数 说 明
N a m e 附件的显示名
Ty p e 附件类型,C d o F i l e D a t a ( 1 )或 C d o E m b e d d e d M e s s a g e ( 4 )
S o u r c e 附件类型为 C d o F i l e D a t a时为文件的全路径,附件类型为 C d o E m b e d d e d M e s s a g e
时为 M e s s a g e对象
C o n t e n t L o c a t i o n M I M E附件内容定位报头
C o n t e n t B a s e M I M E附件内容基本报头例如,如果要把文件 C,/ I n v e n t o r y R e p o r t,x l s加到消息中,可用如下代码:
在此例中,由于没有对消息进行 M I M E编码,在调用 A d d方法时可以省略
C o n t e n t L o c a t i o n和 C o n t e n t B a s e参数。
为了单独访问一个附件,需要使用 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对象的属性如表 2 2 - 11所示。
表 2 2 - 11 Attachment对象的属性及说明属 性 说 明
C o n t e n t B a s e M I M E附件的内容基本报头值
C o n t e n t I D M I M E附件的内容 I D报头值
C o n t e r t L o c a t i o n M I M E附件的内容定位报头值
N a m e 附件的显示名
S o u r c e 附件的路径或位置
Ty p e 附件类型,C d o F i l e D a t a ( 1 )或 CdoEmbedded Message(4)
664计计 ASP 3 高级编程 下载
A t t a c h m e n t对象有三个方法。
D e l e t e方法用来删除消息 A t t a c h m e n t s集合中的单个附件,这个方法将立即从集合中删去附件,而且不能取消删除结果。
R e a d F r o m F i l e方法允许附件源码从文件中装载,语法结构为:
f i l e n a m e参数指定了装载附件的源文件的完全限定路径,这个方法允许在创建 A t t a c h m e n t
对象之后从一个源位置装载一个附件。
最后,有一个方法允许保存附件数据到一个文件中,即 Wr i t e To F i l e方法,其语法结构如下:
这里,f i l e N a m e参数是保存附件数据的目标文件的完全限定路径,当要把附件保存到硬盘或不是消息存储的位置时,可以使用这个方法。
(5) Recipients集合每个消息都有 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对象,与 A t t a 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方法,和其它的 D e l e t e方法一样,将删去集合中所有的收件人。
添加消息的收件人需使用 R e c i p i e n t s集合的 A d d方法,A d d方法的语法构成如下:
其参数及说明如表 2 2 - 1 2所示。
表 22-12 Add方法的参数及说明参 数 说 明
N a m e 收件人的显示名
A d d r e s s 收件人的完全限定消息地址
Ty p e 收件人类型,可以为 C d o To,C d o c c和 C d o B C C三个值之一
R e c i p i e n t s集合的 N a m e,A d d r e s s和 Ty p e参数和 R e c i p i e n t s对象的 N a m e,A d d r e s s和 Ty p e参数一样 (将在稍后讨论 R e c i p i e n t s对象 )。如果没有指定参数,将设置为空值。
下面的例子显示了如何往消息中添加 TO,C C和 B C C收件人:
不能修改 I n b o x 中的消息,试图对 I n b o x 中的消息使用 A d d 方法,将得到一个
C d o E _ N o _ A c c e s s错误。
R e c i p i e n t对象代表消息的单个收件人。此对象的属性如表 2 2 - 1 3所示,它们与 R e c i p i e n t s集合的 A d d方法的参数完全相同。
表 22-13 Recipient对象的属性及说明属 性 说 明
N a m e 收件人的显示名
A d d r e s s 收件人的完全限定的消息地址
Ty p e 收件人类型,可以为 C d o To,C d oC C或 C d o B C C三个值之一第 2 2章 A S P和用于 N T服务器的 C D O计计 665下载
R e c i p i e n t对象也有 D e l e t e方法,但只删除与 R e c i p i e n t集合中的当前 R e c i p i e n t对象。
(6) AddressEntry对象
M e s s a g e对象的 S e n d e r属性将返回一个 A d d r e s s E n t r y对象,这个对象包含发送消息的地址信息,其属性如表 2 2 - 1 4所示。
表 22-14 AddressEntry对象的属性及说明属 性 说 明
N a m e 发送者的别名或显示名
A d d r e s s 发送者的完全限定的消息地址
Ty p e 地址类型,对于 C D O N T S总是,S M T P”
3,Session对象小结正像所看到的那样,由 S e s s i o n对象及其子对象所提供的控制及其层次水平远多于
N e w M a i l对象所提供的。这就允许创建功能更强大的应用程序,但这需要更多的工作量。这是一个功能和易用性之间的折衷问题。
不管怎样,要想创建更复杂的应用程序,仍然可以在做不太多的工作的情况下完成。
C D O N T S允许创建简单和复杂的应用程序,两者都很容易创建。
22.3.4 设置 SMTP Service
在深入研究开发应用程序的细节之前,首先必须正确设置服务器并配置为适用于
C D O N T S。
注意 C D O N T S名字中包含 Windows NT服务器,这暗于需要有一台运行 M i c r o s o f t
Windows 2000服务器的机器。另外,对以下的许多例子,还需要有这台机器上的管理特权。
首先应确定已经在 Windows 2000服务器上安装有 SMTP Service。简便的方法是看 D e f a u l t
SMTP Virtul Server节点是否存在于 Internet Information Services Manager内,假如安装了
SMTP Service,将看到一个与图 2 2 - 3相似的屏幕。
图 22-3 安装 SMTP Service后 I I S M a n a g e r显示的窗口假如没有安装 SMTP Service,那么就需要运行 Windows 2000的安装程序,添加 S M T P
S e r v i c e组件。要进行这种操作,可进入 Control Panel,选择 Add|Remove Programs。当
Add|Remove Programs对话框出现时,单击 Add|Remove Windows Components。然后就会出现如图 2 2 - 4所示的 Windows Components Wi z a r d。
在对话框中选择 Internet Information Server(IIS),然后单击 D e t a i l s按钮,将出现另一个对话框,显示 I I S的子组件。选中 SMTP Service旁边的复选框,如图 2 2 - 5所示
666计计 ASP 3 高级编程 下载图 22-4 Windows Components Wi z a r d的窗口图 22-5 显示 I I S的子组件的窗口单击 O K按钮,返回 Windows Components对话框,再单击 N e x t,继续 Windows 2000 组件安装。
你将会得到一些服务安装的细节的提示,对于 SMTP Service来说,需要指定 M a i l R o o t目录的位置。在硬盘上的这个位置,服务创建用于存储邮件队列 (Mail Queue)、邮箱 ( M a i l b o x )和坏邮件 ( B a d m a i l )的目录,建议为 M a i l R o o t目录指定一个有大量可用硬盘空间的位置。
22.3.5 SMTP Service配置机器一旦安装上 SMTP Service,需要配置这个服务,以便它能正确地分发 e - m a i l。
你可能不知道如何建立一个用户用于接收邮件的邮箱。对 SMTP Service来说,不必了解它,根本就没有个别用户的收件箱这样的概念。所有接收的 e - m a i l都被投递到一个中心文件夹
(安装时指定的 M a i l R o o t文件夹 ),当用户访问这个文件夹时,都被过滤使他只能访问发给他的消息。例如,假如在 M a i l R o o t文件夹中有 5个消息,而其中只有两个的地址指向某个用户,那么当这个用户登录 S M T P会话时将只能看到这两条消息。 SMTP Service不会泄露任何地址不指向此用户的消息。
第 2 2章 A S P和用于 N T服务器的 C D O计计 667下载消息往外发送有两种发送方式:在直接发送到域,或者使用智能主机 (smarthost)邮件服务器。
如果消息被直接发送到域,那么每一条消息就只被发送到消息指定的域。如果消息通过智能主机分发,每个消息都被发送到智能主机机器上,智能主机将对消息决定和执行正确的路由。
1,设置域为了传递到域,SMTP Service需要有每一个可能的目标域的路由信息。要提供这个路由信息,每个域都必须加到 SMTP Service上,并配置其属性,可以使用 Internet Services
M a n a g e r来进行这个操作。
扩展 Default SMTP Virtual Server节点,会找到一个 D o m a i n s组节点,在这里可以查看当前的域清单、增加新域和指定域的投递设置。
要添加一个新的域,在节点上右击鼠标,选择 N e w后,再选择 D o m a i n,就启动 N e w
Domain Wi z a r d (新域向导 ),它将引导你完成整个过程。第一个对话框是询问域是 L o c a l (本地 )
还是 R e m o t e (远程 )。屏幕界面如图 2 2 - 6所示。
图 22-6 增加新域的窗口 1
假如发送到域的邮件被保存在本地机上,那么域就是 L o c a l。若发送到域的邮件是发往另一个邮件服务器的,那么这个域就是远程域。在此例中,要设置为 R e m o t e。接下来的对话框如图 2 2 - 7所示,询问远程域的名字,我们使用 A n y w h e r e,C o m。
图 22-7 增加新域的窗口 2
668计计 ASP 3 高级编程 下载一旦键入域名并单击 F i n i s h按钮,就创建了一个新的域并添加到域清单中,如图 2 2 - 8所示。
图 22-8 增加新域后的窗口在域清单中右击 A n y w h e r e,C o m,选择 P r o p e r t i e s,以指定域的路由设置,如图 2 2 - 9所示。
这个对话框有两个主要的设置选项,第一个复选框为 Allow incoming mail to be relayed
to this domain(允许接收的邮件中继到这个域 )。
SMTP Service的缺省操作是阻止将邮件中继到远程域。选中这个选项,允许邮件从当前服务器中继到远程域。
第二个复选框为 Send HELO instead of
E H L O,它在使用扩充的简单邮件传输协议
( E S M T P )服务器时使用。支持 E S M T P的 S M T P
客户通过发送 E H L O而不是 H E L O初始化一个会话。发送 H E L O说明客户不支持 E S M T P,假如这个选项被选中,与远程域的通信将一直并只能通过发送 H E L O来初始化。
对话框的 Outbound Security部分允许指定与远程域通信的验证方法。 当单击 E d i t按钮时,
呈现出一个对话框 (如图 2 2 - 1 0所示 ),询问提供哪一种证书给接收服务器。若选择提供证书,可以使用 Basic Authentication(帐户名字和口令以未加密的明文发送 )或使用 Wi n d o w s
Security Package(需要 N T帐户名、域和口令 )
来被发送。
总的来看,绝大部分目标域不需要验证,
在这种情况下,使用缺省设置 No authentication。
如果一个消息由于必需验证而从一个域中返回,那么必须使用 Outbound Security对话框为此域设置正确的验证。
2,智能主机配置假设已经有一台有配置好的智能主机机器。想通过智能主机发送消息,可以指定消息的第 2 2章 A S P和用于 N T服务器的 C D O计计 669下载图 22-9 指定域的路由设置图 22-10 设置验证方式的对话框路由,并可能通过另外连接线路发送它们,也许这样更快、花费更少。智能主机将处理消息到最终目的地的路由。
需要注意的一点是指定了智能主机时,所有的消息将通过该智能主机,而不管它们最终的目的域是什么。
对往外发送的消息来说,必须设置路由和投递方式选项。仍使用 Internet Services
M a n a g e r来完成此操作。
启动 Internet Services Manager,选择 Default SMTP Virtual Server节点,右击并选择 P r o p e r t i e s。
当服务的属性页出现时,选择 D e l i v e r y选项卡,将看到如图 2 2 - 11所示的界面。
图 2 2 - 11 Delivery选项卡
D e l i v e r y选项卡有一些投递消息的选项需要设置,在对话框中也有许多可利用的属性。
要了解这些属性和它们的作用的更多细节,可在 SMTP Service的文档中查询,
它位于 http://<machineName> /iisHelp/iis/misc/defanlt.asp。
和每个域的属性上有一个 Outbound Security部分一样,在 SMTP Service属性页面的 D e l i v e r y选项卡上也有一个 Outbound Security部分,允许指定发送到接收服务器的缺省验证方法。推荐的方式是 No Authentication。然后,若消息由于需要证书而被拒收,则为此地址创建一个远程域,
并指定域的正确的安全属性。
到此为止,我们已经能正确地配置 SMTP Server,下一步将研究利用此服务的一些 A S P程序。
22.4 在 A S P应用程序中使用 C D O N T S
现在已经能正确地配置 SMTP Service,也能够投递消息,下面将利用 C D O N T S库创建一
670计计 ASP 3 高级编程 下载些 A S P应用程序。第一个应用程序允许用户从 We b页发送一个简单的 e - m a i l信息。
这一章所有的例子程序都可以从 Wrox We b网站上下载。
22.4.1 简单邮箱应用程序下面是将要使用的 A S P页面 S i m p l e M a i l,a s p的代码:
第 2 2章 A S P和用于 N T服务器的 C D O计计 671下载在浏览器中浏览 S i m p l e M a i l,a s p时,将看到如图 2 2 - 1 2所示的用户界面。
图 22-12 例子程序的用户界面提交窗体时,调用 S e n d M a i l,a s p页,源代码如下:
672计计 ASP 3 高级编程 下载看完这些源代码后,下面一步一步地分析此应用程序是如何工作的。先简要分析
S i m p l e M a i l,a s p页面,但我们主要研究 S e n d M a i l,a s p页面,它是此应用程序的重点。
1,SimpleMail.asp
在 S i m p l e M a i l,a s p页面的程序代码中有两点需要指出,一是注意下拉列表允许用户从可能的三个值中选择消息的优先级 (以下程序代码中的 T D标记已被去掉以具有更好的可读性 )。
代码中使用了优先级值的实际字符值,而不是 C D O N T S库常量。这是因为这些常量只在服务器上可用,在客户机上不能使用,如要使用 C D O N T S常量,就必须像下面这样编写代码
(这儿再次从程序码中除去 T D标记以增强可读性 )。
这段代码还需要用户在 We b项目的 g l o b a l,a s a中添加对 C D O N T S库的引用。像先前所提到的一样,在 g l o b a l,a s a中放置 M E TA标记使 I I S从 C D O N T S库中载入常量,并允许开发者使用常量名来代替字符值。
在此例中,清单列表中使用常量并没有真正的好处,例子程序也没使用它们。
注意 S i m p l e M a i l,a s p页面的最后一部分代码。
第 2 2章 A S P和用于 N T服务器的 C D O计计 673下载这段程序提供给用户一种反馈方式,由于邮件的实际发送发生在 S e n d M a i l,a s p页面中,这就需要有一个让用户知道消息是否被发送的方法,我们通过使用在 Q u e r y S t r i n g中传递的变量
M a i l S e n t完成这个操作。
在此页面首次载入时,变量 M a i l S e n t的值为空,所以这段程序码没做任何工作,在
S e n d M a i l,a s p页面使用户重新定向到 S i m p l e M a i l,a s p页面,并指定 Q u e r y S t r i n g中的 M a i l S e n t值时,会出现有趣的情况。依据值为 Tr u e或 F a l s e,程序段将会在 We b页上给出一个成功或者失败的信息。
下面将研究 S e n d M a i l,a s p代码。
2,SendMail.asp
在这个应用程序中,S e n d M a i l,a s p页面完成主要的工作。它是实际发送邮件消息的页面。
正像在源程序中所看到的,这个页面不需修改就能被重复使用。任何其他的应用程序 /网页都能够使用这个页面,并通过调用这个页面和在 Q u e r y S t r i n g中指定需要的消息来发送一个简单的邮件消息。
现在从头开始分析 S e n d M a i l,a s p页面。
(1) 设计注释
S e n d M a i l,a s p中的第一块代码与发送消息没什么关系,它使应用程序设计更优化。这个页面正朝着在任何 We b 项目中都适用的方向设计。一旦页面定向到发送消息的浏览器,
S e n d M a i l,a s p不必修改任何代码也能正常工作。由于页面利用了 S e r v e r Va r i a b l e s集合和
H T T P _ R E F E R E R变量值,所以这是可能的。
这个变量包含了与当前页面的浏览器相关的页面的 U R L。在本应用程序中,其值为
h t t p,/ / M y S e r v e r / M a i l / S i m p l e M a i l,a s p。通过使用这个变量,程序员能够确保在没有手工修改任何程序的情况下,S e n d M a i l,a s p页面总能重新定向浏览器返回到调用它的页面。
由于这个变量包含了相关页面的完整的 U R L,在 U R L中很可能含有一些查询字符串
( Q u e r y S t r i n g )信息,例如,h t t p,/ / M y S e r v e r / M a i l / S i m p l e M a i l,A S P? M a i l S e n t = Tr u e。为了处理它,
程序寻找“?”字符,一旦找到一个“?”就将它和它以后的文本从 U R L中删除:
对我们的例子,s t r R e f e r e r的结果值为:
这种方法允许往任何 We b应用程序中添加此页面,而且不需修改就可以使用,任何调用页面需要的仅是在 S e n d M a i l,a s p相关的 Q u e r y S t r i n g中指定所需的信息。在 S e n d M a i l,a s p执行完它的程序后,它将使浏览器转向到相关的页面。
(2) 验证发送者和收件人现在来研究程序代码的实质部分,即处理消息的程序部分。由于确实性和实效性在任何
674计计 ASP 3 高级编程 下载应用程序中都很重要,程序代码下一段为一个 I f语句,以确保发送一条有效、有用的消息:
这一行是确保指定了目的地址和发送者的地址,没有发送者的地址发送一条消息是可能的,但却会造成半匿名 e - m a i l。在这里使用半匿名这个术语是因为虽然没有指明 e - m a i l的发送者,但仍能通过检查消息报头确定发送消息的服务器。
在我们的例子里,已选择不允许有匿名消息,而且必须指定发送者地址。由于目的地址是必须有的,发送没有人接收的消息是没用的!如果没有指定两个值中的任一个,就不会发送消息,而且将 Q u e r y S t r i n g的 M a i l S e n t变量设置为 F a l s e,指明没有发送邮件。
正如在研究 S i m p l e M a i l,a s p时所讨论的一样,在此页面中使用 M a i l S e n t变量,向用户提供发送消息操作的反馈。
(3) 发送消息一旦决定了我们需要的消息,首先需要进行的操作是创建 N e w M a i l对象的新实例。像先前所提到的,每次想要发送一个消息时,都需创建一个新的 N e w M a i l对象实例。下面的程序声明了一个变量并设置此变量为新的 N e w M a i l对象实例:
接下来,需要给邮件对象设置合适的属性。对于这些属性,使用用户在 S i m p l e M a i l,a s p页面中输入的值。这些值通过 Q u e r y S t r i n g传送到 S e n d M a i l,a s p页面,可以使用 Q u e r y S t r i n g集合来得到它们:
现在有一条消息需要发送到指定的收件人,剩下的工作就是发送这条消息。可以简单调用 N e w M a i l对象的 S e n d方法来进行这一操作。虽然 S e n d方法有一些可选参数,在此情况下由于已设置了 O b j S e n d M a i l对象的属性,所以可以忽略它们。
假如在 S e n d方法中指定了一些收件人,消息除了发送到在 S e n d方法中指定的收件人外,还将发送到在 O b j S e n d M a i l的 To,C C和 B C C属性指定的所有收件人。
发送消息后,清除并释放 O b j S e n d M a i l对象占用的资源:
(4) 报告结果最后,当发送完消息后,且 o b j S e n d M a i l设为 N o t h i n g时,用户就返回到他们原来的页面。
进行此操作时,M a i l S e n t变量的值随 Q u e r y S t r i n g传递,表明邮件是否被发送。若在调用这个页面时指明了 S e n d F r o m和 S e n d To属性,将发送消息,且设置 M a i l S e n d的值为 Tr u e。若没有指定 S e n d F r o m或 S e n d To值,将不发送消息,设置 M a i l S e n t的值为 F a l s e。
第 2 2章 A S P和用于 N T服务器的 C D O计计 675下载可以类似地使用这个方法来传递回一个错误的说明,或可能的错误代码。对于这个例子表明消息是否被发送出去就足够了。
(5) 验证结果上面看到的只是一个只能发送邮件的邮件应用程序,也许会产生如何证明一切都工作正常的问题。
证明邮件被发送的最简单的方法是把它发送到自己的 e - m a i l地址。例如,若你有一个
H o t m a i l帐号 M y M a i l A d d r e s s @ H o t m a i l,c o m的话,登录 H o t m a i l并往此网址发送一条消息,以证明消息是否被投递。
另一个选项是发送邮件到服务器端的用户。首先,在服务器机器上查看 M a i l R o o t文件夹,
注意到文件夹中有 X条消息。然后,若 S i m p l e M a i l应用程序存在于一个命名为 M a i l S e r v e r 0 1的服务器上,则发送一个测试消息到 U s e r 1 @ m a i l s e r v e r 0 1。再在 M a i l S e r v e r 0 1机器上访问
M a i l R o o t文件夹以证实在文件夹中有 X + 1条消息。
3,SimpleMail应用程序小结你已看到了,从 We b页面发送的简单 e - m a i l并不需要大量代码。在例子程序中,有许多注释行来解释消息的发送过程。
这个程序很短,用于实际发送消息的大约有 1 2行代码,理解和实现它并不太困难。在这些简单的情况下,在设计应用程序的用户界面上花费的时间多于实现它功能的时间是很自然的。
22.4.2 Inbox应用程序上面讨论了一个利用 C D O N T S和 N e w M a i l对象的简单应用程序。现在再来看一个用
S e s s i o n对象和其下层的对象的基本例子。
这个应用程序例子允许用户登录到他们的邮箱登录后,用户将看到在收件箱内的消息的列表。这个应用程序有三个独立的页面。
Login.asp。
Inbox.asp。
Vi e w M e s s a g e,a s p。
下面按用户遇到每个页面顺序研究程序代码。
1,登录用户所看到第一个页面是 L o g i n,a s p页面,这是一个用户能输入其用户名 (或显示名 )和 e -
m a i l网址的简单页面。页面源程序为:
676计计 ASP 3 高级编程 下载这个程序非常直观,它取得一些值并传递到下一个页面,所以不必过细地讨论它。
在浏览器中浏览时,这个页面如图 2 2 - 1 3所示。
2,消息清单与在前面应用程序例子中的 S e n d M a i l,a s p相似,在这个应用程序中 I n b o x,a s p是程序的主体。
页面的源程序清单如下:
第 2 2章 A S P和用于 N T服务器的 C D O计计 677下载图 22-13 浏览器中的登录界面
678计计 ASP 3 高级编程 下载这个页面的显示类似于图 2 2 - 1 4。
图 22-14 Inbox.asp页面的显示
(1) 初始化 S e s s i o n对象在页面的顶部声明要使用的所有变量:
在这些变量中,s t r U s e r N a m e和 s t r U s e r E M a i l两个变量很醒目,因为它们很明显不是
S e s s i o n对象层次中的对象。实际上,这些变量和 S e s s i o n对象层次中的对象根本无关,它们仅用来保存从 Q u e r y S t r i n g中检索到的 U s e r N a m e和 E m a i l地址的值。由于这些值可能在本页面甚至别的页面多次引用,因此创建这些局部变量来存储这些值,这样可以避免多次重复调用
Q u e r y S t r i n g对象。
另外,创建 ASP Session对象存储这些 U s e r N a m e和 E m a i l值,也允许这个应用程序中的另一个页面使用它们。这样做的好处如果现在还不明显的话,在以后会变得清楚。
一旦创建了 A S P S会话变量,下一步创建 CDONTS Session对象并对其初始化,使用传递进来的 U s e r N a m e和 E m a i l地址:
这一会话存储在一个 A S P会话变量中。
与 U s e r N a m e和 E m a i l变量类似,它允许此 We b应用程序中的另一个页面很容易地访问用户的 C D O N T S会话。
第 2 2章 A S P和用于 N T服务器的 C D O计计 679下载
(2) 访问用户的收件箱到目前为止,已创建了会话,用户也已登录,会话对象也能访问用户的文件夹。对此应用程序,现在只关心收件箱了。可以使用 S e s s i o n对象的 I n b o x属性返回当前用户的 I n b o x文件夹,不需要使用 G e t D e f a u l t F o l d e r属性。一旦有了 I n b o x对象,就能够得到收件箱中的消息集合。
所需要的代码仅为下列几行:
有了消息集合以后,就可以访问 I n b o x的内容。可以完成有关这些消息的许多任务,但是不能够修改 I n b o x中的消息。 C D O N T S不允许修改它们。
对于这个应用程序,下一步要做的工作是给用户提供一个欢迎词,然后显示 I n b o x中的消息清单 (如果有的话 ):
消息集合上的 C o u n t属性允许对在用户的收件箱中的消息计数。另外,可以使用 C o u n t属性来决定在收件箱中是否有要在 We b页面上列出的消息。假如有的话,将做一个简单的循环遍历消息集合,显示消息的优先级、发送者、主题及发送时间等。
对程序的大部分来说,没有需要特别注意的。有一行需要做更多的解释,它产生显示主题的文本,并在文本外加上了 < A >标记。这行程序如下:
这行程序允许用户在 < A >标记上单击,并使用户转到显示此消息的页面。 Q u e r y S t r i n g变量 M s g I D指明哪一条消息将通过 Vi e w M e s s a g e,a s p页面显示。稍后将讨论这一页面。现在,只要注意到这段程序产生了浏览消息的正确的超链接就可以了。
在显示每条消息的优先级时,这个页面将调用一个能为消息的优先级产生相应的 H T M L
图像标记的子程序:
680计计 ASP 3 高级编程 下载根据消息的 I m p o r t a n c e属性的值 (此属性值作为 i n t I m p Va l u e参数被传递进此子程序中 ),此子程序将显示不同的图像。
3,浏览消息除了查看收件箱中有什么消息外,用户也可能想浏览其中的一条或多条消息。这个应用程序为此提供了一种简单的方法,用户仅在收件箱中的消息上单击,就可以打开此消息。例如,若在图 2 2 - 1 4中的第一条消息上单击,将显示如图 2 2 - 1 5所示的消息内容。
图 22-15 显示消息内容这个页面的源程序代码 ( Vi e w M e s s a g e,a s p )如下所示。
第 2 2章 A S P和用于 N T服务器的 C D O计计 681下载可以看出,显示一条消息并不需要很多代码,这是因为所涉及的大部分工作已由
L o g i n,a s p和 I n b o x,a s p页面完成。这些工作结果保存在 A S P会话变量中,应用程序中的其他页面可以获得它们。如前所述,这个操作使我们不必传递 U s e r N a m e和 U s e r E M a i l值,也不必不但创建新的 S e s s i o n对象,并且不必在对象上调用 L l o g o n S M T P。所有的登录工作可由如下的代码重新调回:
这段代码将 CDONTS Session对象分配给局部对象 o b j S e s s i o n,它在 I n b o x,a s p页面中创建并初始化。可以使用此对象返回收件箱的消息集合。在此处,不关心 I n b o x对象,只要得到消息集合就可以了。
一旦有了消息的集合,就能访问集合中包含的消息。现在仅关注集合中的一条消息,即被用户选中要显示的那条消息。使用在 Q u e r y s t r i n g中传递的 M s g I D变量来决定哪一条是要显示的消息。由于正在处理的集合与存在于 I n b o x,a s p页面中的集合是同一个集合,因此,它们的顺序是相同的。所以,被选中消息的索引号也将是一样。由于在这一页面中将多次使用此索引号,所以将 M s g I D赋给一个局部变量 i n t I n d e x。下面的程序先查询被选中消息的属性,然后使用 i n t I n b o x局部变量来代替 Q u e r y S t r i n g变量 M s g I D:
还可以使用另一种方法,将选定的消息的 M e s s a g e对象赋给一个局部变量。在这种情况下,
程序代码如下所示,
682计计 ASP 3 高级编程 下载这两个方法的功能相同。为了使程序不需要多次从 Q u e r y S t r i n g中得到变量,创建一个局部 M e s s a g e对象变量来代替反复从 M e s s a g e s集合中得到消息是一个较好的方法。
4,验证结果
S i m p l e M a i l应用程序只能发送邮件,而 I n b o x应用程序仅能浏览接收到的邮件。要验证
I n b o x应用程序工作正常,最好的方式是利用 S i m p l e M a i l应用程序。
首先,使用 S i m p l e M a i l发送一条消息到 Te s t @ M a i l S e r v e r 0 1 (用你的 We b服务器名代替
M a i l S e r v e r 0 1 )。然后,用一个用户的 e - m a i l地址 Te s t @ M a i l s e r v e r 0 1 (再次提醒,用你的 We b服务器名来代替 M a i l s e r v e r 0 1 )登录到 I n b o x应用程序。假如这两个应用程序都在正常工作,你将看到被列出的测试消息。
5,Inbox应用程序小结如果在登录页面上指定了一个不正确的 e - m a i l地址,在收件箱中将看不到任何消息。由于
L o g o n S M T P方法实际上不进行验证和登录,它使你在得到错误的或无效的信息时得不到任何错误报告,因此完整准确地输入用户的 e - m a i l地址是非常重要的。 U s e r N a m e仅仅是一个显示名,可以是不正确的,但 U s e r E M a i l地址必须准确无误。
22.5 小结通过学习本章,你了解了 C D O N T S的发展过程及其使用情况,并接触了一些利用
C D O N T S的应用程序例子。虽然 C D O N T S在其发展演化中已经取得了进步,但它仍有进一步改进的空间。仅支持 S M T P邮件是 C D O N T S库值得注意的缺陷之一。即使是这样,当前它仍然是非常有用和相当简单的工具,它简化了使 A S P应用程序具有简单消息收发能力的工作。
虽然 C D O N T S功能有限,但 C D O N T S程序代码在 C D O环境中完全兼容。针对于 I I S和
SMTP Service(CDONTS)而创建的应用程序可以不经任何修改地移植到一个 I I S和 E x c h a n g e平台 ( C D O )。
下一章将研究 C D O。
第 2 2章 A S P和用于 N T服务器的 C D O计计 683下载