SQL Server 并没有内置邮件服务器(Mail Server),它跟我们发送邮件一样,需要用户名和密码通过 SMTP(Simple Message Transfer Protocol)去连接邮件服务器。我们想让 SQL Server 来发送邮件,首先要告诉它用户名称,密码,服务器地址,网络传送协议,邮件服务器的端口……等信息。
以下脚本实现了数据库邮件的配置:
下面是具体的配置邮件步骤
在 sa 系统帐户下运行。
-- 打开邮件设置 use master go exec sp_configure 'show advanced options',1 --以下示例显示如何设置并列出所有的配置选项。先将 show advanced option 设置为 1,便可显示高级配置选项。更改该选项后,不带参数执行 sp_configure 将会显示全部配置选项。 go reconfigure go exec sp_configure 'Database mail XPs',1 go reconfigure go -- 添加邮件账户 exec msdb..sysmail_add_account_sp --创建一个新的数据库邮件帐户,用于保存有关 SMTP 帐户的信息 @account_name='yyy' --邮件账户名称(SQL Server 使用) ,@email_address='yyy753@qq.com' --发件人邮件地址 ,@display_name=null --发件人姓名 ,@replyto_address=null --回复该帐户的邮件时使用的地址 ,@description=null --对帐户的说明 ,@mailserver_name='smtp.qq.com' --邮件服务器地址 ,@mailserver_type='SMTP' --邮件协议 ,@port=25 --邮件服务器端口 ,@username='yyy@qq.com' --用户名 ,@password='123456' --密码 ,@use_default_credentials=0 --指定是否使用 SQL Server 数据库引擎的凭据将邮件发送到 SMTP 服务器 ,@enable_ssl=0 --指定数据库邮件是否使用安全套接字层对通信进行加密 ,@account_id=null --返回新帐户的帐户 ID -- 添加profile exec msdb..sysmail_add_profile_sp --创建新的数据库邮件配置文件。 @profile_name='dba_profile' --新配置文件的名称 ,@description='dba mail profile' --新配置文件的说明 ,@profile_id=null --返回新配置文件的 ID -- 映射account和profile exec msdb..sysmail_add_profileaccount_sp --在数据库邮件配置文件中添加一个数据库邮件帐户 @profile_name='dba_profile' --要在其中添加帐户的配置文件的名称 ,@account_name='yyy' --要在配置文件中添加的帐户的名称 ,@sequence_number=1 --配置文件中的帐户的序列号 -- 利用Database Mail功能发送邮件 exec msdb..sp_send_dbmail --向指定收件人发送电子邮件 @profile_name='dba_profile' --发送邮件的配置文件的名称 ,@recipients='yangyunyu123@foxmail.com' --收件人 ,@subject='SQL Server E-Mail Test!' --邮件标题 ,@body='Hello!yyy!' --邮件内容 ,@body_format='TEXT' --邮件格式 -- 查看发邮件结果 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 拥有发送权限。