Winform开发框架之通用短信邮件通知模块

在做Winform项目的时候,一直有一个梦想,就是希望把所有的组件模块组合即可组装成一个完整的项目系统(或者至少可以大部分完成)。在之前介绍的《Winform开发框架之通用附件管理模块》里面介绍了我的Winform开发框架的版图,里面包含了我对Winform模块化的一系列规划的组件,组件尽可能是适用于大多数的业务环境组合,以达到最大程度的重用和高效开发。

Winform开发框架是我集多年开发经验以及积累而成,很多细节之处润物细无声,但却是精粹心得所至,很多地方都希望是精益求精,力求把框架中的模块当成一把把神兵利器,用到的时候,马上就可以派生用场解决问题,这样可以避免给客户开发业务的时候,延误战机,或者因为事无巨细,都要从头来过,效率大打折扣,而且时间和金钱的大投入也未见得取得好的效果。

上两篇介绍了WInform框架中的通用定时服务管理模块,《Winform开发框架之通用定时服务管理》、《Winform开发框架之通用定时服务管理2---如何开发定时服务应用》,主要介绍主要在常规数据同步的时候,如何快速利用定时服务管理的通用模块,加上插件化的一些同步业务实现模块,实现强大、高效、松耦合的定时服务管理。本篇继续介绍Winform开发框架中的版图部分,通用短信邮件通知模块

开发这个模块的初衷是我在开发过的很多项目中,发现或多或少,都有短信通知、邮件通知、站内通知信息的需求,短信和邮件用的很多,也是大多数业务系统重复建设的模块之一,如单位办理业务要通知申请人,公司和客户沟通交流,公司内部员工沟通,这些可能是通过短信、邮件或者站内信息(或叫系统内部的通知信息)。如果这些模块能够快速搭建的话,对项目组来说,节省的时间,提高的是效率。对单位企业来说,这是高质量代码的保证,重复利用更可也减少重复的人力投资和成本支出。

1、模块设计

首先我们知道,短信、邮件、站内信息这几个业务的发送信息的时候,我们都希望记录相关的发送例子,其中短信实现发送的机制比较多,可能通过自己企业内部的短信MAS代理机来发送,也可能是通过购买的外部的WebService服务发送,因此通过插件模块的机制,实现短信发送逻辑的动态加载;邮件发送则利用.NET的邮件发送API,加上企业或者个人邮件发送参数即可实现,也是通过插件方式实现发送逻辑的动态加载;站内信息主要就是数据库记录,然后定时检测是否有记录即可,相对比较简单。

短信、邮件、站内信息的数据库设计,如下图所示,他们三者之间共用一个模板表,通过不同的TemplateType来识别不同的信息模板,这样信息模板表可以为短信、邮件、站内信息做更好的引用。

这里我们可以看到,我主要就是设计几个表来存储他们的发送记录,对于具体的短信发送,邮件发送,我们采用插件方式实现具体发送逻辑的封装,如下所示。

 

其中邮件发送接口和短信发送接口定义如下,方便实现基于插件方式的发送逻辑模块。

    public interface IMailSend
    {
        /// <summary>
        /// 发送外部邮件(自定义邮件配置,如个人邮件)
        /// </summary>
        /// <param name="mailInfo">发送邮件信息</param>
        /// <param name="settingInfo">SMTP协议设置信息</param>
        /// <returns></returns>
        CommonResult Send(MailInfo mailInfo, SmtpSettingInfo settingInfo);

        /// <summary>
        /// 发送外部邮件(系统配置,系统邮件)
        /// </summary>
        /// <param name="mailInfo">发送邮件信息</param>
        /// <returns></returns>
        CommonResult Send(MailInfo mailInfo);
    }

    public interface ISmsSend
    {
        /// <summary>
        /// 发送短信
        /// </summary>
        /// <param name="content">短信内容</param>
        /// <param name="mobiles">手机号码(多个号码用”,”分隔)</param>
        /// <param name="sendTime">预约发送时间</param>
        /// <returns></returns>
        CommonResult Send(string content, string mobiles, DateTime? sendTime);
    }

2、软件使用界面

1)短信界面功能

具体的模块界面如下,输入信息发送后成功的界面如下所示。

 发送信息后,手机收到的结果如下所示。

短信还可以使用带有通讯录的发送界面,以及模板功能等方便性功能操作,如下所示。

通讯录可以通过调用窗体函数进行数据绑定,这样在调用的时候,只需要按照要求填写相应的数据就可以显示个人专属的通讯录了,方便勾选手机进行发送短信,操作绑定代码如下所示。

        private void btnSendWithList_Click(object sender, EventArgs e)
        {
            FrmSendSMSWithList dlg = new FrmSendSMSWithList();
            Dictionary<string, List<ContactInfo>> dict = new Dictionary<string,List<ContactInfo>>();
            List<ContactInfo> list = new List<ContactInfo>();
            string category = "个人通讯录";
            list.Add(new ContactInfo(category, "001", "伍华聪", "18620292076", "wuhuacong@163.com"));
            list.Add(new ContactInfo(category, "002", "张三", "18620292077"));
            list.Add(new ContactInfo(category, "003", "李四", "18620292078"));
            dict.Add(category, list);

            dlg.BindTreeData(dict);
            dlg.ShowDialog();
        }

2)邮件发送界面

可以把邮件保存为模板,方便第二次引用,也可以从模板中选取已有的邮件内容进行发送,邮件模板界面如下所示。

邮件发送成功后,会在邮件发送历史中留下发送的内容记录,如下界面所示。

邮件发送成功的同时,我们可以看到腾讯的QQ邮件提示信息,如下所示。

进一步查看邮件的信息,可以看到邮件里面的内容如下所示,由于采用了RichEditControl控件编辑数据,因此嵌入到编辑器里面的图片(本地插入或者动态截图),都可以进行正常发送,利用这个特点,可以编辑图文并茂的邮件信息,而且RichEditControl控件支持直接从Word文档中直接加载等功能,该控件的使用,我会另外开一篇随笔进行介绍。

另外,和短信发送一样,也可以通过动态绑定用户的通讯录,然后发送的时候,选定即可,如下所示。

3)站内信息使用界面

站内信息,可以用于系统内部用户的信息交流,业务信息通知等用途,用户登录系统后,就可以看到系统内部用户发给自己的通知信息。

这个功能没有调用其他外部的插件模块进行处理,直接就是把数据存储到数据库,然后对方定时获取到通知后进行提示或者查看,界面如下所示。

3、通用短信邮件通知模块控件的调用

通用短信邮件通知模块已经对这几类业务进行较好的封装了,包括Winform界面部分的处理,也已经进行了较好的设计和封装,因此和我的权限管理模块、字典管理模块一样,非常方便使用的。

下面为了介绍具体三个模块的使用,我使用了一个测试界面作为演示,如下所示。

各个按钮的实现代码如下所示,从中我们可以看到具体的模块调用了。

        /// <summary>
        /// 短信发送模块调用
        /// </summary>
        private void btnSendSMS_Click(object sender, EventArgs e)
        {
            FrmSendSMS dlg = new FrmSendSMS();
            dlg.ShowDialog();
        }

        /// <summary>
        /// 带通讯录的短信发送模块调用
        /// </summary>
        private void btnSendWithList_Click(object sender, EventArgs e)
        {
            FrmSendSMSWithList dlg = new FrmSendSMSWithList();
            Dictionary<string, List<ContactInfo>> dict = new Dictionary<string,List<ContactInfo>>();
            List<ContactInfo> list = new List<ContactInfo>();
            string category = "个人通讯录";
            list.Add(new ContactInfo(category, "001", "伍华聪", "18620292076", "wuhuacong@163.com"));
            list.Add(new ContactInfo(category, "002", "张三", "18620292077"));
            list.Add(new ContactInfo(category, "003", "李四", "18620292078"));
            dict.Add(category, list);

            dlg.BindTreeData(dict);
            dlg.ShowDialog();
        }

        /// <summary>
        /// 短信发送历史
        /// </summary>
        private void btnSMSHistory_Click(object sender, EventArgs e)
        {
            FrmSMSHistory dlg = new FrmSMSHistory();
            dlg.ShowDialog();
        }

        /// <summary>
        /// 邮件发送模块调用
        /// </summary>
        private void btnSendMail_Click(object sender, EventArgs e)
        {
            FrmSendMail dlg = new FrmSendMail();
            dlg.Owner = this;//记录用来隐藏
            dlg.Show();
        }

        /// <summary>
        /// 带通讯录的邮件发送模块调用
        /// </summary>
        private void btnSendEmailWithList_Click(object sender, EventArgs e)
        {
            FrmSendMailWithList dlg = new FrmSendMailWithList();
            Dictionary<string, List<ContactInfo>> dict = new Dictionary<string, List<ContactInfo>>();
            List<ContactInfo> list = new List<ContactInfo>();
            string category = "个人通讯录";
            list.Add(new ContactInfo(category, "001", "伍华聪", "18620292076", "wuhuacong@163.com"));
            list.Add(new ContactInfo(category, "002", "张三", "18620292077", "wuhuacong@hotmail.com"));
            list.Add(new ContactInfo(category, "003", "李四", "18620292078", "6966254@qq.com"));
            dict.Add(category, list);

            dlg.BindTreeData(dict);
            dlg.ShowDialog();
        }      

        /// <summary>
        /// 邮件发送历史
        /// </summary>
        private void btnMailHistory_Click(object sender, EventArgs e)
        {
            FrmMailHistory dlg = new FrmMailHistory();
            dlg.ShowDialog();
        }

        /// <summary>
        /// 站内信息发送模块调用
        /// </summary>
        private void btnSendBroad_Click(object sender, EventArgs e)
        {
            FrmSendBroad dlg = new FrmSendBroad();
            dlg.ShowDialog();
        }

        /// <summary>
        /// 站内信息发送历史
        /// </summary>
        private void btnBroadHistory_Click(object sender, EventArgs e)
        {
            FrmBroadHistory dlg = new FrmBroadHistory();
            dlg.ShowDialog();
        }

4、短信邮件插件化开发及设置

我们从上图可以看到,里面对于邮件和短信,都定义了接口,用于具体模块的实现,自己可以实现这些接口,然后配置好exe.config里面的参数,就可以被调用了。

下面是我为短信和邮件接口开发了几个实现类,其中MyMailSend是发送邮件的实现类,其他几个是基于各种MAS短信接口和WebService接口的短信发送实现。

开发好后,在配置项里面设置一下插件的相关参数即可,如下所示的内容。

本文转自博客园伍华聪的博客,原文链接:Winform开发框架之通用短信邮件通知模块,如需转载请自行联系原博主。

时间: 2024-09-15 07:56:34

Winform开发框架之通用短信邮件通知模块的相关文章

Winform开发框架之通用人员信息管理

我在随笔<Winform开发框架之通用短信邮件通知模块>和<Winform开发框架之通用附件管理模块>等多篇文章中都有介绍我总体的一个Winform开发框架的规划,其实就是开发一个集成度高的Winform开发框架,然后尽可能开发一些日常项目用到的模块,我称之为通用模块(可重复利用,或稍微调整可以适应项目需求),这样就形成了一个良好的生态体系,能够极快提高开发效率,同时也能规范化项目产品的开发工作,松耦合的集成能提供更高层的整合和利用.本文主要介绍我的Winform开发框架体系里面的

Winform开发框架之通用定时服务管理2---如何开发定时服务应用

在上篇随笔<Winform开发框架之通用定时服务管理>介绍了我的框架体系中,通用定时服务管理模块的设计以及一些相关功能的展示.我们在做项目的时候,或多或少需要和其他外部系统或者接口进行数据交互,有些是单向的获取,有些是双向的操作.这个定时操作(可能是间隔的时间,也可以能是定在某一个时刻,也可以能是让它在某天某时刻运行),那么这就需要定时服务程序来管理了,通常我们把他寄宿在Windows服务里面(这也是一种最佳的方式),这种方式最好的地方,就是它的生命周期可以随着电脑的启动而启动,而且很少需要用

Winform开发框架之通用自动更新模块

在网络化的环境中,特别是基于互联网发布的Winform程序,程序的自动更新功能是比较重要的操作,这样可以避免挨个给使用者打电话.发信息通知或者发送软件等,要求其对应用程序进行升级.实现程序的自动更新,在后期发布维护过程中,一个可以快速相应修正相关的Bug或者增加功能,二个可以避免给使用客户隔三差五的发送修改好的程序,省心省力.本文也是基于这个思想,在Winform开发框架中再引入一个自动升级更新的通用模块,这个自动升级的通用模块除了具备一般的功能外,可以通过配置程序标题.升级路径方式等方式,实现

Winform开发框架之通用数据导入导出操作的事务性操作完善

1.通用数据导入导出操作模块回顾 在我的Winfrom开发框架里面,有一个通用的导入模块,它在默默处理这把规范的Excel数据导入到不 同的对象表里面,一直用它来快速完成数据导入的工作.很早在随笔<Winform开发框架之通用数据导入 导出操作>里面就很全面的介绍过它的相关功能了,在代码生成工具Database2Sharp里面,生成的 Winfrom界面代码也已经把它的调用代码放进去了,因此使用起来真是很好,很开心. 在不断的项目实践中,发现使用基于Sqlite的客户端作为单机版的操作也越来越

“环信请程序猿免费看魔兽”的活动中奖短信邮件已发,请查收

问题描述 "环信请程序猿免费看魔兽"的活动中奖短信邮件已发,请查收. 第一步:确认领取电影票,让我们知道你会来,确认地址见短信和邮件 解决方案 深圳排前10,没收到任何短信通知,无法领取电影票,怎么解释?解决方案二: 解决方案三:没一个人在吗??解决方案四:由于高考的原因,短信通道有可能会延时,请注意查收.解决方案五:已圆满解决并拿到电影票,谢谢大总管

Winform开发框架之通用高级查询模块

最近一直忙于公司的事情,虽然一直在做一些相关的技术研究,但是很久没能静下心来好好写写博客文章了,想想也有半个月之多了,这半个月来,也一直致力于改善我的WInform开发框架,使得自己及客户使用起来更加方便,更加友好,更加高效.本篇文章就是介绍最近框架改善的其中一个闪光点"通用高级查询模块",高级查询模块,在很多程序模块中都很常见,也是给客户扩展查询的一个很好的补充,由于我一直希望我的Winform开发框架能够精益求精,所以做了这个模块,希望对今后我自己所有的项目以及框架本身,都能高效的

Winform开发框架之通用定时服务管理

做项目的时候,或多或少需要和其他外部系统或者接口进行数据交互,有些是单向的获取,有些可能是修改状态后再写回去,不管如何,这个都可以称之为数据同步操作,如人员信息同步.业务数据同步.第三方接口数据同步等等. 数据同步涉及到一个同步时间的问题,一般不敏感的数据,一天或者一周左右同步一次就可以了,有些可能需要间隔更短一点. 同步的逻辑不同,有些可能写数据库就可以了,有些可能需要访问WebService或者其他接口,然后在进行数据获取,保存等操作,回写的时候,也一般是调用WebService这样的接口修

Winform开发框架之通用数据导入导出操作

做了很多Winform的项目,对于数据导入,一直也有自己的理解,由于一般的业务系统,经常性的数据导入时很正常的业务需求,因为毕竟使用Excel来操作数据也很方便,或者由于系统之间的数据交换需要,我们需要提供一个入口给客户导入所需要的数据.但是导入数据的时候,不同的业务数据对应不同的Excel文件,很难做到统一,但如果是每个业务模型,都创建一个不同的导入界面来操作Excel数据,又会觉得可能某种程度上重复劳动,增加开发及维护成本. 那么有无一种介于两者之间的方法,来实现效率的最优化,并且能够统一利

Winform开发框架之通用附件管理模块

在做Winform项目的时候,一直有一个梦想,就是希望把所有的组件模块组合即可组装成一个完整的项目系统(或者至少可以大部分完成).这即使是梦想,我也一直为之奋斗,每前进一步,我们离梦想就靠近一步.因此,本着这个梦想,我一路走来,开发整理了一系列的组件模块,包括底层的公用类库.Winform分页控件.通用的适应多数据库的查询组件,以及相对高层次一点的组件模块:通用权限管理系统.通用字典管理模块.通用程序自动更新模块.以及本篇随笔介绍的通用附件管理模块,当然还会有更多的组件模块会吸引我继续朝着梦想前