我想编写一个自动发送邮件的程序,听说可以用SQL存储过程来实现,请问高手具体怎样做?就是我已经把邮箱地址和时间存到表(user_msg)里了,怎样自动检测时间然后发送???
解决方案 »
- 问题咨询
- sql 2005事件探测器如何设置hostname
- 如何判断数据库dbGf的存在和是否置疑。如果存在就将它删除。
- 请教各位,EXCEL文件的数据导入sql中后特殊符号就变成了问号,怎样解决?
- DTS包问题高手请进!!!
- 第一次散分,顺便问邹建一个问题?
- SQL基础问题如何排序查询
- sql server中如何用sql语句强制恢复数据库备份?
- 数据插入更新问题
- 跪求一sql语句,在线等
- 大家好,我有这样一条语句,是ACCESS中的,现在转为SQL SERVER请问大家要怎么改呢?
- 想问一下,如何用SQL 查询条件是今天的日期2009/12/03 7:30 到 2009/12/04 7:30 这个时间段
朱二(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 好了,去你的邮箱收邮件去吧!
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帐号相同。
-- 存储过程每隔 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'
XP_SENDMAIL存储过程在哪里???如果要自己写一个SENDEMAIL的存储过程又怎样写?谢谢
具体怎样???我用的就是SQL SERVER2005的
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
对象名 'UP_SendMail' 无效。
还有,请问如何使用???不好意思,本人对存储过程很陌生
http://topic.csdn.net/u/20071228/09/3e12c4f0-5a8f-491f-a965-1221deb19333.html
先建立存储过程,执行:
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
Monitor the network, 发现没有catch 到 smt 包。怪异!!!!
出现错误:
消息 102,级别 15,状态 1,第 5 行
'sp_configure' 附近有语法错误。
以下脚本实现了数据库邮件的配置:
--下面是具体的配置邮件步骤
--在 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 拥有发送权限。