用ASP建立邮件列表

---（文/王惟言 郑大源）

说起发送Email，我们总是想起邮件客户端软件，比如Outlook Express、Foxmail（最新版3.0 beta1已于 4月30号发布，请到http://www.aerofox.com/下载）等。如果在Web上发送Email，大家肯定又会想起一些免费的电子邮箱，比如大名鼎鼎的www.163.net等，那么如何实现在Web上发送Email呢？大家可能会想到首先安装邮件服务器，比如Exchange，其实NT Server4.0加IIS4.0就可以了，本文就是想以实例来说明技术上的实现方法。

邮件列表(Maillist)在Internet上应用比较广泛。使用邮件列表可以与访问者保持积极的联系，快捷、简便、低成本地发送信息，也可以提高网站的知名度。扩展后的邮件列表也可以用于创立电子杂志（像索易：http://www.soim.online.sh.cn/）。探讨邮件列表的建立是非常有意义的，我们的实例就是建立一个邮件列表。

一、电子邮件发送原理

邮件传递过程的实现是从一个如Microsoft Outlook Express这样的客户端软件将一份邮件发送给一个SMTP服务器开始的，然后SMTP服务器负责决定如何处置该邮件。

如果电子邮件的目的域是服务器的本地域（比如将电子邮件发送给harrizon@domain.com，而且SMTP服务器是smtp.domain.com），那么该邮件被存储在这个服务器上，否则将该邮件转发给另一个合适的服务器。

网络上所有的SMTP服务器都可以通过一种“语言”互相通信，这个通用语言就是SMTP协议。但是，服务器如何决定传递邮件的目的地呢？可以通过它的域名解析系统(DNS)来查找域。

NT Server是目前使用比较广泛的网络服务器，而且前景看好，IIS（Internet Information Server4.0，Internet信息服务器）是网络文件和应用程序服务器，它们使用HTTP、Gopher以及FTP，通过Internet或Intranet来提供服务。

IIS SMTP服务仅提供邮件传递功能，它不能对接收邮件提供服务。Microsoft在IIS中加入了一个特殊的组件—Collaboration Data Objects for Microsoft Windows NT Server，也称为CDO for NTS Library，它提供邮件对象，可以在ASP(Active Server Pages)脚本中使用这些对象来访问和处理发送给特定用户的电子邮件。

邮件列表就是在网上收集访问者的Email，从而在需要的时候定期向该订阅者发送一定的信息。需要的工作是收集Email、发送Email。下面我们可以看到如何来完成这些工作。

二、 从Web页面发送电子邮件

利用IIS SMTP和CDO for IIS，可以从一个ASP脚本直接向Internet上的任何人发送电子邮件。

首先要安装Microsoft NT Ser-ver4.0，然后再安装IIS4.0，务必注意是否安装了SMTP服务，默认方式是安装的。安装完毕后不妨看看在winnt\system32目录下是否有一个文件cdonts.dll。如果存在这个文件，那么安装过程宣告成功。

程序1是最简单的发送电子邮件程序，它将一封主题为subject、内容为test的邮件从邮箱harrizon@163.net发送到ivan@188.net。

<%

Dim MailObject

Set MailObject = Server.CreateObject("CDONTS.NewMail")

MailObject.Send "harrizon@163.net"," ivan@188.net", "subject", "test"

%>

这样的程序虽然可以快速测试是否成功，但是实用价值并不高。我们将其优化一下，根据邮件列表的特点，编出一个有实用价值的程序。

首先请用Access建立一个数据库mail.mdb，用于保存email地址；然后需要建立一个表，表的名字为mail，包含一个字段email（字段名email，数据类型：文本，字段长度：50）即可，另外可以有一个id（字段名：id，数据类型：自动编号，本字段可以不要）。设置ODBC ，在控制面板中双击ODBC图标，设立dsn，其名为mail。

至此设置部分已经完成，现在编写程序。

将程序2加入到你的主页的合适位置。程序2的目的是为了收集访问者的Email。

<form method="POST" action="addmail.asp">

<p>您的Email:<input type="text" name="email" size="20"><input type="submit"

value="订阅" name="B1"><input type="reset" value="重写" name="B2"></p>

</form>

用浏览器打开程序2得到结果如图1，填入一个合法的email地址，单击“订阅”。服务器自动调用程序3，输入的email将自动入库，你不妨用Access直接打开数据库mail.mdb看看刚刚入库的Email是否保存了。

（图注ASP-1） 图1

<%

email=trim(request("email"))

Set Connection=Server.Create-Object("ADODB.Connection")

Connection.Open "mail","",""

SQL="INSERT INTO mail(email) VALUES('"+email+"')"

Set RS=Connection.Execute(sql)

response.write email%>，多谢您加入!

程序3的目的是将email保存到数据库mail.mdb里去。

Email入库意味着有了订阅者，现在我们可以进入下一个步骤—发送邮件给订阅者了。

这里我们用两个程序(sendmail. asp，mail.asp)来完成这部分工作，sendmail.asp的作用是生成一个界面（见图2），在这里我们可以选择发送的对象（全部或部分），填写发送的主题和内容，也可以粘贴附件，填写完毕后就单击“发送邮件”，此时对于管理员来说，一切工作是结束了，但如何发送邮件呢？我们就需要调用程序5了。

程序5为发送邮件处置程序mail. asp。其作用就是发送邮件，当然是根据程序4的选择和输入来处理邮件的。程序5的完整源代码参见《电子与电脑》的网站www.pccomputing.com.cn。

程序4为在线发送电子邮件sendmail.asp。程序运行结果如图2所示。

（图注ASP-2） 图2

（程序4）

<% Set Connection=Server.CreateObject("ADODB.Connection")

Connection.Open "mail","",""

sql="select * from mail"

Set RS=Connection.Execute(sql)

sql1="select count(*) from mail"

Set RS1=Connection.Execute(sql1)

%>

<form method="POST" action="mail.asp">

<table border="1" width="100%">

<tr bgColor="#abcdef">

<td align="middle">适占耍喝*<%=rs1(0)%>位订阅者<inputtype=

"checkbox" name="all" value="1" checked><hr><%do while not

rs.eof%>

<font size="3">

<input type="checkbox" name="shou" value="<%=rs(0)%>">

<%=RS(1)%>

<%

rs.movenext

loop

%> </td> </tr>

<tr bgColor="#eeddff">

<td width="7%">

邮件主题：<input type="text" name="subject" size="53"><br>

邮件内容：<br>

<textarea rows="9" name="body" cols="59"></textarea><br>

您的mail:<input type="text" name="usemail" size="50" value="harrizon@21cn.com">

<br>附件：<input type="file" maxlength="50" name="attfile" size="20" value="">附件名称：<input type="text" name="fname" size="10" value=""><br></p>

<input type="submit" value="发送邮件" name="B1"><input type="reset" value="重写" name="B2"></p> </td>

</tr>

</table>

</form>

（程序5）

<% SHOU=trim(request("SHOU")) '取得在程序四选择和输入的内容

subject=trim(request("subject"))

body=trim(request("body"))

att_file=trim(request("attfile"))

fname=trim(request("fname"))

usemail=trim(request("usemail"))

ckall=request("all")

if ckall=1 then '是否是给所有订阅者发送邮件

Set Conn2=Server.CreateObject("ADODB.Connection")

conn2.open "MAIL","","" '打开数据库

sql2="select * from mail"

Set RS2=Conn2.Execute(SQL2) '从数据库读出所有的邮件地址

do while not rs2.eof

item=rs2(0)

Set Conn=Server.CreateObject("ADODB.Connection")

conn.open "MAIL","",""

sql="select * from mail where id="+cstr(item)+""

Set RS=Conn.Execute(SQL)

Set MailObject = Server.CreateObject("CDONTS.NewMail")

if att_file="" then '附件为空

MailObject.Send usemail,rs(1),subject,body

response.write "无附件web邮件发送成功！"

%><hr><%else

f_name=fname

MailObject.From=gzer@163.net '发件邮址

MailObject.To=rs(1) '收件人

MailObject.Subject=subject

MailObject.Body=body

MailObject.AttachFile att_file,f_name

MailObject.Send '发送邮件

response.write "含附件web邮件发送成功！" '发送成功

end if

response.write "收信地址："+rs(1)+"<p>"

response.write "主题："+ subject +"<br>"

response.write "内容："+ body +"<br>"

%><hr><% rs2.movenext

loop

else

for each item in request("shou")

Set Conn=Server.CreateObject("ADODB.Connection")

conn.open "MAIL","",""

sql="select * from mail where id="+cstr(item)+""

Set RS=Conn.Execute(SQL)

Set MailObject = Server.CreateObject("CDONTS.NewMail")

if att_file="" then

MailObject.Send usemail,rs(1),subject,body

response.write "无附件web邮件发送成功！"

%><hr><%else '

f_name=fname

MailObject.From="gzer@163.net" '发件邮址

response.write rs(1) +"<br>"

MailObject.To=rs(1) '收件人

MailObject.Subject=subject

MailObject.Body=body

MailObject.AttachFile att_file,f_name

MailObject.Send

response.write "含附件web邮件发送成功！"

end if

%><hr><% next '下一封邮件

end if

%>

三、 后记

1． 由于篇幅的原因，这里省去了一些代码，请读者理解。

2． 如果发送邮件时加一个接收电子邮件地址的输入栏，那么你可以给任何一个合法的地址发送电子邮件，应用也就更为广泛了。

3． 使用本程序可以发送匿名邮件，但注意请勿乱用！

4． 若是使用POP3组件，就可以接收邮件了。

5． 本程序的附件发送不支持中文路径，有心者不妨编写更好的组件来支持中文路径。