摘 要
互联网络技术的不断发展,电子邮件服务已经成为人们基本的信息交互手段,也是网络服务中最早和最基本的服务之一。传统邮件系统大多是基于C/S结构,如Lotus notes、Microsoft Exchange Server等,这些邮件系统占用相对较多的服务器资源,对服务器性能有更高的要求,同时也增加了管理负担。并且,由于不同服务器需要特定的客户端软件,增加了系统的开发和管理成本。
基于Web的邮件服务提供了更快捷、高效的服务,使得新一代的Web Mail能解决传统邮件的不足之处。本文设计并实现的邮件收发系统基于B/S模式,以组件技术为基础,利用System.Web.Mail命名空间构造函数,分别调用Mailmessage,Mailattachment和SMTPmail方法,实现以Web网页的形式收发电子邮件,用户只需要通过Web页面就可以实现带附件邮件的发送。
关键词: Web Mail;ASP;SMTP协议;POP协议
3.1 System.Web.Mail命名空间介绍
System.Web.Mail命名空间包含使您可以使用CDO消息组件来构造和发送消息的类。邮件可通过系统的SMTP邮件服务或任意的SMTP服务器来传送。该命令空间包含三个类,如下说明
类的常用属性、方法说明:
(1)、MailMessage类的属性:该类提供了多个属性、方法、函数,用以构造电子邮件。其中,常用属性如表
(2)、MailAttachment类的函数
该类中的MailAttachment构造函数常与new子句配合来初始化附件类的新实例。可用两种方式进行初始化。1、仅指定文件名;2、同时指定文件名和编码类型。
(3)、SMTPmail类的属性及方法:该类提供了属性及方法以调用CDO组件的功能来发送电子邮件,其中常用的属性有:1、SMTPserver属性。用于获取或设置发送电子邮件的SMTP中继邮件服务器的名称;若不设置该属性,则使用本地(系统内置,如127.0.0.1)的SMTP服务器的名称。2、send方法。该方法用于发送电子邮件。
类的常用属性方法说明:(见表1)
表1 类的常用属性
MailAttachment | 提供用于构造电子邮件附件的属性和方法 |
MailMessage | 提供用于构造电子邮件的属性和方法。 |
SMTPMail | 提供用于使用 Windows 2000 的协作数据对象 (CDOSYS) 消息组件来发送消息的属性和方法。 |
其中,MailMessage类提供的接口很多,以创建MailObject实例对象为例:如发件人(MailObject.From)、收件人(MailObject.To)、抄送(MailObject.Cc)、暗送(MailObject.Bcc)、邮件主题(MailObject.Subject)、邮件正文(MailObject.Body)等基本要素,也包括如优先级(MailObject.Priority)、邮件格式(MailObject.BodyFormat)、编码类型(MailObject.BodyFormat)等。3.2 程序设计主要步骤
首先要建立对System.Web.Dll动态连接库的引用。然后,在窗口类之前用以下语句导入命名空间:Import System.Web.Mail,通过初始化构造一个MailMessage()函数定义变量,将接收HTML网页中填入的信息赋值给变量,这样就可以引用其中的成员。
3.3 界面设计
1. 首页
首页设置传值页面,把登录信息中的用户名,密码等传到下一个页面(default.asp),form标签的名称为f1,主要代码如:
<form name="f1" method="post" action="default.asp">’设置属性及传值页面
<input type="hidden" name="username">’传用户名
<input type="hidden" name="pwhidden">’传密码
</form>
在首页中加入了判断输入的代码,如if (username.value == "")
{
alert("用户名不可为空");
usernameshow.focus();
return ;
}
并加入了一些图片,生成的效果如图3
图3 登录首页
2. 发送邮件页面
发送邮件的页面调用.NET框架中的System.Web.Mail, 此页面的运行需要.NET2.0框架环境,其它代码也是该设计的核心部分,在主要代码部分有详细的说明,详见 3.5发送邮件页面主要代码, 生成页面如图4
图4 邮件发送页面
3. 用户登录后页面
这是一个框架页面,分为收件箱,草稿箱,发件箱和垃圾箱,每一个部分分别用一个页面来实现,其中最重要的收件箱用listmail.asp来实现,在页面中邮件总数用
<%
dim ei
set ei = server.createobject("easymail. PerFolders")’创建对象并初始化变量
‘然后分别定义变量来接收
用<%= ei.newInBoxMailCount %>来显示组件中收件箱邮件的数量,同理分别用<%=ei.inboxMailCount%>,<%=ei.NewOutBoxMailCount%>,<%=CLng(ei.inboxMailSize/1000) %>来调用组件中收件箱数量,未读邮件数量和邮箱使用率,并对是否为空做判断。
存储空间的大小用<%=maxsize %>来获取,<%=bf %>用来显示空间使用率,其中bf = CInt((100 * CLng(cursize / 1000)) / maxsize),这里邮件设计为10M
生成如图5
图5 登录后
4. 收件箱
收件箱页面首先用
<%
dim ei
set ei = server.createobject("easymail.InfoList")’创建对象并定义接收信息列表中内容,用
ei.LoadMailBox username加载组件中的信息
收件箱中所有的邮件信息用循环来显示接收,
<%
dim forpn
forpn = ""
i = 0
do while i < allnum’循环显示
ei.getMailInfo allnum - i - 1, idname, isread, priority, sendMail, sendName, subject, size, etime ’其中allnum为邮件总数,后面的分别从ei中定义的名称,是否阅读,收件人,发件人,主题,大小,时间等。
forpn = forpn & Chr(9) & idname
idname = NULL isread = NULL priority = NULL sendMail = NULL
sendName = NULL subject = NULL size = NULL
etime = NULL i = i + 1
loop %>’循环结束
如图6
图6 收件箱
5. 邮件查看
在查看邮件页面(showmail.asp)中同样调用组件中
<%dim ei
set ei = server.createobject("easymail.emmail")
%>‘来显示每一邮件的信息
值得注意的是在显示详细页面的时候,如果没有规定编码格式,可能出现乱码的情况,因此在这里添加一个判断
charset = UCase(ei.Text_CharSet)
if charset = "" or charset = "DEFAULT_CHARSET" then
charset = "gb2312"‘把页面的编码设为gb2312
日期,优先级,发件人,发件人地址,收件人地址,主题和邮件的详细内容分别调用组件中Time,XMSMailPriority等来实现,具体格式如下:
<%=ei.Time %>
邮件优先级判断:
<%
xmsp = ei.XMSMailPriority’定义邮件优先级
if xmsp = "High" then
Response.Write "<font color='#FF3333'>紧急邮件</font>"
elseif xmsp = "Low" then
Response.Write "慢件"
else
Response.Write "普通邮件"
end if
%>
发件人调用:
<%
Dim receiver
receiver = server.htmlencode(ei.FromMail)‘调用发件人
response.write receiver%>
<%
receiver = server.htmlencode(ei.Receiver)‘调用收件人
response.write receiver%>‘定义变量接收收件人变量
<%=server.htmlencode(ei.subject) %>‘调用主题
<%=server.htmlencode(ei.text) %>‘调用邮件内容
如图7
图7 邮件查看
3.4 主要代码
程序主要页面程序如下:
- 邮件发送页面:
<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace="System.Web.Mail" %>
<script language="vb" runat="server">
Sub SendMail(ByVal sender As Object, ByVal e As EventArgs)
Dim MailObject As New MailMessage() '构造一个mailmessage函数,MailObject为构造函数名
'下面是判断填的信息是否为空,不为空则为text中的内容
If Emailfrom.Text <> "" Then MailObject.From = Emailfrom.Text '发件人
If EmailTo.Text <> "" Then MailObject.To = EmailTo.Text '收件人,这里必填,否则邮件找不到邮件服务器上的邮箱信息,会出错
If EmailCc.Text <> "" Then MailObject.Cc = EmailCc.Text '抄送
If EmailBcc.Text <> "" Then MailObject.Bcc = EmailBcc.Text '密送
MailObject.Priority=MailPriority.High '邮件发送优先级,可以有high,normal和low三种选择
MailObject.Subject = EmailSubject.Text '邮件主题
MailObject.Body = EmailBody.Text '主体,即邮件内容
MailObject.BodyFormat = MailFormat.Text '设置邮件内容格式,Text为文本,Html为超文本
'MailObject.BodyEncoding '设置编码类型,参考有ascii
Dim MailAttachment As String '定义附件,这里不知道用string好还是可变的stringbuilder好
MailAttachment = EmailAttachment.PostedFile.FileName ' lenth变量控制附件大小,但是页面和服务器的设置如果不对的话会很麻烦
If MailAttachment<>"" Then MailObject.Attachments.Add(New MailAttachment(MailAttachment))
SMTPMail.SMTPServer = "localhost" '指定使用缺省的SMTP服务器,测试了很多次外网的邮件服务器都需要验证,而这个又没有验证,所以就用自己Win2003建的邮件服务器做测试
SMTPMail.Send(MailObject) '调用System.Web.Mail.send发送邮件
panelSendEmail.Visible = False
panelMailSent.Visible = True
End Sub
</script>’发送脚本部分完
‘html定义变量
<input name="file" type="file" id="EmailAttachment" size="40" runat="server" />
<ASP:button runat="server" id="SendButton" Text="发送"
OnClick="SendMail" /> ‘点击处理事件
</form>
</ASP:panel>
<ASP:panel id="panelMailSent" runat="server" Visible="False">’判断是否发送成功
邮件已经成功发送,欢迎您使用!
</ASP:panel></body></html>
2、邮件收件箱主要代码:
随机数产生函数:(作用是产生随机数,在注册时产生验证)
function getGRSN()’定义
dim theGRSN
Randomize
theGRSN = Int((9999999 * Rnd) + 1)’让99999999乘以随机数rnd的和加1并取整
getGRSN = "GRSN=" & CStr(theGRSN)
end function
定义邮箱空间使用率:
dim bf
if maxsize > 0 then
bf = CInt((100 * CLng(cursize / 1000)) / maxsize)
else
bf = 100
end if
列表:set ei = server.createobject("easymail.InfoList")
显示邮件主要函数:set ei = server.createobject("easymail.emmail")