SQL2005邮件 发送


/*******************************************************************************************************************
      邮件内容存储过程
********************************************************************************************************************/

use Blink_Star_PC
go
if exists(select * from sysobjects where Type='P' and name='SP_SendEmail')
begin
 drop proc SP_SendEmail
end
go
create proc SP_SendEmail
(
 @SendTo varchar(50)
)
as
begin
declare @count as int
set @count = (select count(玩具号) from GlobalToyz.dbo.玩具)

 if (@count >= 20)
  begin
   --调用SQL2005的邮件发送的存储过程
   EXEC msdb.dbo.sp_send_dbmail   
      
   --就是在步骤2中的配置文件名。--现有数据库邮件配置文件的名称  如果未指定 profile_name 默认专用配置文件使用 msdb 数据库的默认公共配置文件
   @profile_name = 'Jerry', 

   --用来接受邮件的地址                                 
   @recipients = @SendTo,
   
   -- 邮件主题
   @subject = 'SQL server 发送邮件测试',     
  
   -- 邮件内容  类型为 nvarchar(max),默认值为 NULL。
   --@body = '这是 '+ convert(varchar(max),getdate(),120) +' 转入超过20次的用户信息:',
   @body = '这是转入超过20次的用户信息:',
   
   --邮件正文的格式 Text/Html  默认为 TEXT
   @body_format =Text,

   --要执行的查询。查询结果可以作为文件附加,或包含在电子邮件的正文中
   @query ='SP_TO',
   
   --存储过程在其中运行查询的数据库上下文  只有在指定 @query 时,此参数才适用。
   @execute_query_database ='GlobalToyz',   

   --电子邮件附件的文件名列表,以分号分隔。必须使用绝对路径指定列表中的文件
   @file_attachments ='f:\1.xlsx',
   
   --用于设置查询结果的格式的线条宽度(字符) 数据类型为 int,默认值为 256 指定 @query 时,此参数才适用。
   @query_result_width =  80,
 
   --用于分隔查询输出中的列的字符。分隔符的类型为 char(1)。默认为 ' '(空格)
   @query_result_separator =' ';   

  end
 else
  print '不发送!';
end

/*******************************************************************************************************************
      邮件内容存储过程
********************************************************************************************************************/

use Blink_Star_PC
go
if exists(select * from sysobjects where Type='P' and name='SP_TO')
begin
 drop proc SP_TO
end
go
create proc SP_TO

as
begin
    select 玩具号,玩具名,价格,数量 from GlobalToyz.dbo.玩具
 print char(10)+'这是转出超过20次的用户信息:  '
 select 定单号,定单日期,定单支付情况,总价格 from  GlobalToyz.dbo.定单
end

/*    执行发送邮件功能
******************************************************************************************
use Blink_Star_PC
execute SP_SendEmail 'blink_star@QQ.com;blink_star@126.com',20
*******************************************************************************************/


/*******************************************************************************************************************
      查询邮件信息
********************************************************************************************************************/
--查询发送信息
SELECT * FROM msdb.dbo.sysmail_allitems order by mailitem_id desc 

--delete from msdb.dbo.sysmail_allitems

WHERE mailitem_id = 18

--邮件发送状态
select mailitem_id,sent_status  from msdb.dbo.sysmail_allitems order by mailitem_id desc 

WHERE mailitem_id =16

--邮件发送日志
SELECT  * FROM msdb.dbo.sysmail_event_log order by Log_id desc 

--delete from msdb.dbo.sysmail_event_log

WHERE mailitem_id =16

-------------------------------------------------------------------------
-----------------------------不明白的地方--------------------------------
-------------------------------------------------------------------------

Create PROCEDURE [dbo].[job_AutoMail_xxd]
AS
BEGIN
    SET nocount ON;

--获取数据

truncate table Db_Name.dbo.Table_Name
insert into Db_Name.dbo.Table_Name
    select * from openquery(Link_Name,'exec store_procedure_name')

exec master..xp_cmdshell 'del f:\1.xls'
EXEC master..xp_cmdshell 'bcp 数据库名.表名 out c:\temp1.xls -c -q -S 服务名 -U sa -P 密码'

-------------------------------------------------------------------------
-----------------------------邮件附件发送--------------------------------
-------------------------------------------------------------------------

--开启 OLE Automation Procedures。

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO


--定义邮件参数
--收件人
DECLARE @To AS varchar(500)
--SET @To = 'to@mailserver.com'
set @To='blink_star@126.com'

--发件人
DECLARE @From AS varchar(500)
--SET @From = ' from <mailto:from@mailserver.com%3E'
set @From='c2c_5151pk@sohu.com'

--主题
DECLARE @Subject AS varchar(500)
SET @Subject = 'Subject'

--内容
DECLARE @Body AS varchar(8000)
SET @Body =' select 玩具号,玩具名,价格,商标,数量 from GlobalToyz.dbo.玩具'

--SET @Body = 'From xue with auto sqlmail on '+convert(char(19),getdate(),121)+''
DECLARE @Attachment as varchar(250)
set @Attachment = 'f:\1.xls'

-------------------------------------------------------------------------
-----------------------------邮件发送部分--------------------------------
-------------------------------------------------------------------------


Declare @object int
Declare @hr int

EXEC @hr = sp_OACreate 'CDO.Message', @object OUT

EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing%22).Value', '2'
--SMTP服务器地址
EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver%22).Value', 'smtp.sohu.com'
EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport%22).Value', '25'
--SMTP认证方式,为不需要认证,为明文密码认证,为SSL
EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate%22).Value', '1'
--邮箱地址或登陆用户名
EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusername%22).Value', 'c2c_5151pk@sohu.com'
--邮箱密码
EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendpassword%22).Value', 'c2c_5151pk'

EXEC @hr = sp_OAMethod @object, 'Configuration.Fields.Update', null
EXEC @hr = sp_OASetProperty @object, 'To', @To
EXEC @hr = sp_OASetProperty @object, 'From', @From
EXEC @hr = sp_OASetProperty @object, 'Subject', @Subject

-- Text格式
--EXEC @hr = sp_OASetProperty @object, 'BodyFormat', 'MailFormat.Text'
--EXEC @hr = sp_OASetProperty @object, 'BodyPart.Charset', 'GB2312'
--EXEC @hr = sp_OASetProperty @object, 'TextBody', @Body

--HTML格式的邮件
EXEC @hr = sp_OASetProperty @object, 'BodyFormat', 'MailFormat.Html'
SET @Body = REPLACE(@Body,CHAR(10),'<br/>')
SET @Body = REPLACE(@Body,' ','&nbsp;')
EXEC @hr = sp_OASetProperty @object, 'HTMLBodyPart.Charset', 'GB2312'
EXEC @hr = sp_OASetProperty @object, 'HtmlBody',@Body

--调用发送方法发送邮件
if @Attachment <> ' '
EXEC @hr = sp_OAMethod @object, 'AddAttachment', NULL, @Attachment
EXEC @hr = sp_OAMethod @object, 'Send', NULL

--判断出错
IF (@hr <> 0)
 BEGIN
  EXEC sp_OAGetErrorInfo @object,@Body OUT,@Body OUT
  PRINT '对不起,邮件发送失败!'
  PRINT '错误信息:' + @Body
 END
ELSE
 BEGIN
  PRINT '恭喜您,邮件发送成功!';
 END

 

/******************************************************************************
    SQL 发送邮件 参数说明
******************************************************************************/

IF EXISTS(SELECT name from master..sysdatabases where name = 'SalesDB')   

 DROP DATABASE SalesDB

CREATE DATABASE SalesDB;

USE SALESDB;
CREATE TABLE SalesHistory
(   
 SaleID INT IDENTITY(1,1),    
 Product VARCHAR(30),      
 SaleDate SMALLDATETIME,     
 SalePrice MONEY
)

DECLARE @i SMALLINT

SET @i = 1

WHILE (@i <=10)

BEGIN    
 INSERT INTO SalesHistory (Product, SaleDate, SalePrice) VALUES ('Computer', DATEADD(mm, @i, '3/11/1919'), DATEPART(ms, GETDATE()) + (@i + 57) )

    INSERT INTO SalesHistory (Product, SaleDate, SalePrice) VALUES ('BigScreen', DATEADD(mm, @i, '3/11/1927'), DATEPART(ms, GETDATE()) + (@i + 13) )

    INSERT INTO SalesHistory (Product, SaleDate, SalePrice) VALUES ('PoolTable', DATEADD(mm, @i, '3/11/1908'), DATEPART(ms, GETDATE()) + (@i + 29) )

    SET @i = @i + 1

END

EXEC msdb.dbo.sp_send_dbmail
--收件人电子邮件地址列表,以分号分隔
@recipients=N'chapman.tim@gmail.com',

--收件人抄送邮件的电子邮件地址列表,以分号分隔
--@copy_recipients = null,

--收件人密件抄送邮件的电子邮件地址列表,以分号分隔
--@blind_copy_recipients = null,

--邮件主题
@subject ='Message Subject',

--电子邮件的正文 类型为 nvarchar(max),默认值为 NULL。
@body='Message Body', 

--现有数据库邮件配置文件的名称  如果未指定 profile_name 默认专用配置文件使用 msdb 数据库的默认公共配置文件
@profile_name =null,

--邮件正文的格式 Text/Html  默认为 TEXT
@body_format =Html,

--邮件的重要性 Low Normal High 默认值为 Normal
@importance = Normal,

--邮件的敏感度 Normal Personal Private Confidential  默认值为 Normal。
@sensitivity =Normal,

--电子邮件附件的文件名列表,以分号分隔。必须使用绝对路径指定列表中的文件
@file_attachments =null,

--要执行的查询。查询结果可以作为文件附加,或包含在电子邮件的正文中
@query ='SELECT Product FROM SalesHistory GROUP BY Product HAVING COUNT(*) > 3',

--存储过程在其中运行查询的数据库上下文  只有在指定 @query 时,此参数才适用。
--@execute_query_database ='',

--指定查询结果集是否作为附件返回  如果该值为 1,结果作为附件返回。只有在指定 @query 时,此参数才适用。
@attach_query_result_as_file = 1,

--指定查询结果集附件使用的文件名 为 0,则忽略此参数 为 1 且此参数为 NULL,则数据库邮件会创建任意文件名
@query_attachment_filename ='Results.txt',

--用于设置查询结果的格式的线条宽度(字符) 数据类型为 int,默认值为 256 指定 @query 时,此参数才适用。
 @query_result_width =  10,


---[ @query_result_header = ] query_result_header
--指定查询结果是否包含列标题。query_result_header 值的数据类型为 bit。如果该值为 1,则查询结果包含列标题。如果该值为 0,则查询结果不包含列标题。该参数的默认值为 1。只有在指定 @query 时,此参数才适用。

--[ @query_result_width = ] query_result_width
--用于设置查询结果的格式的线条宽度(字符)。query_result_width 的数据类型为 int,默认值为 256。提供的值必须介于 10 到 32767 之间。只有在指定 @query 时,此参数才适用。

--[ @query_result_separator = ] 'query_result_separator'
---用于分隔查询输出中的列的字符。分隔符的类型为 char(1)。默认为 ' '(空格)。

--[ @exclude_query_output = ] exclude_query_output
--指定是否使用电子邮件返回查询执行的输出。exclude_query_output 的数据类型为 bit,默认值为 0。当此参数为 0 时,sp_send_dbmail 存储过程的执行将在控制台上打印作为查询执行结果而返回的消息。当此参数为 1 时,sp_send_dbmail 存储过程的执行不会在控制台上打印任何查询执行消息。

--[ @append_query_error = ] append_query_error
--指定是否在 @query 参数中指定的查询返回错误时发送电子邮件。exclude_query_output 的数据类型为 bit,默认值为 0。如果该参数的值为 1,数据库邮件会发送电子邮件,并将查询错误消息包含在电子邮件的正文中。如果该参数的值为 0,数据库邮件不发送电子邮件,sp_send_dbmail 在结束时会返回代码 1,表示失败。

--[ @query_no_truncate = ] query_no_truncate
--指定是否使用可避免截断大型可变长度数据类型(varchar(max)、nvarchar(max)、varbinary(max)、xml、text、ntext、image 以及用户定义数据类型)的选项执行查询。设置该选项后,查询结果将不包含列标题。query_no_truncate 值的数据类型为 bit。当该值为 0 或未指定时,查询中的列截断为 256 个字符。当该此值为 1 时,不截断查询中的列。该参数的默认值为 0。

--[ @mailitem_id = ] mailitem_id [ OUTPUT ]
--可选输出参数将返回消息的 mailitem_id。mailitem_id 的数据类型为 int。

 

/*
******************************************************************************************************************************************
              发送邮件
******************************************************************************************************************************************/

 

*********** ********************************************************************
USE   [msdb]

GO

print   '开启数据库邮件服务选项'

exec  sp_configure  'Database Mail XPS' ,  1

RECONFIGURE ;

 -- 启用数据库邮件功能
--EXEC sys.sp_configure N'show advanced options', 1

--RECONFIGURE;

--EXEC sys.sp_configure 'Database Mail XPs', 1;

--RECONFIGURE

 

print   '启动数据库邮件服务'

exec   sysmail_start_sp

go
/*
******************************************************************************************************************************************
              配置邮件发送文件
******************************************************************************************************************************************/

print   '开始配置数据库邮件'

DECLARE   @account_id   int ,   @profile_id   int ,   @rc   int


print   '创建一个新的数据库邮件帐户,用于保存有关SMTP 帐户的信息。'

exec   @rc   =   msdb . dbo . sysmail_add_account_sp    @account_name   = ' Project _dbagent'   ,

     @email_address   =    ' Project _dbagent@ 163.com '   ,

     @display_name   =    ' Project _DbAgent mail'   ,

     @replyto_address   =    ' Project _DbAgent@ 163.com '   ,

     @description   =    '数据库代理作业管理员'   ,

     @mailserver_name   =    ' mail.163.com '   ,

     @mailserver_type   =    'SMTP' ,   -- 区分大小写,只能填这个

     @port   =  25 ,

     @username   =    ' Project _dbagent'   ,

     @password   =    ' Project job'   ,

     @use_default_credentials   =  0 ,

     @enable_ssl   =  0 ,

     @account_id   =   @account_id   OUTPUT

select   'sysmail_add_account_sp'   as   name ,   @rc   as   [@rc] ,   @account_id   as   [@account_id]

 

 

print   '创建新的数据库邮件配置文件。'

exec   @rc   =   msdb . dbo . sysmail_add_profile_sp    @profile_name   =    '数据库代理作业报告邮件配置' ,

     @description   =    '数据库代理作业报告邮件配置'   ,

     @profile_id   =    @profile_id   OUTPUT  

select   'sysmail_add_profile_sp'   as   name ,   @rc   as   [@rc] ,   @profile_id   as   [@profile_id]

 

 

print   '在数据库邮件配置文件中添加一个数据库邮件帐户。'

exec   @rc   =   msdb . dbo . sysmail_add_profileaccount_sp  

@profile_id   =    @profile_id ,   @account_id   = @account_id   ,   @sequence_number   =  1

select   'sysmail_add_profileaccount_sp'   as   name ,   @rc   as   [@rc]

 

print   '创建数据库代理的操作员,这里@email_address 要改为接收作业报告邮件的邮箱!'

EXEC   msdb . dbo . sp_add_operator   @name = N' Project _DbAgent' ,  

@enabled = 1 ,  

@weekday_pager_start_time = 0 ,  

@weekday_pager_end_time = 235959 ,  

@saturday_pager_start_time = 0 ,  

@saturday_pager_end_time = 235959 ,  

@sunday_pager_start_time = 0 ,  

@sunday_pager_end_time = 235959 ,  

@pager_days = 127 ,  

@email_address = N' Project _DbAgent@ 163.com ' ,  

@pager_address = N' Project _DbAgent@ 163.com '

--,@category_name=N'[DBA]'

 

if   @@error   !=  0

print   '数据库邮件配置完成!'

else

print   '数据库邮件配置失败!'

 

GO

 

print   '发送测试邮件!'

EXEC   msdb . dbo . sp_send_dbmail

     @profile_name   =   '数据库代理作业报告邮件配置' ,

     @recipients   =   ' Project _dbagent@ 163.com ' ,

     @body   =   '我的测试' ,

     @subject   =   '数据库代理作业报告邮件配置测试'

--@attach_query_result_as_file = 1 ;
 

print   ' 为SQL代理配置邮件服务 !'

EXEC   master . dbo . xp_instance_regwrite   N'HKEY_LOCAL_MACHINE' ,   N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent' ,   N'DatabaseMailProfile' ,   N'REG_SZ' ,   N'开发测试邮件配置'

GO

 

--  配置完成后,就可以为已有的作业配置邮件服务了。

USE   [msdb]

GO

USE   [msdb]

GO

-- 更新指定作业的警告选项

EXEC   msdb . dbo . sp_update_job   @job_name   = N'xxxx' ,  

@notify_level_email = 3 ,  

@notify_level_netsend = 2 ,  

@notify_level_page = 2 ,  

@notify_email_operator_name = N' Project _DbAgent'


/*
******************************************************************************************************************************************
              完整的发送邮件
******************************************************************************************************************************************/

 

-- =================================================

-- 启用数据库邮件功能

-- =================================================

EXEC sys.sp_configure N'show advanced options', 1

RECONFIGURE;
 

EXEC sys.sp_configure 'Database Mail XPs', 1;

RECONFIGURE;

-- =================================================

-- 配置

-- =================================================

DECLARE

    @account_name sysname,

    @profile_name sysname;

SELECT

    @account_name = N'blinkstar129@gmail.com',  -- 数据库邮件帐号

    @profile_name = N'gmail';                -- 数据库邮件配置文件名

 

-- 数据库邮件帐号

EXEC msdb.dbo.sysmail_add_account_sp

    @account_name = @account_name,

    @email_address = N'blinkstar129@gmail.com',  -- Email 地址

    @display_name = N'gmail test',            -- 回复地址

    @mailserver_name = N'smtp.gmail.com',     -- Gmail smtp 服务器地址

    @port = 456,                               -- 端口号(对于Gmail, 如果 25 不通则改用 456/587)

    @username = N'blinkstar129@gmail.com',       -- Gmail 邮件地址

    @password = N'715LOVE_129',                   -- Gmail 邮件帐号密码

    @use_default_credentials = 0,

    @enable_ssl = 1;                          -- 启用SSL 通讯加密

 

-- 数据库邮件配置文件

EXEC msdb.dbo.sysmail_add_profile_sp

    @profile_name = @profile_name;

   

-- 把数据库邮件帐号添加到邮件配置文件中

EXEC msdb.dbo.sysmail_add_profileaccount_sp

    @profile_name = @profile_name,

    @account_name = @account_name,

    @sequence_number = 1;

 

-- 授予任意用户使用数据库邮件配置文件的权限

EXEC msdb.dbo.sysmail_add_principalprofile_sp

    @principal_name = N'guest',

    @profile_name = @profile_name,

    @is_default = 0;
 

-- =================================================

-- 发送邮件

-- =================================================

EXEC msdb.dbo.sp_send_dbmail

    @profile_name = 'gmail',

    @recipients = N'cyx3925894@sina.com',      -- 收件人地址

    @subject = N'SQL server 发送邮件测试',     -- 邮件主题

    @body = N'SQL server 发送邮件测试成功',            -- 邮件内容

 @query ='SELECT top 10 name from Blink_Star_PC.dbo.city';

 


--邮件发送日志
SELECT  * FROM msdb.dbo.sysmail_event_log order by Log_id desc 

--邮件发送状态
select mailitem_id,sent_status  from msdb.dbo.sysmail_allitems order by mailitem_id desc 

-- =================================================

-- 删除配置

-- =================================================

/* --

DECLARE

    @account_name sysname,

    @profile_name sysname;

SELECT

    @account_name = N'GmailTest@gmail.com',

    @profile_name = N'gmail';

 

-- 从邮件配置文件中删除数据库邮件帐号

EXEC msdb.dbo.sysmail_delete_profileaccount_sp

    @profile_name = @profile_name,

    @account_name = @account_name;

   

-- 删除数据库邮件帐号

EXEC msdb.dbo.sysmail_delete_account_sp

    @account_name = @account_name;

 

-- 删除数据库邮件配置文件

EXEC msdb.dbo.sysmail_delete_profile_sp

    @profile_name = @profile_name;

 

-- 禁用数据库邮件功能

EXEC sys.sp_configure 'Database Mail XPs', 0;

RECONFIGURE;

 

EXEC sys.sp_configure N'show advanced options', 0

RECONFIGURE;

-- */

-- =================================================

-- 查询邮件发送信息

-- =================================================

--查询发送信息
SELECT * FROM msdb.dbo.sysmail_allitems order by mailitem_id desc 

WHERE mailitem_id = 18

--邮件发送状态
select mailitem_id,sent_status  from msdb.dbo.sysmail_allitems order by mailitem_id desc 

WHERE mailitem_id =16

--邮件发送日志
SELECT  * FROM msdb.dbo.sysmail_event_log order by Log_id desc 

WHERE mailitem_id =16


 

posted @ 2009-09-24 08:49  Blink_Star  阅读(483)  评论(0)    收藏  举报