我想编写一个自动发送邮件的程序,听说可以用SQL存储过程来实现,请问高手具体怎样做?就是我已经把邮箱地址和时间存到表(user_msg)里了,怎样自动检测时间然后发送???

解决方案 »

  1.   

    怎样配置SQL   Server发送电子邮件   
        
      朱二(2004.9   转载请注明作者)   
        
        
      通常大家都知道:SQL   Server与Microsoft   Exchange   Server集成性很好,关于这方面的配置,在SQL   Server的联机帮助里有详细的说明,在此不再赘述。然而我们更关心的问题是:在没有Exchange   Server的情况下,如何配置SQL   Server利用Internet   邮件服务器发送邮件?   
      笔者曾为这问题伤透了脑筋,搜遍了互联网上的相关资料,发现仅有的几篇资料中有的是一笔带过,有的虽然介绍了操作步骤,可按照步骤一步一步操作下来,结果总是失败。为此笔者反复实验,终于找到一种简单有效的方法,不敢独自享受,下面是详细的配置步骤,如果您在操作的过程中碰到什么问题,请留言。     
        
      测试环境:   
        
      1   Windows   2000   Server   
      2   SQL   Server   2000+SP3   
      3   Microsoft   Outlook   (Office   2000)   
        
      准备一个Internet邮件帐户:   
      测试电子邮件帐户:[email protected]   
      Smtp服务器   smtp.163.com   
      pop3服务器   pop.163.com   
        
      步骤一:   更改电子邮件配置   
        
      1   打开Microsoft   Outlook   单击“工具”菜单中的“选项”,然后单击“邮件服务”选项卡。   
      2   单击“重新配置邮件支持”。   
      3   选择“用于企业或工作组”选项   
      4   重新启动Microsoft   Outlook   
        
      步骤二:   添加配置文件   
        
      1   单击“工具”菜单中的“服务”,然后单击“添加”按钮。   
      2   选择"Internet   电子邮件",单击“确定”。   
      3   下面的步骤是设置电子邮件帐号,请参考Microsoft   Outlook帮助文件,这里不再赘述。   
      4   利用配置好的电子邮件帐号收发邮件,确认配置成功。   
        
      步骤三:   配置MSSQLSERVER服务采用邮件配置文件   
        
      1   重新启动MSSQLSERVER服务(必须的,否则MSSQLSERVER服务检测不到上一步骤添加的配置文件)   
      2   打开企业管理器->展开服务器->支持服务->右击"邮件"->点击下拉框,你会发现   
      "Microsoft   Outlook   Internet   Settings"选项,点击"测试".如果弹出表示成功的对话框,那恭喜你,已经   大功告成了.   
        
      步骤四:享受你的劳动成果   
        
      1   打开SQL   Server的查询分析器   
        
      2   输入下列SQL语句,执行   
      exec   master..xp_sendmail   '[email protected]','Hello,World!'   
        
      3   好了,去你的邮箱收邮件去吧!     
      

  2.   

    参考:SQL Server怎样配置发送电子邮件
    ZDNet 软件频道 更新时间:2007-11-26 作者:21tx 来源:21tx
    本文关键词:电子邮件 配置 数据库 SQL Server 
    通常大家都知道:SQL Server与Microsoft Exchange Server集成性很好,关于这方面的配置,在SQL Server的联机帮助里有详细的说明,在此不再赘述。然而我们更关心的问题是:在没有Exchange Server的情况下,如何配置SQL Server利用Internet 邮件服务器发送邮件? 
        笔者曾为这问题伤透了脑筋,搜遍了互联网上的相关资料,发现仅有的几篇资料中有的是一笔带过,有的虽然介绍了操作步骤,可按照步骤一步一步操作下来,结果总是失败。为此笔者反复实验,终于找到一种简单有效的方法,不敢独自享受,下面是详细的配置步骤,如果您在操作的过程中碰到什么问题,请留言。 
        测试环境:
        1 Windows 2000 Server
        2 SQL Server 2000+SP3
        3 Microsoft OutLook (Office 2000)
        准备一个Internet邮件帐户:
        测试电子邮件帐户:[email protected]
        Smtp服务器 smtp.163.com
        pop3服务器 pop.163.com
        步骤一: 更改电子邮件配置
        1 打开Microsoft OutLook 单击“工具”菜单中的“选项”,然后单击“邮件服务”选项卡。
        2 单击“重新配置邮件支持”。
        3 选择“用于企业或工作组”选项
        4 重新启动Microsoft OutLook
        步骤二: 添加配置文件
        1 单击“工具”菜单中的“服务”,然后单击“添加”按钮。
        2 选择"Internet 电子邮件",单击“确定”。
        3 下面的步骤是设置电子邮件帐号,请参考Microsoft Outlook帮助文件,这里不再赘述。
        4 利用配置好的电子邮件帐号收发邮件,确认配置成功。
        步骤三: 配置MSSQLSERVER服务采用邮件配置文件
        1 重新启动MSSQLSERVER服务(必须的,否则MSSQLSERVER服务检测不到上一步骤添加的配置文件)
        2 打开企业管理器->展开服务器->支持服务->右击"邮件"->点击下拉框,你会发现
        "Microsoft Outlook Internet Settings"选项,点击"测试"。如果弹出表示成功的对话框,那恭喜你,已经 大功告成了。
        步骤四:享受你的劳动成果
        1 打开SQL Server的查询分析器
        2 输入下列SQL语句,执行
        exec master..xp_sendmail '[email protected]','Hello,World!'
        3 好了,去你的邮箱收邮件去吧! 
        注意事项:以上的配置过程要求以MSSQLSERVER服务采用的Windows帐号登录Windows 2000 Server,即你登录计算机所采用的帐号要和MSSQLSERVER服务采用的Windows帐号相同。
      

  3.   


    -- 存储过程每隔 30 秒钟运行一次。
    create procedure usp_daemon_mail
    as
     set nocount on
     while 1=1
     begin
     -- 扫描 user_msg 表中的记录,取出满足时间条件的用户邮箱。
     -- 使用 xp_sendmail 存储过程向此邮箱发送邮件。
     waitfor delay '00:00:30'
     end
    go-- 将 sql server 实例设置为“在实例启动时扫描可自动执行的存储过程”
    sp_configure 'show advanced options',1
    reconfigure
    sp_configure 'scan for startup procs',1
    reconfigure
    sp_configure 'show advanced options',0
    reconfigure-- 将存储过程设置为“实例启动时自动执行”
    sp_procoption 'usp_daemon_mail','startup','true'
      

  4.   

    2005或以上版本,使用Database Mail比较简单.
      

  5.   


    XP_SENDMAIL存储过程在哪里???如果要自己写一个SENDEMAIL的存储过程又怎样写?谢谢
      

  6.   


    具体怎样???我用的就是SQL SERVER2005的
      

  7.   

    http://www.cnblogs.com/beyondjay/archive/2009/03/18/1415082.html配置好之后..发送就是使用sp_send_dbmail来发送.
      

  8.   

    SQL2005的SQLMAIL配置不难啊.你先用126的邮箱配置好一个测试邮箱,然后自己写存储过程和定制作业定时发送邮件.
      

  9.   

    什么错误?应该是你配置上的问题,还有就是要开启SQL Mail选项.
      

  10.   

    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GO
    ALTER     PROCEDURE UP_SendMail(
                                                    @From           VARCHAR(100) 
                                                   ,@To             VARCHAR(100) 
                                                   ,@Subject        VARCHAR(100)=''
                                                   ,@Body           VARCHAR(4000) =''
                                                   ,@Server         VARCHAR(50)
                                                   ,@LogName        VARCHAR(50)
                                                   ,@PassWord       VARCHAR(50)
                                 )
    AS
    /****************************************************************************************
    **  Stored Procedure Documentation
    **  Stored Procedure Name:  UP_SendMail
    **  Creation Date:  May. 21, 2009
    **  Author:     Shiyt
    **  Program ID:     UP_SendMail
    **  Purpose: Get status-occurrence time list 
    **  Input Parameters: 
    **  Output Parameters: 
    **  Return Status Values:
    **  Usage:
    **  
    **  
    **  
    **  Local Variables:
    **  Called By:
    **  Calls:
    **  Data Modifications:
    **  Updates:
    ******************************************************************************************/
    BEGINDECLARE @iMsg int
    DECLARE @hr int
    DECLARE @source varchar(255)
    DECLARE @description varchar(500)
    DECLARE @output varchar(1000)
    --SELECT @Subject=@@ServerName + ' : ' + @Subject
    --SELECT @Body= @Body + ' - - - Message from : ' + @@ServernameEXEC @hr = sp_OACreate 'CDO.Message', @iMsg OUTput
    EXEC @hr = sp_OASetProperty @iMsg, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value','2'
    EXEC @hr = sp_OASetProperty @iMsg, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value', @Server
    EXEC @hr = sp_OASetProperty @iMsg,'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value','1'     
    EXEC @hr = sp_OASetProperty @iMsg,'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusername").Value',@LogName
    EXEC @hr = sp_OASetProperty @iMsg,'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value',@PassWord
    EXEC @hr = sp_OAMethod @iMsg, 'Configuration.Fields.Update', null
    EXEC @hr = sp_OASetProperty @iMsg, 'To', @To
    EXEC @hr = sp_OASetProperty @iMsg, 'From', @From
    EXEC @hr = sp_OASetProperty @iMsg, 'Subject', @Subject--EXEC @hr = sp_OAMethod @iMsg, 'AddAttachment', NULL,'d:\route\route\G.TXT'EXEC @hr = sp_OASetProperty @iMsg, 'TextBody', @Body
    EXEC @hr = sp_OAMethod @iMsg, 'Send', NULL
    IF @hr <>0
    SELECT @hr
        BEGIN
            EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
            IF @hr = 0
                BEGIN
                    SELECT @output = ' Source: ' + @source
                    PRINT @output
                    SELECT @output = ' Description: ' + @description
                    PRINT @output
                END
            ELSE
                BEGIN
                    PRINT ' sp_OAGetErrorInfo failed.'
                    RETURN
                END
        ENDEXEC @hr = sp_OADestroy @iMsgENDGO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO 这个是我写的,给你擦考一下,调用CDOSYS
      

  11.   

    执行时出错:消息 208,级别 16,状态 6,过程 UP_SendMail,第 84 行
    对象名  'UP_SendMail' 无效。
    还有,请问如何使用???不好意思,本人对存储过程很陌生
      

  12.   

    参考以前回贴。
    http://topic.csdn.net/u/20071228/09/3e12c4f0-5a8f-491f-a965-1221deb19333.html
      

  13.   


    先建立存储过程,执行:
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GO
    CREATE PROCEDURE UP_SendMail(
                                                    @From           VARCHAR(100) 
                                                   ,@To             VARCHAR(100) 
                                                   ,@Subject        VARCHAR(100)=''
                                                   ,@Body           VARCHAR(4000) =''
                                                   ,@Server         VARCHAR(50)
                                                   ,@LogName        VARCHAR(50)
                                                   ,@PassWord       VARCHAR(50)
                                 )BEGINDECLARE @iMsg int
    DECLARE @hr int
    DECLARE @source varchar(255)
    DECLARE @description varchar(500)
    DECLARE @output varchar(1000)
    --SELECT @Subject=@@ServerName + ' : ' + @Subject
    --SELECT @Body= @Body + ' - - - Message from : ' + @@ServernameEXEC @hr = sp_OACreate 'CDO.Message', @iMsg OUTput
    EXEC @hr = sp_OASetProperty @iMsg, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value','2'
    EXEC @hr = sp_OASetProperty @iMsg, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value', @Server
    EXEC @hr = sp_OASetProperty @iMsg,'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value','1'     
    EXEC @hr = sp_OASetProperty @iMsg,'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusername").Value',@LogName
    EXEC @hr = sp_OASetProperty @iMsg,'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value',@PassWord
    EXEC @hr = sp_OAMethod @iMsg, 'Configuration.Fields.Update', null
    EXEC @hr = sp_OASetProperty @iMsg, 'To', @To
    EXEC @hr = sp_OASetProperty @iMsg, 'From', @From
    EXEC @hr = sp_OASetProperty @iMsg, 'Subject', @Subject--EXEC @hr = sp_OAMethod @iMsg, 'AddAttachment', NULL,'d:\route\route\G.TXT'EXEC @hr = sp_OASetProperty @iMsg, 'TextBody', @Body
    EXEC @hr = sp_OAMethod @iMsg, 'Send', NULL
    IF @hr <>0
    SELECT @hr
        BEGIN
            EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
            IF @hr = 0
                BEGIN
                    SELECT @output = ' Source: ' + @source
                    PRINT @output
                    SELECT @output = ' Description: ' + @description
                    PRINT @output
                END
            ELSE
                BEGIN
                    PRINT ' sp_OAGetErrorInfo failed.'
                    RETURN
                END
        ENDEXEC @hr = sp_OADestroy @iMsgENDGO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
    再调用该过程    UP_SendMail
                                                    @From='[email protected]'            --发件人
                                                   ,@To='[email protected]'              --对方邮件地址
                                                   ,@Subject='test'                  --主题
                                                   ,@Body='test'                     --内容
                                                   ,@Server='mail.test.com'          --SMTP服务器
                                                   ,@LogName='[email protected]'         --登录用户名
                                                   ,@PassWord='12345'                --密码把参数换成你的,就可以测试了,有问题QQ吧57920668
      

  14.   

    这个利用OLE automation 发送邮件不错我搞了个smtp server 测试了一通,script 没有问题,但email 似乎没有发出来。
    Monitor the network, 发现没有catch 到 smt 包。怪异!!!!
      

  15.   

    发送失败,看下你的SMTp服务器设置的对不对,还有SSL链接设置的对不对,一般不需要SSL认证
      

  16.   


    出现错误:
    消息 102,级别 15,状态 1,第 5 行
    'sp_configure' 附近有语法错误。
      

  17.   

    SQL Server 并没有内置邮件服务器(Mail Server),它跟我们发送邮件一样,需要用户名和密码通过 SMTP(Simple Message Transfer Protocol)去连接邮件服务器。我们想让 SQL Server 来发送邮件,首先要告诉它用户名称,密码,服务器地址,网络传送协议,邮件服务器的端口等信息。
      以下脚本实现了数据库邮件的配置:
    --下面是具体的配置邮件步骤 
    --在 sa 系统帐户下运行。 
    --
    --1. 启用 SQL Server 2005 邮件功能。 
    use master
    go
    exec sp_configure 'show advanced options',1
    go
    reconfigure
    go
    exec sp_configure 'Database mail XPs',1
    go
    reconfigure
    go
    --2. 在 SQL Server 2005 中添加邮件帐户(account) 
    exec msdb..sysmail_add_account_sp
            @account_name            = 'jgj'      -- 邮件帐户名称(SQL Server 使用)
           ,@email_address           = [email='[email protected]']'[email protected]'[/email] -- 发件人邮件地址
           ,@display_name            = null                      -- 发件人姓名
           ,@replyto_address         = null
           ,@description             = null
           ,@mailserver_name         = '203.86.70.229'           -- 邮件服务器地址
           ,@mailserver_type         = 'SMTP'                    -- 邮件协议(SQL 2005 只支持 SMTP)
           ,@port                    = 25                        -- 邮件服务器端口
           ,@username                = [email='[email protected]']'[email protected]'[/email] -- 用户名
           ,@password                = 'xxxxxx'      -- 密码
           ,@use_default_credentials = 0
           ,@enable_ssl              = 0
           ,@account_id              = null
    --3. 在 SQL Server 2005 中添加 profile 
    exec msdb..sysmail_add_profile_sp @profile_name = 'dba_profile'      -- profile 名称 
                                     ,@description  = 'dba mail profile' -- profile 描述 
                                     ,@profile_id   = null
    -- 在 SQL Server 2005 中映射 account 和 profile 
    exec msdb..sysmail_add_profileaccount_sp  @profile_name    = 'dba_profile' -- profile 名称 
                                             ,@account_name    = 'jgj'     -- account 名称 
                                             ,@sequence_number = 1             -- account 在 profile 中顺序 
    --5. 利用 SQL Server 2005 Database Mail 功能发送邮件。 
    exec msdb..sp_send_dbmail @profile_name =  'dba_profile'     -- profile 名称 
                             ,@recipients   =  [email='[email protected]']'[email protected]'[/email]  -- 收件人邮箱 
                             ,@subject      =  'SQL Server 2005 Mail 测试' -- 邮件标题 
                             ,@body         =  'Hello Mail!测试'   -- 邮件内容 
                             ,@body_format  =  'TEXT'      -- 邮件格式 
    --6. 查看邮件发送情况: 
    use msdb
    go
    select * from sysmail_allitems
    select * from sysmail_mailitems
    select * from sysmail_event_log
    --如果不是以 sa 帐户发送邮件,则可能会出现错误: 
    --
    --Msg 229, Level 14, State 5, Procedure sp_send_dbmail, Line 1
    --EXECUTE permission denied on object 'sp_send_dbmail', database 'msdb', schema 'dbo'.
    --
    --这是因为,当前 SQL Server 登陆帐户(login),在 msdb 数据库中没有发送数据库邮件的权限,需要加入 msdb 数据库用户,并通过加入 sp_addrolemember 角色赋予权限。假设该SQL Server 登陆帐户名字为 “dba” 
    --
    --use msdb
    --go
    --
    --create user dba for login dba
    --go
    --
    --exec dbo.sp_addrolemember @rolename   = 'DatabaseMailUserRole',
    --                          @membername = 'dba'
    --go
    --
    --此时,再次发送数据库邮件,仍可能有错误: 
    --
    --Msg 14607, Level 16, State 1, Procedure sp_send_dbmail, Line 119
    --profile name is not valid
    --
    --虽然,数据库用户 “dba” 已经在 msdb 中拥有发送邮件的权限了,但这还不够,他还需要有使用 profile:“dba_profile” 的权限。 
    --
    --use msdb
    --go
    --
    --exec sysmail_add_principalprofile_sp  @principal_name = 'dba'
    --                                     ,@profile_name   = 'dba_profile'
    --                                     ,@is_default     = 1
    --
    --从上面的参数 @is_default=1 可以看出,一个数据库用户可以在多个 mail profile 拥有发送权限。