首页 > 数据库 >17.1 SQL Server数据库邮件

17.1 SQL Server数据库邮件

时间:2023-01-30 21:45:29浏览次数:44  
标签:product name 数据库 Server 17.1 SQL 电子邮件 id 邮件

SQL Server数据库邮件

目录

简介

数据库电子邮件可以从SQL Server数据库引擎向用户发送电子邮件。电子邮件可以是纯文本或HTML,并可能包含附件。

数据库邮件可靠、可扩展、安全且可支持性好。

可靠性

  • 数据库邮件使用SMTP发送电子邮件。
  • SQL Server使用单独的过程来传递电子邮件,以最大程度地减少对服务器的性能影响。即使SMTP服务器脱机,SQL Server也会排队电子邮件。等SMTP服务器在线时将发送电子邮件。
  • 数据库邮件可以使用多个SMTP服务器。如果SMTP服务器不可用,它将使用第二个SMPT服务器发送电子邮件。

可扩展

数据库邮件在后台异步发送电子邮件。使用sp_send_dbmail存储过程发送电子邮件。此存储过程将请求添加到ServiceBroker队列并立即返回。外部电子邮件组件接收请求并传递电子邮件消息。

安全

  • 默认情况下,数据库邮件服务处于关闭状态。要发送电子邮件,必须先启用它。
  • 用户必须是msdb数据库中DatabaseMailUserRole数据库角色的成员才能发送电子邮件。
  • 数据库邮件允许你保护邮件配置文件。
  • 数据库邮件可以配置附件的大小限制和附件的扩展名。如果要将文件从文件夹附加到电子邮件,SQL Server引擎帐户需要具有访问该文件的权限。

可支持性

  • 日志记录–数据库邮件将电子邮件活动记录到msdb系统数据库和Microsoft Windows应用程序事件日志中的表中。
  • 审核–数据库邮件将邮件和附件的副本保存在msdb数据库中。
  • 多种电子邮件格式–数据库邮件支持纯文本和HTML格式。

配置SQL Server数据库邮件

首先,将Show Advanced设置更改为1:

sp_configure 'Show Advanced', 1;
reconfigure;

执行此操作后,就可以使用sp_configure存储过程查看当前服务器的所有全局配置设置:

sp_configure

然后,为当前SQL Server实例启用数据库邮件:

sp_configure 'Database Mail XPs', 1;
reconfigure;

第三不,使用msdb.dbo.sysmail_add_account_sp存储过程创建数据库邮件帐户:

EXECUTE msdb.dbo.sysmail_add_account_sp
@account_name = 'Primary Account',
@description = 'Account used by all mail profiles.',
@email_address = '[email protected]',
@replyto_address = '[email protected]',
@display_name = 'Database Mail',
@mailserver_name = 'smtp.qq.com';

第四步,创建数据库邮件配置:

EXECUTE msdb.dbo.sysmail_add_profile_sp
@profile_name = 'Public Profile',
@description = 'public profile for all users';

第五,将帐户添加到Public Profile

EXECUTE msdb.dbo.sysmail_add_profileaccount_sp
@profile_name = 'Public Profile',
@account_name = 'Primary Account',
@sequence_number = 1;

第六步,授予所有msdb数据库用户访问配置的权限:

EXECUTE msdb.dbo.sysmail_add_principalprofile_sp
@profile_name = 'public Profile',
@principal_name = 'public',
@is_default = 1;

使用数据库邮件发送邮件

使用msdb.dbo.sp_send_dbmail存储过程发送电子邮件。

1)发送邮件示例

比如向邮件地址[email protected]发送邮件:

EXEC msdb.dbo.sp_send_dbmail  
    @recipients = '[email protected]',  
    @body = 'This is a test message',  
    @subject = 'Database Mail Test';

2)发送带有查询结果的电子邮件

首先,查询产品id 1和2的库存:

SELECT
  store_name,
  product_name,
  SUM(quantity)
FROM sales.stores s
INNER JOIN production.stocks i
  ON i.store_id = s.store_id
INNER JOIN production.products p
  ON p.product_id = i.product_id
WHERE p.product_id IN (1, 2)
GROUP BY store_name,product_name;

然后,将查询结果放到HTML表格中。结果集中的每一行都是带有<tr>标记的HTML表行:

SELECT
  CAST((SELECT
    td = store_name,
    '',
    td = product_name,
    '',
    td = SUM(quantity),
    ''
  FROM sales.stores s
  INNER JOIN production.stocks i
    ON i.store_id = s.store_id
  INNER JOIN production.products p
    ON p.product_id = i.product_id
  WHERE p.product_id IN (1, 2)
  GROUP BY store_name,product_name
  FOR xml PATH ('tr'), TYPE)
  AS nvarchar(max));

第三步,将HTML表体(table body)转换为文本:

DECLARE @tableHTML NVARCHAR(MAX);  
  
SET @tableHTML =  
    N'<h1>Inventory Report</h1>' +  
    N'<table border="1">' +  
    N'<tr><thead><th>Store Name</th><th>Product</th><th>Total Quantity</th></thead><tbody>' +  
    CAST ( (  
			SELECT
			  td=store_name,'',
			  td=product_name,'',
			  td=SUM(quantity),''
			FROM sales.stores s
			INNER JOIN production.stocks i
			  ON i.store_id = s.store_id
			INNER JOIN production.products p
			  ON p.product_id = i.product_id
			WHERE p.product_id IN (1, 2)
			GROUP BY store_name,
					 product_name
			FOR XML PATH('tr'), TYPE 
	) AS NVARCHAR(MAX) ) +  
    N'</tbody></table>' ;  

SELECT @tableHTML;

最后,把邮件发送到[email protected]:

EXEC msdb.dbo.sp_send_dbmail 
    @recipients='[email protected]',  
    @subject = 'Inventory List',  
    @body = @tableHTML,  
    @body_format = 'HTML';  

标签:product,name,数据库,Server,17.1,SQL,电子邮件,id,邮件
From: https://www.cnblogs.com/michaelshen/p/17077324.html

相关文章

  • SQL练习:UNION实现多张表的纵向合并
    左、内、右连接可以实现多表横向合并,而UNION关键字则可以实现多表纵向合并UNION:实现多表纵向合并(默认含去重功能)<sql查询语句1>UNION<sql查询语句2>UNION...UNION......
  • 16.4 SQL Server删除角色
    SQLServer删除角色目录SQLServer删除角色简介示例1)DROPROLE简单示例2)DROPROLE删除具有成员的角色简介语法:DROPROLE[IFEXISTS]role_name;DROPROLE无法删除拥......
  • 18.1 SQL Server阻塞
    SQLServer阻塞目录SQLServer阻塞简介示例简介当两个会话试图同时更新同一数据时,会发生阻塞。第一个会话锁定数据,第二个会话需要等待第一个会话完成并释放锁定。结果......
  • 18.2 SQL Server死锁
    SQLServer死锁目录SQLServer死锁简介示例简介死锁是一个并发问题,其中两个会话会阻止彼此的进程。第一个会话锁定了另一个会话想要访问的资源,反之亦然。下图说明了SQL......
  • mysql02
    mysqlday01课堂笔记1、什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?数据库: 英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。 ......
  • PostgreSQL:查询数据表信息
    PostgreSQL14.0pgAdmin4Version5.7-- 0、序章要查询数据表信息,需要用到系统表或系统视图等,比如,pg_tables、pg_class、information_schema等。使用pgAdmin4......
  • Simple-Web-Server HTTP开源服务器库
    1下载网址​ ​​https://gitlab.com/eidheim/Simple-Web-Server​​2实现HTTP短连接默认的HTTP协议都是短连接,服务器返回响应报文,就会主动断开,测试发现,当前库不会主动断......
  • 在linux下安装mysql8.0.22
    前提准备第一步:检查是否有安装过mysql命令:# rpm -qa|grep-Imysql,使用rpm方式进行验证,其中i表示忽略大小写 假如安装过了mysql则需要先卸载命令:# rpm -e--no......
  • MySQL基础-SQL-DDL
    1.SQL通用语法1.SQL语句可以单行或多行书写,以分号结尾。 2.SQL语句可以使用空格/缩进来增强语句的可读性。 3.MySQL数据库的SQL语句不区分大小写,关键......
  • MySql慢查询
    一、简介开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。开发环境建议一直开启便与优化生成环境建议关......