使用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或删除相关代码。)

/Files/Kenr/MailSender.rar

posted on 2009-06-24 13:33  阿米巴原虫  阅读(1171)  评论(0编辑  收藏  举报