使用XSLT制作HTML邮件模板并发送
之前有写过能发送邮件的小工具,基本做法就是先在代码中写死一封HTML邮件的格式,然后用适当的方法取得外部的几个值填到预设的参数里,最后把合体后的string类型邮件发出去。简单的邮件还好,当内容稍微多一点,比如输出数据库的一个表,又或者邮件格式经常要变动的,就感觉很麻烦很受拘束。
后来看到了别人用XSLT做的一个邮件模板,很受启发。自己也尝试了一下,就有了这篇文章。
下面这个方法是从数据库里搜索符合条件的数据(列出由指定用户管理并且已经超过有效期限的文档,以XML形式导出),然后使用指定的xslt文件格式化取得的XML格式数据。
/// <summary>
/// 生成邮件内容
/// </summary>
/// <param name="date">预定删除日期</param>
/// <param name="account">管理者ID</param>
private string GetSendMailBoby(DateTime date, string account)
{
using (conn = new SqlConnection(
ConfigurationManager.ConnectionStrings["mainDB"].ConnectionString))
{
conn.Open();
string bodyString = string.Empty;
string commString = string.Empty;
commString += "SELECT item_name,item_url,parent_url FROM DocAddress ";
commString += "WHERE manger_id=@account AND due_date<=@executedate AND ";
commString += "send_flg = 0 FOR XML AUTO, ELEMENTS,ROOT('SendmailToUser')";
SqlCommand command = new SqlCommand(commString, conn);
command.Parameters.AddWithValue("@account", account);
command.Parameters.AddWithValue("@executedate", date);
using (XmlReader reader = command.ExecuteXmlReader())
{
XslCompiledTransform transform = new System.Xml.Xsl.XslCompiledTransform();
transform.Load(
Application.StartupPath + @""" + ConfigurationManager.AppSettings["Mail.Template"]
);
XsltArgumentList argList = new XsltArgumentList();
argList.AddParam("deleteday", "", date.AddDays(14).ToLongDateString());
using (StringWriter writer = new StringWriter())
{
transform.Transform(reader, argList, writer);
bodyString = writer.ToString();
}
}
conn.Close();
return bodyString;
}
}
相应的XSLT文件。
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:param name="deleteday"/>
<xsl:template match="DocAddress">
<tr>
<td width="250">
<xsl:element name="A">
<xsl:attribute name="href">
<xsl:value-of select="item_url"/>
</xsl:attribute>
<xsl:value-of select="item_name"/>
</xsl:element>
</td>
<td>
<xsl:element name="A">
<xsl:attribute name="href">
<xsl:value-of select="parent_url"/>
</xsl:attribute>
打开保存地址
</xsl:element>
</td>
</tr>
</xsl:template>
<xsl:template match="/">
<html>
<head>
<title>过期文章删除通知</title>
</head>
<body>
您所管理的下列邮件将在<xsl:value-of select="$deleteday"/>予以删除。
<br/><br/>
<table bordercolor="#000000" border="1" cellspacing="0" >
<tr>
<td width="250" style="font-weight: bold; background-color: silver">
<center>文件名</center>
</td>
<td style="font-weight: bold; background-color: silver">
<center>存储地址</center>
</td>
</tr>
<xsl:apply-templates select="/SendmailToUser/DocAddress" />
</table>
<br/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
具体的xslt语法,参考下列网址
http://www.w3school.com.cn/xsl/index.asp
附上完整代码。(相关数据库表的建立参考压缩包内[~TableCreate.txt]文件。此外,因为涉及到调用MOSS2007的服务器端设定,必须引用Microsoft.SharePoint.dll,请自行添加DLL或删除相关代码。)