ccidnet????

出版日期:1999-09-06 总期号:855 本年期号:65

本期导读
要闻综合
电脑工作室
市场
硬件
软件
infotimes
用asp发送电子邮件

陈泽人

  越来越多的人设计的网站需要从web服务器自动发送e-mail以响应因特网上的各种事件,例如:

  1. 用户填好了一个表单(form),你欲将表单内容通过e-mail发送给其他人。

  2. 来访者对你的产品或服务提出了反馈意见或咨询请求,你必须立即向他发一个e-mail,告诉他,你已经收到了他的意见或请求,正在处理他的请求,请他耐心等待你的回复。

  3. 你要自动处理一个邮件列表。

  4. 你要在你的主页中开发一个友情点歌或点贺卡的栏目,让用户点好歌曲或贺卡后,给他的朋友发送一个e-mail,请他的朋友来取歌或贺卡。

  目前,多数web服务器的操作系统是unix,采用perl语言编写发送e-mail的程序是比较成熟的技术,perl语言程序只须调用unix的sendmail命令即可。本文将讨论操作系统是windows nt的情形。


   在nt中安装smtp service


  iis(internet information server)是微软捆绑在nt中的一个拳头产品,被广泛用于构建web服务器。iis的标准产品只提供www、ftp和gopher服务,没有邮件服务。在任选软件包nt4 option pack中,微软提供了发送e-mail的一个简单方案:iis smtp service。只有安装了iis smtp service之后,才能在nt中用编程方法发送e-mail。

  smtp是simple mail transfer protocol(简单邮件传输协议)的缩写。顾名思义,smtp是个简单的、易懂易用的东西。

  在iis中安装了iis smtp service之后,在默认的inetpub文件夹下自动建立了一系列文件夹,用于存放邮件的一系列文件。smtp service在后台运行,并监控这些文件夹。pickup文件夹用于存放要发送的邮件,smtp service从这里取走邮件并发送到指定的邮件服务器(以下简称邮局)中去。如果它无法立即发送成功,就转到queue文件夹中,等待以后多次尝试再发送,尝试的次数和时间间隔可以设置。至于drop文件夹,用于存放从外部接收来的邮件,不是本文所关心的。


   设置smtp service


  下面让我们看看如何设置iis smtp service:

  先从nt选单中进入windows nt 4.0 option pack→microsoft internet information server→internet service manager,即出现图1所示的microsoft management console窗口。

  然后在default smtp site处点击鼠标右键→选中properties,即出现default smtp site属性窗口,接着选页框的第4页delivery,如图2所示。

  让我们来设置delivery的各个属性:

  1. maximum retries和retry interval:这里分为local queue和remote queue,其中remote queue只有在建立了remote domain时才起作用,一般我们只要有默认的local domain就行了。这里maximum retries和retry interval就是前面提到的无法立即发送成功后的重新尝试次数和时间间隔(分钟)。重新尝试超过设置的次数,就会把信件退回原地址。

  2. maximum hop count:该属性用于限制一封信同时发往多个邮局的个数。超过设置的个数,就会把信件退回原地址。

  3. masquerade domain:伪装的domain,用于替代信封上的发信人地址(from)。

  4. fully qualified domain name:该属性用于标识发送信件的服务器的域名,默认为你的服务器的域名。

  5. smart host:直译为“巧妙的主机”,默认值为空。大多数169 web站点没有访问internet上邮局的权限,如果你的服务器是这种站点,那么就把该项设成“hotmail.yn.cninfo.net”或其它类似的smtp服务器。

  default smtp site的其它属性一般采用默认值即可。


  smtp service的cdonts构件


  iis smtp service提供了一系列称为cdonts(collaborative data objects for nt server)的构件,可供asp等编程语言调用,以实现与邮件服务相连接的应用。cdonts构件中最简单的是newmail构件,也是本文惟一感兴趣的构件。该构件为每一封信的信封和信的内容提供一整套属性,并在pickup文件夹中生成一个扩展名为eml的文本文件,用以记录这些属性,供smtp service取走。

  事实上,我们可以用asp或其它语言程序生成上述eml文件,并把它放入pickup文件夹中。但是,用cdonts.newmail构件做这件事更简单且不易出错。

  作为一个例子,我们利用下列asp(vbscript代码)调用cdonts.newmail构件,来发送一条信息。

   set objmail = server.createobject(″cdonts.newmail″)

   objmail.to = ″you@yoursite.com″

   ′设置收信人地址

   objmail.from = ″me@mysite.com″

   ′设置发信人地址

   objmail.value(″reply-to″) = ″me@mysite.com″ ′设置回复地址

   objmail.subject = ″您好!″         ′设置主题

   objmail.body = ″这是一个试验。″       ′设置信的内容

  objmail.send ′发送

   set objmail = nothing

  其中第四行:objmail.value(″reply-to″) = ″me@mysite.com″是额外增加的信息,许多邮件收发器都承认″reply-to″(回复地址)这一信息。上述这些代码产生的eml文本文件内容如下:

  x-receiver: you@yoursite.com

  x-sender: me@mysite.com

  reply-to: 〈me@mysite.com〉

  from: 〈me@mysite.com〉

  to: 〈you@yoursite.com〉

  subject: 您好!

  date: tue, 7 jul 1999 13:38:12 +0100

  x-mimeole: produced by microsoft mimeole v4.72.2106.4

  这是一个试验。

  一个实例

  这是一个简单的示例。首先,我们要做一个网页,用来让用户输入信的有关信息。下面是这个网页源代码的表单部分:

  …

  〈form action=″send.asp″ method=″post″〉

  〈big〉〈p〉收信人地址:〈/big〉

  〈input type=″text″ size=″21″ name=″msgto″〉〈br〉

   〈big〉发信人地址:〈/big〉

  〈input type=″text″ size=″21″ name=″msgfrom″〉〈br〉

   〈big〉主题:〈/big〉〈input type=″text″ size=″48″ name=″msgsubj″〉〈br〉

   〈big〉正文:〈/big〉〈br〉

   〈textarea rows=″4″ name=″msgbody″ cols=″54″〉〈/textarea〉〈/p〉〈hr〉

   〈p〉〈input type=″reset″ value=″清除″ name=″b2″〉

   〈input type=″submit″ value=″发送″ name=″b1″〉〈/p〉

  〈/form〉

  …


  图1 microsoft management console窗口




  图2 default smtp site的delivery窗口




  图3 发送e-mail示例

  这个网页如图3所示。

  用户点击“发送”按钮后,将执行一个文件名为send.asp的asp程序,该程序在pickup文件夹中生成一个扩展名为eml的文本文件,让smtp service取走,发往目标邮局。下面是send.asp的部分源代码:

  …

  〈%

  set objmail = server.createobject(″cdonts.newmail″)

  objmail.to = request.form(″msgto″)

  objmail.from = request.form(″msgfrom″)

  objmail.subject = request.form(″msgsubj″)

  objmail.body = request.form(″msgbody″)

  objmail.send

  set objmail = nothing

  %〉

  …

  以上源代码中的request.form函数用来获取表单返回的相应信息,如:request.form(″msgto″)获取收信人地址,其余类推。