使用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

转载于:https://www.cnblogs.com/Kenr/archive/2009/06/24/1510141.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm常用快捷键详解,让你编程 事半功倍。

pycharm常用快捷键1、编辑&#xff08;Editing&#xff09;Ctrl Space &#xff1a; 基本的代码完成&#xff08;类、方法、属性&#xff09; Ctrl Alt Space 快速导入任意类 Ctrl Shift Enter&#xff1a; 语句完成 Ctrl P 参数信息&#xff08;在方法中调用参…

[html] 对于写一个页面布局,html/css/js这三者你是先写哪个后写哪个?

[html] 对于写一个页面布局&#xff0c;html/css/js这三者你是先写哪个后写哪个&#xff1f; 快捷键创建模板htmlcss写出结构写js做交互个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣…

linux ftp配置chroot,vsftp chroot 设置

在vsftpd服务器的默认设置中&#xff0c;本地用户可以切换到主目录以外的目录进行浏览访问&#xff0c;这样对于服务器来说是不太安全的&#xff0c;因为任何用户可以随时浏览到别的用户的私有信息&#xff0c;下面介绍如何使用chroot选项来防止这种情况的发生。与该功能相关的…

nginx原配置

#原配置server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x…

[html] 你觉得写Html难吗?难在哪?为什么?

[html] 你觉得写Html难吗&#xff1f;难在哪&#xff1f;为什么&#xff1f; 合理应用h5新标签和新特性 而不只是divdiv个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面…

优麒麟在linux下安装教程,在优麒麟Ubuntu Kylin系统中安装百度网盘Linux版.deb的方法...

本文介绍在优麒麟Ubuntu Kylin操作系统中安装百度网盘Linux版.deb的方法&#xff0c;可用在优麒麟及 Ubuntu 19.04/18.04上&#xff0c;当前百度网盘Linux版的版本号是Linux V2.0.1&#xff0c;目前下载只提供rpm格式&#xff0c;可看百度网盘Linux版发布&#xff0c;支持中标麒…

js使用正则实现表单验证

## 定义javascript代码 定义方法 定义正则表达式 布局 转载于:https://www.cnblogs.com/wjy0928/p/10885992.html

WCF議程

WCF是下一代開發平台WinFX中三大利劍之一(WPF﹐WWF﹐WCF﹐簡要介紹之) WinFx現改名為.NET Framework 3.0,它包括.NET Frameword2.0, WPF,WWF,WCF等 WPF(Windows Presentation Foundation)是微软下一代的图形表现系统&#xff0c; 能够充分发挥个人电脑强大的图形运算能力&…

[html] HTML5的Server-Sent和WebSocket如何选择哪一个?

[html] HTML5的Server-Sent和WebSocket如何选择哪一个&#xff1f; 看具体的业务场景个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

自觉培养“舆商” 争做成功网商

近日&#xff0c;看到一位自称是网商故事讲述者的“上海伟雅”不久前在电脑报新创作时代主题研讨会上的精彩演讲。他讲述了自己写网商故事所经历的三个阶段&#xff0c;以及每个阶段的不同价值&#xff0c;并提出了“互联网不允许等待”等观点。笔者从中很受启迪&#xff0c;由…

吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:设定文本对齐,段落中超出屏幕部分文字自动换行...

<!DOCTYPE html> <html><head><title>菜鸟教程(runoob.com)</title> <meta name"viewport" content"widthdevice-width, initial-scale1" charset"utf-8"><link rel"stylesheet" href"ht…

linux 一行代码,一行代码终结你的Linux~

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼分类&#xff1a;代码::() { :|:& }; :为什么这个东西会让你的系统死掉&#xff1f;&#xff1f;&#xff1f;有人执行了然后问我让我们来分析一下这段代码&#xff0c;我改一下格式&#xff0c;但内容是一样的 代码::() # 定义…

[html] HTML5的Server-Sent和WebSocket有什么区别?

[html] HTML5的Server-Sent和WebSocket有什么区别&#xff1f; websocket是双向通信&#xff0c;server-sent只能服务端发送消息个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通…

socket c/s分佈式編程

SOCKET&#xff1a; Socket接口介于应用程序与硬件之间。对Socket的理解可以简化为&#xff1a;它是封装了数据流&#xff08;Stream&#xff09;的从机器到机器的一条软接线&#xff0c;通过这条软接线&#xff0c;并借助于线两端的收发程序&#xff0c;网络上的机器间实现了信…

linux获取笔记本摄像头视频,如何在windows下用ffmpeg抓取笔记本电脑摄像头视频

我有一个很小的python程序&#xff0c;它可以很好地使用ffmpeg的子进程从linux中的网络摄像头(至少对于有内置网络摄像头的笔记本电脑)捕获短视频。在现在我正试图编写同样的程序来捕捉windows中的网络摄像头&#xff0c;我知道我不能使用通用的“/dev/video0”&#xff0c;它在…

GDAL读取Shp问题解决:Unable to open EPSG support file gcs.csv

在GIS软件的开发中&#xff0c;经常用到开源库GDAL读取Shp数据&#xff0c;当shp数据中包含投影信息时&#xff0c;可能会遇到“Unable to open EPSG support file gcs.csv”错误提示&#xff0c;该错误是由于没有设置“GDAL_DATA”引起的。 1.Shpefile文件组成 Shapefile文件指…

[html] HTML5的Geolocation不允许定位后如何于次让它弹起授权定位?

[html] HTML5的Geolocation不允许定位后如何于次让它弹起授权定位&#xff1f; JS应该不能通过API主动再次调起授权定位。 需要提示用户&#xff0c;需要用户手动清除浏览器缓存或者设置app开启浏览器定位功能&#xff0c;之后才能重新弹出。个人简介 我是歌谣&#xff0c;欢…

SAP FI模块与SD、MM的接口配置基本方法

SAP FI模块与SD、MM的接口配置基本方法及解答.问&#xff1a;能否介绍一下FI模块与SD、MM的接口配置基本方法&#xff1f;答&#xff1a;accounting determination autoposting&#xff0c;做FICO的对这两个接口帐号的配置都会感兴趣的啊&#xff5e; 不过这些东东要讲起来&…

禁用linux系统日志,KB4532432-如果在 Linux 系统上禁用了 IPV6,则会议将失败

症状假设你尝试在 Linux 操作系统(如 Redhat 或 Ubuntu)上安装 Microsoft SQL Server 2019。 如果在操作系统内核级别禁用 IPv6&#xff0c;并且尝试使用 "sudo/opt/mssql/bin/mssql-conf setup" 命令配置 SQL Server&#xff0c;则会在 Linux 控制台和 SQL Server 错…

[html] 如何更改浏览器左上角标题旁的图标?

[html] 如何更改浏览器左上角标题旁的图标&#xff1f; 图标在html的head进行引入,如 <link rel"shortcut icon" href"/favicon.ico" type"image/x-icon">个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#…