ASP.NET 2.0发送电子邮件

 在新发行的ASP.NET 2.0版本中,微软不再建议使用System.Web.Mail命名空间而代之以新的System.Net.Mail命名空间。在这个新库中引入了许多新特征,但是在发送邮件的方式方面也相应地带入了一些小错误。

  一、 发送邮件

  在详细讨论这些小错误之前,让我们先看一段示例代码(我们假定你已经在文件开始添加了"using System.Net.Mail"):

MailMessage msg = new MailMessage();
msg.From = new MailAddress("address@domain.com", "Person's Name");
msg.To.Add(new MailAddress("destination@domain.com", "Addressee's Name");
msg.To.Add(new MailAddress("destination2@domain.com", "Addressee 2's Name");
msg.Subject = "Message Subject";
msg.Body = "Mail body content";
msg.IsBodyHtml = true;
msg.Priority = MailPriority.High;
SmtpClient c = new SmtpClient("mailserver.domain.com");
c.Send(msg);

  上面的代码与以前版本中的实现差不太多,仅是在指定消息时作了一些小的改动。不必自己来构建一个地址,你完全可以让系统为你代劳。如果你指定一个电子邮件地址和一个名字,它将自动地在消息中显示如下内容:

"Person's Name" <destination@domain.com>


  这正是一个电子邮件地址的"正确"格式。当然,你可以进一步把多个地址添加到To,CC和BCC集合中,其方式与上面完全相同。通过这种编程方式来实现发送大量消息要比分别发送每个消息要容易得多了-只需要把多个地址添加到BCC属性即可实现邮件的群发。

  二、 存在的问题

  现在,我们来分析一下其中存在的小错误。

  如前面所提及,这个新的命名空间中带有一些小错误。第一个是,当你发送一封电子邮件时,邮件的头部信息全部是以小写字母形式添加的。然而,在针对SMTP邮件RFC的规范中并没有指定邮件头部应该怎样大写;但是,许多垃圾邮件过滤程序却限制了头部没有正确大写的电子邮件消息。

  另一个错误与优先权设置有关系-通过优先权设置,用户可以指定一个消息在邮件客户端的重要程度。由于邮件头部的这种格式化方式(全部转化为小写),所以,我的邮件程序(Eudora)无法识别相应的优先权标志,因而也就不会专门标记出此邮件的重要程度。尽管这看上去有些琐碎,但是转换到新版本的System.Web.Mail以后这看上去并没有明显理由。

  所以,我还会继续探讨这个问题,如果实在找不到一个好的补救办法,那么我只要回到以前的System.Web.Mail以更有效了解决上面的警告问题。

 

ASP.NET 2.0中发送电子邮件剖析

一、简介

  如今,电子邮件已经成为一种无所不在、异步通知和分布式的消息系统。存在许多web开发场所;其中,服务器端代码都需要生成一个电子邮件并且把它发送给指定的接收者。该电子邮件可以被发送给网点中的一些用户,通知他们有关于他们的新建用户帐户,提醒他们忘记的口令,或以邮件形式提交给他们一个清单。当然,这也可以是针对web开发者或站点管理员,提供给他们有关一个刚刚公开的未处理的异常或用户回馈的消息。

  幸好,ASP.NET使得发送电子邮件非常轻松。.NET框架版本1.x在System.Web.Mail类中包括了许多类,它们允许以编程方式通过短短的几行代码来发送一个电子邮件。尽管这个命名空间和这些类仍然存在于.NET框架2.0版本中,但是它们已经过时,你可以在System.Net.Mail命名空间中找到新的与邮件支持相关的类。

  在本文中,让我们来一起探讨System.Net.Mail命名空间中的相关类,并且分析如何从一个ASP.NET 2.0页面的code-behind类中发送一个电子邮件。我们还要在Web.config中指定中继服务器消息以及如何把这个消息应用于一些内置ASP.NET服务器控件中以便实现发送电子邮件(例如当一个用户创建一个帐户或需要一个口令提示器/重置器时)。

  二、探讨System.Net.Mail命名空间中的类

  在System.Net.Mail命名空间中共有16个不同的类,它们都与把电子邮件发送到一个指定的简单的邮件传输协议(SMTP)服务器以便进一步提交有关。在这个命名空间中有两个核心类是:

  · MailMessage:描述一个电子邮件消息;它拥有From,To,Subject,Body等属性;

  · SmtpClient:把一个指定的MailMessage实例发送到一个指定的SMTP服务器。

  典型地,当你从一个ASP.NET 2.0页面中发送电子邮件时,你要:

  1. 创建一个MailMessage对象;

  2. 赋给它属性;

  3. 创建一个SmtpClient类实例;

  4. 指定关于使用该SMTP服务器的细节(如果它们没有在Web.config中指定);

  5. 经由SmtpClient对象的Send方法发送该MailMessage。

  其中,上面的第1步和第2步可以被略过,因为SmtpClient类的Send方法能够接收一个MailMessage对象或接收四个字符串(分别描述电子邮件消息内容的from,to,subject和body部分)。

  System.Net.Mail命名空间中的其它类还提供了更高级的电子邮件功能。例如,这些类能够用于在一个电子邮件消息中添加附件,把对象嵌入到一个电子邮件,指定SMTP服务器认证消息等;还有一些Exception的派生类用于处理SMTP特定的异常。我们会在以后的文章中来讨论这些其它类的更高级的使用情形。

  三、提供有关SMTP服务器的详细信息

  当从Outlook或GMail中把一个电子邮件发送给一个朋友时,该电子邮件程序使用一个中继服务器建立一个连接并且发送该电子邮件消息的内容(连同其它一些消息,例如电子邮件创建日期,电子邮件格式(文本或HTML,等等),接收者,等等)。中继服务器接收该消息,然后连接到接收者的SMTP服务器并且发送该消息。一旦该消息被提交,接收者就能够(稍后)使用一种不同的协议(例如IMAP或POP3)来提取该消息。

  因此,为了从一个ASP.NET页面中发送一个电子邮件,我们需要提供给SmtpClient类关于该中继服务器的消息。借助于中继服务器的主机名,你能够指定下列信息:相应的端口号(典型地使用端口25),当把你的电子邮件消息内容连接到中继服务器时是否使用SSL,以及认证证书(如果必要的话)等。作为选择,如果你可以在你的web服务器上安装一个本地SMTP服务,它可以周期性地监视一个特别的"drop-off"目录,发送出现在那个目录中的任何消息。你能够配置是否该SmtpClient类把它的电子邮件消息传送给一个单独的中继服务器或是否能通过DeliveryMethod属性把该邮件投入到一个指定的检出目录下。

  SmtpClient类使用的中继服务器信息能够以编程方式通过SmtpClient类的属性指定,也可以被集中在Web.config文件中。为了使用Web.config方法,你可以在<configuration>元素内添加一个<system.net>元素。然后,添加一个包含一个<smtp>元素(其设置是在它的<network>子元素中指定的)的<mailSettings>元素。请参考如下的代码:

<configuration>
 <!-把电子邮件设置添加到<system.net>元素-->
 <system.net>
  <mailSettings>
   <smtp>
    <network host="relayServerHostname" port="portNumber" userName="username" password="password" />
   </smtp>
  </mailSettings>
 </system.net>
 <system.web> ... </system.web>
</configuration>


  其中的host属性包含relayServerHostname。如果你正使用一个外部中继服务器,那么该relayServerHostname可能是类似于smtp.yourisp.com的内容。如果该中继服务器的端口数字是除典型的端口25以外的其它数,那么你可以通过port属性来指定它。大多数外部中继服务器都要求实现某种类型的认证(为了防止匿名垃圾邮件通过中继发送他们的垃圾信息)。在需要用户名/口令认证时需要提供userName和password属性。

  只有SmtpClient属性的一个子集能够通过Web.config中的设置指定。为了定制其它的SmtpClient属性(例如EnableSsl,Timeout,等等),你可以在发送电子邮件时以编程方式设置它们。

 四、通过回馈Web页面发送管理员电子邮件

  为了说明使用MailMessage和SmtpClient类来实现发送一个电子邮件,我已经创建了一个简单的回馈页面示例。在这个页面中,用户被提示输入其电子邮件地址,他们的回馈主题和相应的回馈内容。

<table border="0">
<tr>
<td>
<b>Your Email:</b>
</td>
<td>
<asp:TextBox runat="server" ID="UsersEmail" Columns="30"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<b>Subject:</b>
</td>
<td>
<asp:TextBox runat="server" ID="Subject" Columns="30">
</asp:TextBox>
</td>
</tr>
<tr>
<td colspan="2">
<b>Body:</b> <br />
<asp:TextBox runat="server" ID="Body" TextMode="MultiLine" Columns="55" Rows="10">
</asp:TextBox>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<asp:Button runat="server" ID="SendEmail" Text="Send Feedback" />
</td>
</tr>
</table>



  一旦用户提供了回馈消息并且点击了"Send Feedback"按钮,即发生一个回寄并且该按钮的Click事件激发。在该事件处理器内,一个MailMessage对象被创建,并且它的To,From,Subject和Body属性都根据用户提供的消息加以设置。在创建MailMessage对象并且填充它的属性后,该电子邮件被通过SmtpClient类的Send方法发送出去。

Protected Sub SendEmail_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SendEmail.Click
 '!!!把这个值更新为你的电子邮件地址
 Const ToAddress As String = "you@youremail.com"
 '(1)创建MailMessage实例
 Dim mm As New MailMessage(UsersEmail.Text, ToAddress)
 '(2)属性MailMessage赋值
 mm.Subject = Subject.Text
 mm.Body = Body.Text
 mm.IsBodyHtml = False
 '(3)创建SmtpClient对象
 Dim smtp As New SmtpClient
 '(4)发送MailMessage(将使用Web.config设置)
 smtp.Send(mm)
End Sub


  在这里的代码中,我们不需要设置SmtpClient类的任何属性,因为它们已经在Web.config文件中指定了(请参考本文下载源码)。


  五、结论

  通过进一步结合来自于ASP.NET 1.x的其它改进功能,ASP.NET 2.0中的电子邮件发送能力被进一步更新并且移动到一个新的命名空间-System.Net.Mail。在ASP.NET 2.0中,中继服务器设置能够容易地脱离ASP.NET代码,而移动到Web.config文件中,正如我们在这个示例所看到的。而且,还有对中继服务器认证更好的支持。在下篇文章中,我们将探讨更高级电子邮件使用情况,例如构造HTML格式的电子邮件,发送附件,把对象嵌入到电子邮件内,处理与SMTP/中继服务器相关的异常,等等。

ASP.NET 2.0发送电子邮件全面剖析之二

 

 一、简介

  在上篇中我们详细分析过,.NET框架2.0版本提供了一个新的命名空间(System.Net.Mail)和一些发送电子邮件的新类(注意:.NET框架1.x版本中提供的命名空间System.Web.Mail及相关的类仍然可以使用,以实现向后兼容性)。而且,我们还详细分析过如何使用System.Net.Mail命名空间中的MailMessage和SmtpClient类来发送简单的普通文本格式的电子邮件消息。

  本篇将讨论与电子邮件相关的更高级的选项。我们要分析如何发送HTML格式的电子邮件,如何包括附件,以及当发送一个电子邮件时如何优雅地处理SMTP异常(例如无效的中继服务器凭证或如果该中继服务器处于离线状态)。

  本文假定你已经熟悉从一个ASP.NET 2.0 web页面发送简单的普通文本电子邮件;否则的话,请首先阅读本系列文章中的上篇。

  二、发送HTML格式的电子邮件

  在ASP.NET 2.0中发送电子邮件时,我们已经看到如何发送普通文本电子邮件,这是通过把电子邮件内容赋给MailMessage类的Body属性实现的。其实,为了发送HTM格式的电子邮件,我们只要简单地把Body属性设置为要发送的HTML内容,然后把MailMessage类的IsBodyHtml属性设置为True即可。

  为了演示如何发送一个HTML格式的消息,我创建了一个示例,其名字为HtmlEmail.aspx。代码如下:

'(1)创建MailMessage实例
Dim mm As New MailMessage(FromEmailAddress, ToEmailAddress)
'(2)赋值MailMessage的属性
mm.Subject = "HTML-Formatted Email Demo Using the IsBodyHtml Property"
mm.Body = "<h2>This is an HTML-Formatted Email Send Using the <code>IsBodyHtml</code> Property</h2><p>Isn't HTML <em>neat</em>?</p><p>You can make all sorts of <span style=""color:red;font-weight:bold;"">pretty colors!!</span>.</p>"
mm.IsBodyHtml = True
'(3) 创建SmtpClient对象
Dim smtp As New SmtpClient
'(4)发送MailMessage (将使用Web.config设置)
smtp.Send(mm)

  如你所见,简单地把Body属性设置为要发送的HTML内容,并且把IsBodyHtml属性设置为True。至此,所有这些你已经完成!被发送到中继服务器的实际电子邮件内容(并且最后要到达接收者的电子邮件客户端)看上去如下所示:

x-sender: ToEmailAddress
x-receiver: FromEmailAddress
mime-version: 1.0
from: FromEmailAddress
to: ToEmailAddress
date: 25 Jul 2006 15:06:44 -0700
subject: HTML-Formatted Email Demo Using the IsBodyHtml Property
content-type: text/html; charset=us-ascii
content-transfer-encoding: quoted-printable
<h2>This is an HTML-Formatted Email Send Using the <code>IsBodyHtml</code>=
Property</h2><p>Isn't HTML <em>neat</em>?</p><p>You can make all sorts=
of <span style=3D"color:red;font-weight:bold;">pretty colors!!</span>.</p>

  提示:观察发送到中继服务器的电子邮件内容

  观察通过SmtpClient类发送到中继服务器的实际电子邮件内容是很有趣的(如上面这样),对不对?在上篇中,我们讨论了如何配置SmtpClient类以把电子邮件发送到一个中继服务器或者把它投入到一个指定的目录下。使用第二个选择时,我们能够探讨实际的电子邮件内容。你可以检查本文下载代码中的Web.config文件。其中,有一个加了注释的<smtp>元素,它展示了如何配置该SmtpClient类以便把电子邮件的内容复制到一个指定的目录。

  该电子邮件客户端(假定它支持HTML格式的电子邮件)将在电子邮件内显示该HTML内容。如下图所示。


  提示:有关发送HTML格式的电子邮件的说明

  当发送HTML格式的电子邮件时,必须理解你在你的屏幕看到的HTML可能与你的接收者所看到的相当不同。大多数的电子邮件客户端都会"剔除"潜在危险的HTML内容(例如ActiveX控件等),许多用户都阻止JavaScript运行。

三、包括附件

  MailMessage类有一个Attachments属性,它是一个Attachment类实例的集合。你能够把web服务器上的一个现有文件附加到电子邮件消息,或使附件的内容基于一个流(Stream)。为了展示使用附件发送电子邮件,我创建了一个演示程序,其中访问者能够填充一个回馈形式的表单以便把一个电子邮件发送到管理员。然而,这个回馈表单允许访问者从他们的计算机中选择一个文件以便依附到从该web页面发送的电子邮件中(这很象基于Web的电子邮件程序,如Hotmail,GMail,等等。当发送一个电子邮件时,它们允许你附加一个你的计算机中的文件)。

  为了允许访问者从他们的计算机中附加一个文件,我们需要允许该用户把他们的计算机中的一个文件上载到web服务器。这可以使用FileUpload控件(这是ASP.NET2.0新添加的)来容易地实现。让我们来看一下这个演示程序中用于创建用户接口的声明性语法:

<table border="0">
<tr>
<td><b>Your Email:</b></td>
<td><asp:TextBox runat="server" ID="UsersEmail" Columns="30"></asp:TextBox></td>
</tr>
<tr>
<td><b>File to Send:</b></td>
<td>
<asp:FileUpload ID="AttachmentFile" runat="server" />
</td>
</tr>
<tr>
<td colspan="2">
<b>Body:</b><br />
<asp:TextBox runat="server" ID="Body" TextMode="MultiLine" Columns="55" Rows="10"></asp:TextBox>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<asp:Button runat="server" ID="SendEmail" Text="Send Feedback" />
</td>
</tr>
</table>

  这个FileUpload控件生成一个<input type="file" ... />HTML元素,它在浏览器中被显示为带有一个Browse按钮的一个文本框。当被点击时,一个对话框打开以便用户能够从他们的计算机中选择一个文件。

点击放大此图片

  在填满回馈表单后,选择一个要上传的文件,并且点击"Send Feedback"按钮,则发生一个回寄,最后把选择文件的内容发送到web服务器。在"Send Feedback"按钮的点击事件处理器中,创建一个MailMessage对象,并且添加一个附件。由于该FileUpload提供一个到上传数据的Stream,所以,我们可以简单地指向在这个Stream中的新的Attachment对象。我们不需要把上传文件保存到web服务器的文件系统。

'确保已经上传一个文件
If String.IsNullOrEmpty(AttachmentFile.FileName) OrElse AttachmentFile.PostedFile Is Nothing Then
 Throw New ApplicationException("Egad, a file wasn't uploaded... you should probably use more graceful error handling than this, though...")
End If
'(1) 创建MailMessage实例
Dim mm As New MailMessage(FromEmailAddress, ToEmailAddress)
'(2)赋值MailMessage的属性
mm.Subject = "Emailing an Uploaded File as an Attachment Demo"
mm.Body = Body.Text
mm.IsBodyHtml = False
'附加文件
mm.Attachments.Add(New Attachment(AttachmentFile.PostedFile.InputStream, AttachmentFile.FileName))
'(3) 创建SmtpClient对象
Dim smtp As New SmtpClient
'(4)发送MailMessage (将使用Web.config设置)
smtp.Send(mm)

  在上面的代码示例中重载的Attachment构造器使用两个输入:一个对Stream(它包含要附加的数据)的引用,以及要使用的附件名字。该FileUpload的FileName和FileName属性被应用于这两个值。

四、处理SMTP异常

  当从一个ASP.NET页面发送电子邮件时,如果中继服务器关闭会发生什么?如果认证信息使用无效,又会怎么样呢?在出现一个SMTP错误时,SmtpClient类将抛出一个SmtpException异常。为了较好地处理这样的问题,我们可以在发送电子邮件的代码中加入异常处理代码。如果出现一个SmtpException,则我们能够显示一个更友好的信息性的错误提示。

  在本文的下载内容中,我包括了一个演示,它允许访问者指定要使用的中继服务器以及认证信息。如果在试图发送一封电子邮件时存在一个错误,那么将显示一个客户端警告框,解释该问题。为了测试这一点,对于一个需要认证的中继服务器,你可以输入一个无效的中继服务器主机名或无效的凭证。

Try
 '(1)创建MailMessage实例
 Dim mm As New MailMessage(FromEmailAddress, ToEmailAddress)
 '(2)赋值MailMessage的属性
 mm.Subject = "Test Email... DO NOT PANIC!!!1!!!111!!"
 mm.Body = "This is a test message..."
 mm.IsBodyHtml = False
 '(3)创建SmtpClient对象
 Dim smtp As New SmtpClient
 'SMTP设置...
 smtp.Host = Hostname.Text
 If Not String.IsNullOrEmpty(Port.Text) Then
  smtp.Port = Convert.ToInt32(Port.Text)
 End If
 If Not String.IsNullOrEmpty(Username.Text) Then
  smtp.Credentials = New NetworkCredential(Username.Text, Password.Text)
 End If
 '(4)发送MailMessage(将使用Web.config设置)
 smtp.Send(mm)
 '显示一个客户端弹出窗口,解释该该邮件已经发出
 ClientScript.RegisterStartupScript(Me.GetType(), "HiMom!", String.Format("alert('An test email has successfully been sent to {0}');", ToAddress.Replace("'", "/'")), True)
 Catch smtpEx As SmtpException
  '当发送电子邮件消息时发生了一个问题
  ClientScript.RegisterStartupScript(Me.GetType(), "OhCrap", String.Format("alert('There was a problem in sending the email: {0}');", smtpEx.Message.Replace("'", "/'")), True)
 Catch generalEx As Exception
  '发生另外的一些问题
  ClientScript.RegisterStartupScript(Me.GetType(), "OhCrap", String.Format("alert('There was a general problem: {0}');", generalEx.Message.Replace("'", "/'")), True)
End Try

  这段代码捕获SMTP特定的错误消息和普通的异常(例如把无效电子邮件地址赋值给MailMessage对象的To或From属性)。在任何一种情况下,显示一个客户端警告框以通知该用户有关该错误的细节信息。


  五、结论

  在本文中,我们了解了如何发送HTML格式的电子邮件,使用附件发送电子邮件,以及优雅地处理在发送一个电子邮件消息中发生的异常。发送一个HTML格式的电子邮件就象在Body属性中指定HTML内容并且把IsBodyHtml属性为设置True一样地简单。真正的挑战在于,确保HTML内容能够在流行的电子邮件客户端按预期效果生成。为了把一个附件添加到一个电子邮件,只需要简单地添加一个Attachment对象到MailMessage的附件集合中。附件相应的数据可以来自于web服务器上的一个文件或来自于一个流。最后,为了处理SMTP级的异常,你可以添加使用SmtpClient类捕获SmtpException抛出的异常处理代码。

 

用ASP.NET设计高效邮件列表

 一个吸引人的、功能完备的网站往往具有以下特征:一是内容充实、实用,吸引对该类内容干兴趣的浏览者;二是页面设置合理,页面设计精美;三是网站互动性强,用户和网站或者用户与用户之间交流方便高效;四是网站内容更新及时并且可以第一时间通知用户。以上这些特点可能对于一些大型的门户网站而言,不是特别适合,因为门户网站的特点,用户流量往往不是内容的区别而是用户习惯、历史原因和地域区别(比如广东地区的浏览者喜欢网易、北京的喜欢新浪)。而对于一般个人网站或者企业网站而言,以上特点就显得特别重要,因为这类网站内容更新不是很快,浏览者来这些网站往往具有特定目的性(比如寻找特定领域的资料或者产品信息),当网站内容吸引到用户以后,网站的更新信息或者网站最新新闻就有必要及时通知浏览者,以此来紧紧抓住浏览者,培养浏览者的“浏览忠诚度”。这就是网站邮件列表的作用。

  一、邮件列表作用和工作方式

  邮件列表是什么呢?邮件列表就是网站或者机构为了及时通知信息给相关用户,将这些用户的电子邮件保存并且在有信息需要发送的时候将信息分别发送给所有用户。表面上,邮件列表和发送电子邮件的时候使用的“附送”“密送”差不多,基本没什么差别,其实,它们还是有差别的:

  (1)邮件列表具有明确的发行目的,发送邮件列表就是为了发送特定信息给特定用户;

  (2)邮件列表接受人不能取得其他接受人的资料,这一点是邮件列表和电子邮件附送的最大区别。

  我们知道,当我们收到一些电子邮件的时候,发现在邮件的“附送”栏有很多其他用户的邮件地址,这就是通过“附送”方式将邮件发送给一系列用户;而通过邮件列表发送的邮件,用户感觉就是发送人单独发送给用户的,不能看见其他用户的信息,当然,实质也是这样发送的。这样,我们就可以知道邮件列表的工作方式其实是将每个用户的电子邮件取出,然后逐个发送相同的信息。

  邮件列表既然是单独逐个发送信息,那么,肯定我们不能通过手工一个个发送,只能通过软件来发送。现在,邮件列表的发送以下几种方式,一是通过专门的邮件群发软件来实现,这些软件将所有电子邮件地址读入,然后逐个发送,这些软件的优点是可以针对具体用户改变邮件主题信息或者发送人邮箱;缺点是往往这些软件需要注册费用;二是通过专门的邮件列表服务提供网站实现,这些网站通过程序帮助邮件列表发行者将信息发送给订阅者,这是个人用户使用最多的一种方式,这种方式的优点是简单、免费,缺点是往往这些服务提供网站性能不是很稳定,邮件延迟情况时常发生;三是通过自己的网站设计一个邮件列表程序,自己管理,这样的优点是发送信息高效、管理方便,缺点是技术实现稍微优点困难,不是很适合一般用户。我们在这里就介绍通过ASP.NET编程实现一个功能完备的邮件列表。

  二、邮件列表的设计

  在设计之前我们必须知道一点,邮件列表的所有电子邮件地址必须保存成为一个文件,这里,我们将所有电子邮件地址保存在Access数据库中,这样可以很方便的对邮件地址进行增加、修改、删除等操作。在这里,我们的数据库名为mail.mdb,位于data目录下。数据表名为mail,只有一个字段“mail”,用于保存电子邮件地址。

  作为一个长期的网站功能,我们当然要求没发送以此邮件都必须有详细的发送记录和每个邮件的发送情况。这里,我们在程序中会自动在log目录使用发送邮件的主题为文件名生产一个HTML格式的Log日志文件。
现在,我们已经基本了解了程序的功能和文件结构,我们来看程序代码:

<%@ Page Language="VB" Debug="True" Explicit="True"%>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.Web.Mail" %>
<%@ Import Namespace="System.IO" %>

<html>

<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>邮件列表</title>

<style>
<!--
a:link{color:#0066FF;text-decoration:none;font-size:"9 pt"}
a:visited{color:#000066;text-decoration:none;font-size:"9 pt"}
a:actived{color:#FF0000;font-size:"9 pt"}
a:hover{color:#FF0000;font-size:"9 pt"}
table{font-size:"11 pt"}
-->
</style>

</head>

<body>

<SCRIPT language=VB RUNAT="server">
Sub SendMail(Obj As Object, E As EventArgs)
 lbmsg.Text=""

 Dim mailObj AS new MailMessage
 Dim smtp AS new SmtpMail
 '定义SMTP服务器的名称
 Smtp.smtpserver="127.0.0.1"
 '定义邮件的发送地址
 mailObj.From=sendmailbox.value
 '定义邮件的接收地址
 Dim conn AS OleDbConnection
 conn=connectdb("data/mail.mdb")
 conn.open()
 Dim reader As oledbdatareader
 reader=readdb(conn,"select * from mail")
 
 while (reader.read())
 try
  mailObj.To=reader("mail")

  mailObj.Subject =subject.value
  mailObj.Body =content.value
  '默认发送邮件格式为纯文本TEXT,如果选择HTML格式,设置为HTML格式
  if mode.value="HTML" then
   mailObj.BodyFormat=MailFormat.Html
  end if
  '设置邮件发送级别为高
  mailObj.Priority = MailPriority.High

  Smtp.Send(mailObj)

  lbmsg.text=lbmsg.text+reader("mail")+"OK!Time:"+Now().ToString()+"<br>"
  catch er as Exception
   lbmsg.text=lbmsg.text+er.message+"<br>"
  finally
 End Try
 End While
 reader.close()
 Dim strwriterobj As StreamWriter
 try
  strwriterobj= File.CreateText(Server.MapPath("log/")+subject.value+".htm")
  strwriterobj.Write("<HTML><head><meta http-equiv='Content-Language' content='zh-cn'><meta http-equiv='Content-Type' content='text/html; charset=gb2312'></head><BODY>"+lbmsg.text+"</BODY></HTML>")
 catch er as Exception
  lbmsg.text=lbmsg.text+er.message+"<br>"
 finally
  strwriterobj.close
  lbmsg.text=lbmsg.text+"日志保存成功!保存目录:<br>"+Server.MapPath("log/")+subject.value+".htm"
 End Try
End Sub

'链接数据库
'www.knowsky.com
Function ConnectDB(txtdatabase AS String) As Oledbconnection
 Dim conn AS OledbConnection
 Dim connstr As String
 connstr="Provider=Microsoft.Jet.OLEDB.4.0; Persist Security Info=False; Data Source=" +Server.MapPath(txtdatabase)
 connectdb=New OledbConnection(connstr)
End Function

'读取一条记录
Function readdb(conn As Oledbconnection,txtsql As String) As OledbDataReader
 Dim cmd As OledbCommand
 cmd=new oledbcommand(txtsql,conn)
 readdb=cmd.executereader()
End Function
</SCRIPT>

<p align="center"><font size="5" face="楷体_GB2312">邮件列表</font></p>
<hr width="60%" size="1">
<div align="center">
<center>
<table border="0" width="770">
<tr>
<td width="100%">
<form method="POST" runat="Server">
<table border="0" width="100%" height="125">
<tr>
<td width="15%" align="right" height="24"> 发送邮箱: </td>
<td width="85%" height="24"><input type="text" name="sendmailbox" id="sendmailbox" size="50" runat="Server"/></td>
</tr>
<tr>
<td width="15%" align="right" height="24"> 标题: </td>
<td width="85%" height="24"><input type="text" name="subject" id="subject" size="50" runat="Server"/></td>
</tr>
<tr>
<td width="15%" align="right" height="60">内容:</td>
<td width="85%" height="60"><textarea rows="6" name="content" cols="80" id="content" runat="Server"/></textarea></td>
</tr>
<tr>
<td width="15%" align="right" height="23">方式:</td>
<td width="85%" height="23"><select size="1" name="mode" id="mode" runat="Server">
<option value="Text" selected>Text</option>
<option value="HTML">HTML</option>
</select></td>
</tr>
</table>
<p align="center"><input type="button" value=" 提 交 " name="ok" onserverclick="sendmail" runat="Server"/></p>
</form>
<ASP:Label id="lbmsg" runat="Server"/>
<p> 
</td>
</tr>
<tr>
<td width="100%"></td>
</tr>
</table>
</center>
</div>

</body>

</html>

  程序运行界面如下(图一):

 

  在以上的程序中,我们将一些比较常见的功能设置成为函数,在主体程序中直接调用这些函数,这样,程序看起来比较简洁,修改也很简单。在这里,我们简单介绍一下这些函数,一是连接数据库的ConnectDB(txtdatabase AS String),这个函数使用Access数据库的相对位置作为函数参数,返回数据库连接OleDbConnection;函数readdb(conn As Oledbconnection,txtsql As String)可以直接执行一条SQL语句,返回OledbDataReader。在程序中,我们将每一个邮件发送的结果保存并且最好生成一个HTML格式的日志文件。因为程序中我们用到了数据库、电子邮件和文件操作,以此,在引入名字空间的时候,我们需要将“System.Data.OleDb”、“System.Web.Mail”和“System.IO”引入。

  在使用以上邮件列表程序的时候,我们需要注意几个问题,第一是Smtp服务器的设置,我们知道,Smtp服务器是邮件发送服务器,而现在一些免费邮件提供商是不再提供针对所有邮件提供Smtp服务,在发送邮件的时候,需要验证用户信息,而我们看到,在以上的程序中甚至整个ASP.NET的邮件部分,根本没有考虑Smtp用户验证问题,以此,我们不能随便使用一个Smtp服务器,而必须使用完全免费的Smtp服务器,这样的服务器现在已经很少了。所以,如果有条件,最好我们自己设置计算机为Smtp服务器,怎样实现,我们可以下载EasyMail等软件。第二是邮件发送速度问题,如果Smtp服务器在本地计算机,发送速度很快的,基本上不用担心,如果不是本地服务器,那么发送的时候最好不要以此太多,一是速度问题,二是以此发送太多邮件,Smtp服务器可能认为是垃圾邮件而拒绝服务,这一点我们可以自己试验;第三是邮件发送发送人的设定问题,通过这个程序或者说通过使用ASP.NET的邮件功能,我们完全可以在邮件发送人随意写,这样,很容易别有用心的人就可以通过这个功能来发送垃圾邮件,当然,这些邮件追查来源很简单,直接查IP就可以,随意,我们最好不要随意发送。

  三、总结

  以上我们用一个具体的实例介绍了完整邮件列表的设计,该程序完全根据实际需要设计,具有较大的实用性。在程序实现中,我们同时使用了数据库、邮件和文件操作,涉及内容较多,有兴趣的朋友可以根据自己的实际要求适当修改,使程序功能更加全面
阅读更多

没有更多推荐了,返回首页