用Asp.net高效地发送Html格式的Email(一)
下面是翻译的结果:
用Asp.net高效地发送Html格式的Email
Jan Ceulemans
应用环境:
1.ASP.NET 1.1
2.Visual Studio .NET 2003
3.SQL Server 2000 (SP3 或更晚版本)
摘要:
这篇文章介绍了利用组件和可扩展的基于类的架构,实现当需要在商务环境下利用asp.net发送html格式的邮件时的几种可能的解决方案。
下载:
绪论:
在大部分的web应用中,都是用纯文本的邮件,没有用html标记。但是在一些场景下,发送有标记的邮件是个不错的选择。另外,发送带有公司标志的邮件是更惬意的事。
这篇文章介绍了利用组件和可扩展的基于类实现的架构在商务环境下发送html邮件的几种可选方案。提供选择和讨论可以提高代码可读性,这篇文章的讲述,贯穿整个需要发送带有html标记的web应用。
场景:
让我们看一下:在今天很多的asp.net应用中,你--作为用户---必须注册并提供认证信息,以便提交购买信息,进入一个站点的特定部分,参与一个论坛,察看(参考)你的电子银行,如此等等。记住所有的密码有时候会很烦。因此大部分web应用都在登陆界面提供了从web应用数据库中获取密码的链接。大多数情况下,你被要求输入你注册帐号的时候用的E_mail地址。假如你的邮箱地址在数据库中可以找到的话,一封至少包含你密码的邮件将发到你的邮箱中。
在vs.net2003中设立应用
在开始前,我介绍一下这篇文章的源码。请确认您可以用vs.net,C#或者VB.Net。下载代码中既有C#也有vb.net,这篇文章中列出的是C#的源码。
另外,为了使代码在工程浏览器中看起来比较整洁,我在解决方案中建立了三个目录。Component将存放程序的C# 源码,UserControl存放用户控件,templates存放html文件。
从数据库中存放和获取认证信息
实现重新获取密码(在文中提到的场景中)的功能实际上是很简单的事情。你所要做的只不过是在数据库中增加储存用户注册信息(比如姓,名,E_mail)的表。打开企业管理器或者在vs.net2003中打开服务浏览器,创建一个名为HtmlEmail的新数据库,然后在该数据库中创建一个表Users,字段信息如下:
请记住象我这样在数据库中以明文方式存放密码等信息是不好的。在产品环境下,为了显而易见的安全原因,请采用加密方式存放。
为了获取用户名和密码,创建如下存储过程。
PROCEDURE GetLostCredentials(@EmailAddress nvarchar(50),
@Username nvarchar(50) OUTPUT, @Password nvarchar(50) OUTPUT,
@ExistingCredentials int OUTPUT) AS
SELECT
@Username=user_username, @Password=user_password
FROM Users
WHERE user_emailaddress=@EmailAddress
IF @@Rowcount < 1
SELECT
@ExistingCredentials = 0
ELSE
SELECT
@ExistingCredentials = 1
正如您看到的,以上存储过程用了output参数,output参数存放了传到数据访问层中,这一层将在文章的另一部分介绍。请注意我这里用了SQL Server的系统变量@@Rowcount,这个变量计算返回记录的条数,如果数据库中没有匹配用户所提供的E_mail,存储过程将以0作为它的值。如果有匹配的,则输出参数@xistingCredentials 将被赋值为1,只返回一条记录。这允许存储过程通知相关的aspx页面,SQL是否返回记录。这对于告诉用户是否已经发送了E_mail是很重要的。
通过数据访问层提供数据
采用数据访问层允许在我的程序里有效地处理和封装数据操作。
数据访问层有两个类组成:UserCredentialsCS 展现用户的认证信息,如果你喜欢,将是一条记录。我创建的第二个类---EmailDataCs---包含GetUserCradentials方法,这个方法将返回必要的UserCredenttialCs类(译注:这里应该是一个对象,UserCredenttialCs的属性不是Static类型的,不可能返回类去访问,估计是原作没有较真),它包含必要的信息(通过属性)。