用Asp.net高效地发送Html格式的Email(四)
开发一个能够发送Html格式邮件的用户控件
实际上开发这个控件是很简单的。在UserControl的文件夹里,添加一个名为SimpleEmailTemplate.ascx 的控件并添加想要的Html代码(看看下载的代码中的html代码是否中意)。在相关联的后台代码SimpleEmailTemplate.ascx.cs 中,添加两个Literal 控件并声明两个公共属性。这些公共属性对这个用户控件是至关重要的,因为在本文接下来的部分用这些属性给Literal 控件的value赋值。
由上在SimpleEmailTemplate.ascx.cs 文件中产生的代码如下:
{
protected System.Web.UI.WebControls.Literal LiteralUsername;
protected System.Web.UI.WebControls.Literal LiteralPassword;
private string _Username;
private string _Password;
public string Username
{
get
{
return _Username;
}
set
{
_Username = value;
LiteralUsername.Text = _Username;
}
}
public string Password
{
get
{
return _Password;
}
set
{
_Password = value;
LiteralPassword.Text = _Password;
}
}
}
注意,我在各自属性的set方法里给两个Literal控件赋了值。这是必须的,因为当呈现一个用户控件去发送邮件的时候,Page_Load事件将不再触发。
现在,创建的用户控件如何呈现为一个html格式的邮件?这是我在下面就呈现给您的内容。
用这个控件发送html格式的邮件
现在在您的工程里面添加一个名为SimpleHtmlTemplate.aspx 的页面。这个页面将包含与"创建页面获取失去的密码"部分同样的接口,因此我将不再赘述。
让我们看一下后台文件 SimpleHtmlTemplate.aspx.cs ,并看一下它是如何做的
{
HtmlEmailCS.EmailDataCS Credentials = new HtmlEmailCS.EmailDataCS();
HtmlEmailCS.UserCredentialsCS UserData =
Credentials.GetUserCredentials(Convert.ToString(TextboxEmailAddress.Text));
if (UserData.ExistingCredentials > 0)
{
try
{
SimpleEmailTemplate EmailTemplate =
((SimpleEmailTemplate)LoadControl
(“~/UserControls/SimpleEmailTemplate.ascx”));
EmailTemplate.Username = UserData.Username;
EmailTemplate.Password = UserData.Password;
StringWriter StringWriter = new StringWriter();
Html32TextWriter HtmlMailWriter = new Html32TextWriter(StringWriter);
EmailTemplate.RenderControl(HtmlMailWriter);
string Body = StringWriter.ToString();
MailMessage MailMessage = new MailMessage();
MailMessage.From = “info@domain.com”;
MailMessage.To = Convert.ToString(TextboxEmailAddress.Text);
MailMessage.Subject = “Your credentials”;
MailMessage.Body = Body;
MailMessage.BodyFormat = MailFormat.Html;
SmtpMail.SmtpServer = “mail-out.server.com”;
SmtpMail.Send(MailMessage);
LabelMessage.Text = “The requested information has been sent to the email
address specified.”;
}
catch (Exception ex)
{
LabelMessage.Text = ex.Message.ToString();
}
}
else
{
LabelMessage.Text = “Please provide a valid e-mail address”;
}
}
}
}
上面就是SendSimpleEmailTemplate 代码的主要部分。首先我创建了一个EmailDataCS 类的实例,接着我定义了一个UserCredentialsCS类型的实例UserData,我调用Credentials对象(EmailDataCS类型的)的GetUserCredentials方法,获取我的用户控件SimpleEmailTemplate.ascx需要的认证信息。
我通过UserCredentialsCS 的ExistingCredentials 属性判断对象是否包含需要的认证信息。如果包含,发送Mail。然后我将通过LoadControl方法 动态地加载用户控件SimpleEmailTemplate.ascx ,同时我将用户控件转换为SimpleEmailTemplate类型。现在我通过UserCredentialsCS的实例UserData 的属性UserName和PassWord给用户控件公共属性赋值。
当这些做完后,我实际上已经把控件作为html格式的E_mail来呈现。为了实现这个目的,我首先用了StringWriter类,它内在地采用了StringBuilder.这个类将把信息--SimpleEmailTemplate.ascx 的内容--转换成string类型。这里要注意最终的输出代码必须转换成适当的html代码。为了实现这个要求,我创建了Html32TextWriter 的一个实例,并把StringWriter 作为参数传入。
EmailTemplate 类(SimpleEmailTemplate 类的一个实例,它实际的包含着用户控件SimpleEmailTemplate .ascx的实例)的方法RenderControl呈现我的HtmlMailWriter.我创建了一个string类型的变量body,并将StringWriter 做类型转换后赋值给它。这样用户控件的内容就变成了我邮件的内容。
接下来就是创建一个MailMessage 的实例,给相关的属性赋值(比如"From","To","Body","Format")并且将信息发送给用户。如果在进行的过程中发生错误,将会报告给用户。如果因为用户填入了错误的E_mail而不能发送,用户将得到通知。