我想弄清楚 sp_send_dbmail 的最佳使用实践,但我在网上找不到任何答案。
我们的开发人员喜欢使用 sp_send_dbmail 从应用程序内部发送与应用程序相关的电子邮件。假设例如用户忘记了他们的密码,他们将通过执行 sp_send_dbmail 发送用户请求的密码重置电子邮件。这只是他们使用此存储过程发送的多种电子邮件类型之一。这是一个好习惯吗?对我来说,这感觉像是一个肮脏的解决方案,因为有许多 API 可以处理您的应用程序中的电子邮件发送,而作为 DBA,我不喜欢在生产服务器上启用这些选项。我只是别无选择。也许有足够的动机和证据证明这是不好的做法和/或由于各种原因有潜在危险,我可以动摇他们改变它。
我设置了几个 SQL Server 警报并添加了 Operator 来通知是否发生任何警报。
我只是注意到确实发生了几个警报,但我们没有收到任何警报电子邮件。我确实向操作员发送了一封测试通知电子邮件,它工作正常,我们收到了电子邮件。
知道为什么在实际警报发生时我们没有收到电子邮件警报吗?
数据库邮件日志中没有任何内容。
SQL Server 是可用性组的一部分,我只在操作员中提供电子邮件名称,而不提供任何“网络发送地址”或“寻呼机电子邮件名称”。此外,所有警报都列在操作员的属性中。
警报历史记录“发生次数:266”,上次警报的日期是昨天 6 月 29 日,但我根本没有收到警报电子邮件。甚至运营商历史也没有任何历史(从未通过电子邮件发送)。
sql-server sql-server-agent database-mail alerts sql-server-2016
我最近停止接收 sql 代理作业失败通知。经过调查,报告的错误是:
The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2017-08-16T02:40:14). Exception Message: Could not connect to mail server. (No such host is known).
邮件帐户设置没有改变,我确认它看起来是正确的。此外,我可以使用SSMS 中的“发送测试电子邮件...”功能成功发送和接收电子邮件。那么为什么工作不能发送电子邮件呢?
由于“发送测试电子邮件...”功能将电子邮件排队,因此以这种方式发送它与发送它的作业相比似乎没有权限问题。此外,这表明这不是防火墙问题。所以唯一的区别是一天中的时间......作业在半夜运行......但我想不出任何系统配置会在那时发生变化。
有什么其他想法要检查吗?
我猜想在 SQL Server 2017 中使用数据库邮件仍然需要 .NET Framework 3.5?因为不久前我不得不将它包含在我在 Server 2016 上安装的 SQL Server 2016 中。
我无法通过网络找到明确的答案,令人惊讶的是,也许它没有说。
我有一个 SQL Server 2005,我已经配置了数据库邮件来设置监控警报和通知。我还创建了一个包含几封电子邮件的电子邮件分发列表。问题是当我将电子邮件从数据库发送到通讯组列表时,它永远不会到达电子邮件收件箱,但如果我单独发送它。
我尝试从 Outlook 向通讯组列表发送电子邮件,并且工作正常。我不明白发生了什么。请你能帮帮我吗?
问题
将SMScounter.Counter用于从服务累积使用。该服务的编程上限为 1000。我想在超出此上限时提醒用户。
表创建
CREATE TABLE [dbo].[SMSCounter](
[Counter] [int] NOT NULL,
[CounterDate] [datetime] NOT NULL )
Run Code Online (Sandbox Code Playgroud)
示例数据
380, 2012-09-10 00:00:00.000
177, 2012-10-14 00:00:00.000
999, 2012-11-16 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
作业脚本
下面的脚本是我尝试创建一个计划作业,如果SMScounter.Counter大于 950 ,它将每小时检查一次。
USE DATABASEname
select (Counter) as CHECKVALUE from SMSCounter where smscounter.CounterDate = DATEADD(dd, DATEDIFF(dd, 0, GETDATE()),0)
IF CHECKVALUE > 950
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@recipients=N'scott@mydomain.com',
@body='1000 Daily SMS cap near',
@subject ='1000 Daily SMS cap near',
@profile_name ='SCOTT',
@query =
'USE DATABASEname
(select * from SMSCounter where CounterDate …Run Code Online (Sandbox Code Playgroud) SQL Server 2008 R2 标准 x64
我无法从这个 SQL Server 发送电子邮件(在许多配置几乎完全相同的 AFAIK 中)。我已经创建了邮件配置文件和帐户。但是,每当我尝试使用 sp_send_dbmail(使用我的帐户 - 在系统管理员角色中)或数据库邮件->“发送测试电子邮件”发送电子邮件时,都没有任何反应。sysmail_log 中没有任何内容。生成以下 SQL Server 错误:
The activated proc '[dbo].[sp_sysmail_activate]' running on queue 'msdb.dbo.ExternalMailQueue' output the following: 'The EXECUTE permission was denied on the object 'xp_sysmail_activate', database 'mssqlsystemresource', schema 'sys'.'
Run Code Online (Sandbox Code Playgroud)
细节
当我是 sysadmin 角色的一部分时,执行权限如何被拒绝?关于可能发生什么的任何建议?
我有一个问题,如果可能的话,我可以用一些想法来解决如何在不使用(或启用)的情况下实现所需的问题xp_cmdshell。
我知道它xp_cmdshell本身会带来风险,即使使用代理帐户,但是 - 在我们的环境中它被禁用并且说服 IT 经理启用它充其量是困难的。
我遇到的问题是我有一个存储过程,它从各种表中查找数据并将其全部放入表变量中。
我想做以下事情:
这需要在没有任何类型的用户输入的情况下自动发生,它的电子邮件端将由同一存储过程中的变量提供。
我已经想到了两种可能做到这一点的方法,都使用 bcp 和xp_cmdshell.
第一种方法是创建一个临时表,从表变量中选择我想要的记录到临时表中,然后使用 bcp 来触发 SSIS 包或 SQL 代理作业,它将查询临时表,导出到 CSV 和 e-给我发邮件。
第二种方法是创建一个临时表,从表变量中选择我想要的记录放入临时表中,然后使用bcp将临时表选择为CSV文件,然后使用sp_send_dbmail发送。
第三种选择可能是触发另一个 SP/函数,并让它执行上述任一方法,从而将新功能分开 - 但这只是为了让事情变得简单。
所以,我要问的是关于如何安全地实现这一目标的任何想法,最好不使用xp_cmdshell. 我不能使用 PowerShell 或类似的技术,因为这里没有人知道 PowerShell,虽然我熟悉 VB.NET,但是我不确定这有什么帮助(如果有的话)。
如果您需要更多信息以提供帮助,请告诉我。
我已经在 INSTANCE1 和 INSTANCE2 中配置了数据库邮件。每当我尝试使用以下代码发送邮件时,我都会在 INSTANCE1 中得到“邮件排队”的输出。
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Vinesh',
@recipients = 'VineshSenthilvel@gmail.com',
@body = 'The stored procedure finished successfully.',
@subject = 'Automated Success Message - Default' ;
Run Code Online (Sandbox Code Playgroud)
但是邮件没有发送到我的邮箱。我尝试在 INSTANCE2 中执行上述查询,邮件已送达。我已经验证数据库邮件配置在这两个实例中似乎都是完美的。
我可以在数据库邮件日志中找到数据库邮件进程正在关闭。还发现了下面提到的错误。
1) Exception Information
===================
Exception Type: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException
Message: The Transaction not longer valid.
Data: System.Collections.ListDictionaryInternal
TargetSite: Void ValidateConnectionAndTransaction()
HelpLink: NULL
Source: DatabaseMailEngine
StackTrace Information
===================
at Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.ValidateConnectionAndTransaction()
at Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.RollbackTransaction()
at Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.GetDataFromQueue(DataAccessAdapter da, Int32 lifetimeMinimumSec)
at Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.ProcessQueueItems(String dbName, String dbServerName, Int32 lifetimeMinimumSec, LogLevel loggingLevel, Byte[] encryptionKey, Int32 …Run Code Online (Sandbox Code Playgroud) 每当我双击 SSMS 维护计划中的通知操作员任务时,我都会收到一条错误消息,显示“无法显示此任务的编辑器” 。
属性 IsMailHost 不可用于数据库“[msdb]”。该对象的该属性可能不存在,或者由于访问权限不足而无法检索。(微软.SqlServer.Smo)
数据库邮件已配置并且工作正常。
我正在使用 SQL Server 2016 (13.0.4411.0) 和 SSMS 13.0.16106.4。
通过 PowerShell 询问 IsMailHost 属性似乎表明 IsMailHost 属性为 true。
$db = SqlServer\Get-SqlDatabase -ServerInstance sqlserver1 -Name msdb
Write-Host $db.IsMailHost
Run Code Online (Sandbox Code Playgroud)
上面的脚本返回True。
如果我尝试在旧的 SQL 2008 服务器上使用 SSMS 10.0.5538.0 打开通知操作员任务,它工作正常,但使用 SSMS 13.0.44110.0,我会收到相同的错误消息。我开始认为这是 SSMS 构建的错误,而不是服务器的配置问题。