当前位置:编程学习 > C#/ASP.NET >>

分享:用C#写了一个新增用户就发送邮件和手机短信的SqlServer触发器(附源码) 欢迎大家批评指正

分享:用C#写了一个新增用户就发送邮件和手机短信的SqlServer触发器(附源码)

 欢迎大家批评指正

//针对SqlServer2005及已上版本
//CLR开发测试环境 VS2008 + Windows7
//SqlServer测试版本:SqlServer2005
//项目名:SendSMSTrigger
//编译后会产生2个类库:SendSMSTrigger.dll SendSMSTrigger.XmlSerializers.dll
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Server;
using System.Data.SqlClient;
using System.Text.RegularExpressions;
using System.Net.Mail;

public class SendSMSTrigger
{
    /// <summary>
    /// 发送邮件
    /// </summary>
    /// <param name="tomail">收件人邮件地址</param>
    /// <param name="title">标题</param>
    /// <param name="content">邮件正文</param>
    /// <param name="FormUser">发件人账号</param>
    /// <param name="userPwd">发件人密码</param>
    public static void sendEmail(string tomail, string title, string content, string FormUser, string userPwd)
    {
        MailAddress from = new MailAddress(FormUser + "@bwsyq.com");
        MailAddress to = new MailAddress(tomail);
        MailMessage MyMessage = new MailMessage(from, to);
        MyMessage.Priority = MailPriority.Normal;
        MyMessage.Priority = MailPriority.Normal;

        MyMessage.IsBodyHtml = false;
        MyMessage.IsBodyHtml = true;
        MyMessage.Body = content;
        MyMessage.BodyEncoding = System.Text.Encoding.UTF8;
        MyMessage.Subject = title;

        string SmtpServer = "mail.bwsyq.com";
        SmtpClient client = new SmtpClient(SmtpServer);
        System.Net.NetworkCredential cred = new System.Net.NetworkCredential(FormUser, userPwd);
        client.Credentials = cred;
        client.Send(MyMessage);

    }

    /// <summary>
    /// 发送手机短信
    /// </summary>
    /// <param name="mMobilNumber">手机号码</param>
    /// <param name="sMessageContent">短信内容</param>
    /// <returns></returns>
    public static string SendSMS(string mMobilNumber, string sMessageContent)
    {
        SmsInterfaceService SmsInterfaceDemo = new SmsInterfaceService();
        return SmsInterfaceDemo.clusterSend("短信接口用户名", "短信接口密码",
                "1360000000", mMobilNumber, sMessageContent, DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"), "0|0|0|0");
    }

    /// <summary>
    /// 针对表Users的新增CLR触发器
    /// </summary>
    [SqlTrigger(Name = @"SendSMSTrigger", Target = "[dbo].[Users]", Event = "FOR INSERT")]
    public static void SendSMS()
    {
        string userName;
        string realName;
        string eMail;
        string mobilNumber;
        SqlCommand command;
        SqlTriggerContext triggContext = SqlContext.TriggerContext;
        SqlPipe pipe = SqlContext.Pipe;
        SqlDataReader reader;

        switch (triggContext.TriggerAction)
        {
            case TriggerAction.Insert:
                // Retrieve the connection that the trigger is using
                using (SqlConnection connection
                   = new SqlConnection(@"context connection=true"))
                {
                    connection.Open();
                    command = new SqlCommand(@"SELECT * FROM INSERTED;",
                       connection);
                    reader = command.ExecuteReader();
                    reader.Read();
                    userName = (string)reader[0];
                    realName = (string)reader[1];
                    eMail = (string)reader[2];
                    mobilNumber = (string)reader[3];
                    reader.Close();

                    if (IsValidEMailAddress(eMail))
                    {
                        //发通知邮件
                        sendEmail(eMail, realName + "您好!恭喜注册成功!", " 您的用户名是:" + userName, "bwsyq@bwsyq.com", "发件人密码");
                        //发手机短信
                        SendSMS(mobilNumber, realName + "您好!恭喜注册成功! 您的用户名是:" + userName);
                        //SqlServer 管道返回信息
                        pipe.Send(realName + "您好!恭喜注册成功! 您的用户名是:" + userName);
                    }
                }
                break;
            default:
                break;
        }
    }

    /// <summary>
    /// 验证邮件是否合法
    /// </summary>
    /// <param name="email">邮件地址</param>
    /// <returns><c>true</c>表示邮件地址格式合法 <c>false</c>表示邮件地址格式不合法<</returns>
    public static bool IsValidEMailAddress(string email)
    {
        return Regex.IsMatch(email, @"^([\w-]+\.)*?[\w-]+@[\w-]+\.([\w-]+\.)*?[\w]+$");
    }
}

--SqlServer2005 中的挂接脚本、代码、相关说明
IF OBJECT_ID(N'Users') IS NOT NULL
drop table Users
go
CREATE TABLE Users                    --(测试用)用户表
(
    UserName nvarchar(200) NOT NULL,  --用户名
    RealName nvarchar(200) NOT NULL,  --真实姓名
    EMail nvarchar(200) NOT NULL,     --邮件地址
    MobilNumber varchar(20) not null  --手机号码
);
GO

--建立触发器程序集
CREATE ASSEMBLY [SendSMSTrigger.XmlSerializers.dll] from 'E:\SendSMSTrigger.XmlSerializers.dll'
WITH PERMISSION_SET = UNSAFE;
go
--建立序列化处理器程序集
CREATE ASSEMBLY SendSMSTrigger from 'E:\SendSMSTrigger.dll'
WITH PERMISSION_SET = UNSAFE;
go

--提升SqlServer支持版本
EXEC sp_dbcmptlevel N'DB_EMP2', 90
go
--开通CLR权限
EXEC sp_configure 'show advanced options' , '1';
GO
RECONFIGURE;
GO
EXEC sp_configure 'clr enabled' , '1'
GO
RECONFIGURE;
GO

IF OBJECT_ID(N'trig_SendSMSTrigger') IS NOT NULL
drop TRIGGER trig_SendSMSTrigger
go
--建立SqlServer触发器并 C#触发器关联
CREATE TRIGGER trig_SendSMSTrigger
ON Users
FOR INSERT
AS
EXTERNAL NAME SendSMSTrigger.SendSMSTrigger.SendSMS
go

--测试,模拟用户注册,成功后您将收到 注册成功通知邮件和手机短信通知
insert into Users (UserName,RealName,EMail,MobilNumber)
values('USer0001', '百万商业圈', 'bwsyq@bwsyq.com', '13818466XXX')
go

 

版权所有:百万商业圈
未经许可不得转载,有任何疑问请与我本人联系 QQ 99923309 Mail:bwsyq@bwsyq.com

开源:完全自主研发搜索引擎1.0源代码及说明,单机400万网页,任意50词以内的检索不超过 20毫秒
开源:基于百万商业圈.NET开发框架开发的并行带分词的采集器

天心天字辈ERP全部PDK源代码到了我手上的后果 - 超越天心之WEB天云
--------------------编程问答-------------------- 作者CSDN博客 --------------------编程问答-------------------- 支持开源~ --------------------编程问答-------------------- 专业顶精华贴~ --------------------编程问答-------------------- 确实很不错,值得借鉴 --------------------编程问答-------------------- 期待专家点评 --------------------编程问答-------------------- 小子知识面还挺广的啊 --------------------编程问答-------------------- 支持 顶顶~ --------------------编程问答-------------------- 如果有个demo测试一下就好了 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 支持开源! --------------------编程问答-------------------- 支持帮顶 --------------------编程问答-------------------- 楼主好人
感谢分享 --------------------编程问答-------------------- --------------------编程问答-------------------- 支持支持 --------------------编程问答-------------------- 留下脚印。 --------------------编程问答-------------------- 小子知识面还挺广的啊 --------------------编程问答-------------------- 留下脚印  --------------------编程问答-------------------- 楼主 发短信 用的哪家的接口? --------------------编程问答-------------------- mark.......... --------------------编程问答-------------------- ing。。。。。。。。。。。。。。。。。。。。。。。 --------------------编程问答-------------------- 支持 顶顶~ --------------------编程问答-------------------- 不错.分享 --------------------编程问答-------------------- 飘过,分享 --------------------编程问答-------------------- 支持,分享!!顶!! --------------------编程问答-------------------- 感谢原作者和LZ分享学习~!致敬~! --------------------编程问答-------------------- 我看不懂 但是感觉很强大,支持老大 --------------------编程问答-------------------- 学习了! --------------------编程问答-------------------- 谢谢分享! --------------------编程问答-------------------- 学习了! --------------------编程问答-------------------- 支持~~~ --------------------编程问答-------------------- sdafsda --------------------编程问答-------------------- 关注中...

开源精神可敬 --------------------编程问答-------------------- mark   mark --------------------编程问答-------------------- 支持一下 --------------------编程问答-------------------- 有用  顶下! --------------------编程问答-------------------- 这个要顶一下的 --------------------编程问答-------------------- 顶!!
分享 --------------------编程问答-------------------- 谢谢分享 --------------------编程问答-------------------- 顶一下楼主 --------------------编程问答-------------------- 请问了楼主,发送短信用到的接口,是。net自带的接口吗? --------------------编程问答-------------------- 短信用的是是移动公司提供的短信WebServices接口中的
WebServices地址是:http://ws.iems.net.cn/GeneralSMS/ws/SmsInterface?wsdl --------------------编程问答-------------------- mark 下 --------------------编程问答--------------------   return SmsInterfaceDemo.clusterSend("短信接口用户名", "短信接口密码",....这里的两个参数具体是神马?
  --------------------编程问答-------------------- 版主怎么不把广告给去掉呢。。。 --------------------编程问答-------------------- 楼主不错,以后估计能用着,MARK --------------------编程问答-------------------- mark --------------------编程问答-------------------- 支撑开源 --------------------编程问答-------------------- 还不错,支持
SQL版也看到了 --------------------编程问答-------------------- 支持共享! --------------------编程问答-------------------- 顶!!! --------------------编程问答-------------------- 很好很强大 --------------------编程问答-------------------- 这代码 维护一点都不方便 给我写 参数都是写成实体 分离出去 或者把参数写成配置文件~ --------------------编程问答-------------------- 发短信的接口,具体说下? --------------------编程问答-------------------- 短信接口要钱的 --------------------编程问答--------------------
引用 41 楼 suoyiminmin 的回复:
短信用的是是移动公司提供的短信WebServices接口中的
WebServices地址是:http://ws.iems.net.cn/GeneralSMS/ws/SmsInterface?wsdl

最近正准备做短信方面的 那开账户的话 在哪申请? --------------------编程问答--------------------
引用 41 楼 suoyiminmin 的回复:
短信用的是是移动公司提供的短信WebServices接口中的
WebServices地址是:http://ws.iems.net.cn/GeneralSMS/ws/SmsInterface?wsdl


最近正准备做短信方面,开账户的话在哪申请? --------------------编程问答-------------------- 不错。 --------------------编程问答-------------------- mark... --------------------编程问答-------------------- 支持开源! --------------------编程问答-------------------- 支持.顶. --------------------编程问答-------------------- 学习瞅瞅 --------------------编程问答--------------------   学习 ~~~~~~~~~ --------------------编程问答-------------------- 小弟有2个问题 请教:
1:这种业务情况有必要用触发器吗?好处是什么? 利大于弊在哪?
2:在此业务 应该用 FOR INSERT 还是  AFTER INSERT? --------------------编程问答-------------------- good good --------------------编程问答-------------------- very good ,, --------------------编程问答-------------------- 学习了~~ --------------------编程问答-------------------- 学习了!不过这短信接口收费情况怎么样的?
--------------------编程问答-------------------- 路过,蹭点分 --------------------编程问答-------------------- mark,收藏~~~~~ --------------------编程问答-------------------- 学习了 --------------------编程问答--------------------
引用 56 楼 forrest23 的回复:
引用 41 楼 suoyiminmin 的回复:

短信用的是是移动公司提供的短信WebServices接口中的
WebServices地址是:http://ws.iems.net.cn/GeneralSMS/ws/SmsInterface?wsdl


最近正准备做短信方面,开账户的话在哪申请?

最近正准备做短信方面,开账户的话在哪申请? --------------------编程问答-------------------- 没想明白,为什么要用触发器来发短信和邮件? --------------------编程问答-------------------- 很好,正需要 --------------------编程问答-------------------- 本人知识太浅  看不懂。。伤心 --------------------编程问答-------------------- mark,c#很久没接触了,不过上次写c#发邮件短信貌似出了不少问题,结果就扔在那了,下次研究下 --------------------编程问答-------------------- 代码写的不错,但是出发点就不对,这种业务根本不应该写成触发器,甚至根本不应该写在DB层面。一个认真考虑过可扩展性、可维护性的系统,应该严格限制在MSSQL上部署CLR程序集,更不要说是为了实现这么蛋疼的功能了…… --------------------编程问答-------------------- 路过帮顶  --------------------编程问答-------------------- ...路过 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 很好,很强大 --------------------编程问答-------------------- 学习。。 --------------------编程问答-------------------- mark,c#很久没接触了,不过上次写c#发邮件短信貌似出了不少问题,结果就扔在那了,下次研究下 --------------------编程问答-------------------- 飘过,顶 --------------------编程问答-------------------- 确实很不错,值得借鉴,多谢楼主开源 --------------------编程问答-------------------- 学习中 --------------------编程问答--------------------
引用 85 楼 bqing0629 的回复:
学习中

ING

--------------------编程问答-------------------- 标记一下 有空来仔细睽睽!!! --------------------编程问答-------------------- 请问用户名和密码在什么地方申请?? --------------------编程问答-------------------- 学习ING --------------------编程问答-------------------- 顶~~ --------------------编程问答-------------------- good --------------------编程问答-------------------- 先收藏一下,主要是短信那个触发器,邮件的知道弄~
补充:.NET技术 ,  非技术区
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,