用Asp.net高效地发送Html格式的Email(五)
通过模板解析器发送Html格式的E_Mail
本部分所要描述的产生html格式的E_Mail的解决方案将呈现的输出与本文其他方式产生的输出是完全一样的。它采用完全不同的技术,它已经在开发领域出现多年了:解析。让我们先创建解析器,代码如下:
他们是如何创建,有什么用那?首先:HtmlTemplateParserCS类的属性(只读),这些属性对我的类来说是至关重要的。为了解析html文件,我需要一个TemplateFileName,符号(作为我模板文件中数据的占位符)数组,数据(呈现从数据储存器中获取的数据)数组。符号和值是由“|”分割的字符数组。注意,我在他们各自属性的set方法里通过Split方法(value变量的)分割数组。分割是必须的,因为我要移除“|”字符。
在方法GetParsedHtmlFile中,我创建了StringBuilder的实例FileContents ,它将附加函数GetContentOfTemplateFile的返回值。
方法GetContentOfTemplateFile 将文件名作为参数,并用StreamReader 读取提供的html模板的内容,然后以string类型返回模板的内容。
剩下的事就是用各自的值替换符号。为了实现这个目的,我重新遍历数组,通过用GetLowerBound 和GetUpperBound 方法探测边界。然后以string类型返回FileContents的内容。
利用解析发送Mail
问题是如何利用上面开发的解析器发送Mail?这是我接下来要描述的。从一个新的名为TemplateHtmlParser.aspx的开始。用户获取密码的接口以及触发的行为---发送要求的Mail---跟文章前面部分描述的一样,所以不再赘述。但是,我发现我必须创建一个新的名为ParsedHtmlEmailCS.cs的文件,它将从EmailDataCS(这个前面也有叙述)的实例中获取必需的数据。下面的代码展示了上面所说的内容
本部分所要描述的产生html格式的E_Mail的解决方案将呈现的输出与本文其他方式产生的输出是完全一样的。它采用完全不同的技术,它已经在开发领域出现多年了:解析。让我们先创建解析器,代码如下:
public class HtmlTemplateParserCS
{
private string _TemplateFileName;
private string[] _Tokens;
private string[] _Values;
public string TemplateFileName
{
get
{
return _TemplateFileName;
}
set
{
_TemplateFileName = value;
}
}
public string Tokens
{
set
{
_Tokens = value.Split(Convert.ToChar(“|”));
}
}
public string Values
{
set
{
_Values = value.Split(Convert.ToChar(“|”));
}
}
public HtmlTemplateParserCS()
{
//Constructor
}
public string GetParsedHtmlFile()
{
StringBuilder FileContents = new StringBuilder();
FileContents = FileContents.Append(GetContentOfTemplateFile(TemplateFileName));
for (int TokenCounter = _Tokens.GetLowerBound(0); TokenCounter <=
_Tokens.GetUpperBound(0); TokenCounter++)
{
FileContents = FileContents.Replace(_Tokens[TokenCounter],
_Values[TokenCounter]);
}
return FileContents.ToString();
}
private string GetContentOfTemplateFile(string FileName)
{
StreamReader StreamReaderHtmlFile;
string ContentOfFile;
StreamReaderHtmlFile = File.OpenText(FileName);
ContentOfFile = StreamReaderHtmlFile.ReadToEnd();
StreamReaderHtmlFile.Close();
return ContentOfFile;
}
}
{
private string _TemplateFileName;
private string[] _Tokens;
private string[] _Values;
public string TemplateFileName
{
get
{
return _TemplateFileName;
}
set
{
_TemplateFileName = value;
}
}
public string Tokens
{
set
{
_Tokens = value.Split(Convert.ToChar(“|”));
}
}
public string Values
{
set
{
_Values = value.Split(Convert.ToChar(“|”));
}
}
public HtmlTemplateParserCS()
{
//Constructor
}
public string GetParsedHtmlFile()
{
StringBuilder FileContents = new StringBuilder();
FileContents = FileContents.Append(GetContentOfTemplateFile(TemplateFileName));
for (int TokenCounter = _Tokens.GetLowerBound(0); TokenCounter <=
_Tokens.GetUpperBound(0); TokenCounter++)
{
FileContents = FileContents.Replace(_Tokens[TokenCounter],
_Values[TokenCounter]);
}
return FileContents.ToString();
}
private string GetContentOfTemplateFile(string FileName)
{
StreamReader StreamReaderHtmlFile;
string ContentOfFile;
StreamReaderHtmlFile = File.OpenText(FileName);
ContentOfFile = StreamReaderHtmlFile.ReadToEnd();
StreamReaderHtmlFile.Close();
return ContentOfFile;
}
}
他们是如何创建,有什么用那?首先:HtmlTemplateParserCS类的属性(只读),这些属性对我的类来说是至关重要的。为了解析html文件,我需要一个TemplateFileName,符号(作为我模板文件中数据的占位符)数组,数据(呈现从数据储存器中获取的数据)数组。符号和值是由“|”分割的字符数组。注意,我在他们各自属性的set方法里通过Split方法(value变量的)分割数组。分割是必须的,因为我要移除“|”字符。
在方法GetParsedHtmlFile中,我创建了StringBuilder的实例FileContents ,它将附加函数GetContentOfTemplateFile的返回值。
方法GetContentOfTemplateFile 将文件名作为参数,并用StreamReader 读取提供的html模板的内容,然后以string类型返回模板的内容。
剩下的事就是用各自的值替换符号。为了实现这个目的,我重新遍历数组,通过用GetLowerBound 和GetUpperBound 方法探测边界。然后以string类型返回FileContents的内容。
利用解析发送Mail
问题是如何利用上面开发的解析器发送Mail?这是我接下来要描述的。从一个新的名为TemplateHtmlParser.aspx的开始。用户获取密码的接口以及触发的行为---发送要求的Mail---跟文章前面部分描述的一样,所以不再赘述。但是,我发现我必须创建一个新的名为ParsedHtmlEmailCS.cs的文件,它将从EmailDataCS(这个前面也有叙述)的实例中获取必需的数据。下面的代码展示了上面所说的内容
public class ParsedHtmlEmailCS
{
public ParsedHtmlEmailCS()
{
//Constructor
}
public void SendParsedTemplate(string emailAddress)
{
HtmlEmailCS.EmailDataCS Credentials = new HtmlEmailCS.EmailDataCS();
HtmlEmailCS.UserCredentialsCS UserData =
Credentials.GetUserCredentials(emailAddress);
if (UserData.ExistingCredentials > 0)
{
HtmlEmailCS.HtmlTemplateParserCS HtmlFile = new
HtmlEmailCS.HtmlTemplateParserCS();
HtmlFile.TemplateFileName =
HttpContext.Current.Server.MapPath(“Templates/HtmlTemplate.htm”);
HtmlFile.Tokens = “Token1|Token2”;
HtmlFile.Values = Convert.ToString(UserData.Username) + (“|”) +
Convert.ToString(UserData.Password);
MailMessage MessageMail = new MailMessage();
MessageMail.From = “info@domain.com”;
MessageMail.To = emailAddress;
MessageMail.Subject = “Your credentials”;
MessageMail.BodyFormat = MailFormat.Html;
string MailBody;
MailBody = Convert.ToString(HtmlFile.GetParsedHtmlFile());
MessageMail.Body = MailBody;
SmtpMail.SmtpServer = “mail-out.server.com”;
SmtpMail.Send(MessageMail);
}
else
{
throw new Exception(“Please specify a valid registered e-mail address”);
}
}
}
{
public ParsedHtmlEmailCS()
{
//Constructor
}
public void SendParsedTemplate(string emailAddress)
{
HtmlEmailCS.EmailDataCS Credentials = new HtmlEmailCS.EmailDataCS();
HtmlEmailCS.UserCredentialsCS UserData =
Credentials.GetUserCredentials(emailAddress);
if (UserData.ExistingCredentials > 0)
{
HtmlEmailCS.HtmlTemplateParserCS HtmlFile = new
HtmlEmailCS.HtmlTemplateParserCS();
HtmlFile.TemplateFileName =
HttpContext.Current.Server.MapPath(“Templates/HtmlTemplate.htm”);
HtmlFile.Tokens = “Token1|Token2”;
HtmlFile.Values = Convert.ToString(UserData.Username) + (“|”) +
Convert.ToString(UserData.Password);
MailMessage MessageMail = new MailMessage();
MessageMail.From = “info@domain.com”;
MessageMail.To = emailAddress;
MessageMail.Subject = “Your credentials”;
MessageMail.BodyFormat = MailFormat.Html;
string MailBody;
MailBody = Convert.ToString(HtmlFile.GetParsedHtmlFile());
MessageMail.Body = MailBody;
SmtpMail.SmtpServer = “mail-out.server.com”;
SmtpMail.Send(MessageMail);
}
else
{
throw new Exception(“Please specify a valid registered e-mail address”);
}
}
}