标签: database-mail

sp_send_dbmail 使用最佳实践

我想弄清楚 sp_send_dbmail 的最佳使用实践,但我在网上找不到任何答案。

我们的开发人员喜欢使用 sp_send_dbmail 从应用程序内部发送与应用程序相关的电子邮件。假设例如用户忘记了他们的密码,他们将通过执行 sp_send_dbmail 发送用户请求的密码重置电子邮件。这只是他们使用此存储过程发送的多种电子邮件类型之一。这是一个好习惯吗?对我来说,这感觉像是一个肮脏的解决方案,因为有许多 API 可以处理您的应用程序中的电子邮件发送,而作为 DBA,我不喜欢在生产服务器上启用这些选项。我只是别无选择。也许有足够的动机和证据证明这是不好的做法和/或由于各种原因有潜在危险,我可以动摇他们改变它。

sql-server database-mail

6
推荐指数
1
解决办法
1504
查看次数

SQL Server 警报未向操作员发送通知电子邮件

我设置了几个 SQL Server 警报并添加了 Operator 来通知是否发生任何警报。

我只是注意到确实发生了几个警报,但我们没有收到任何警报电子邮件。我确实向操作员发送了一封测试通知电子邮件,它工作正常,我们收到了电子邮件。

知道为什么在实际警报发生时我们没有收到电子邮件警报吗?

数据库邮件日志中没有任何内容。

SQL Server 是可用性组的一部分,我只在操作员中提供电子邮件名称,而不提供任何“网络发送地址”或“寻呼机电子邮件名称”。此外,所有警报都列在操作员的属性中。

警报历史记录“发生次数:266”,上次警报的日期是昨天 6 月 29 日,但我根本没有收到警报电子邮件。甚至运营商历史也没有任何历史(从未通过电子邮件发送)。

sql-server sql-server-agent database-mail alerts sql-server-2016

6
推荐指数
1
解决办法
4483
查看次数

可以发送测试数据库邮件但作业邮件失败

我最近停止接收 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-2005 sql-server database-mail

6
推荐指数
1
解决办法
3260
查看次数

SQL Server 2017 安装是否仍需要 .NET Framework 3.5 才能使用数据库邮件?

我猜想在 SQL Server 2017 中使用数据库邮件仍然需要 .NET Framework 3.5?因为不久前我不得不将它包含在我在 Server 2016 上安装的 SQL Server 2016 中。

我无法通过网络找到明确的答案,令人惊讶的是,也许它没有说。

sql-server installation database-mail sql-server-2017

6
推荐指数
1
解决办法
2823
查看次数

数据库邮件到分发列表

我有一个 SQL Server 2005,我已经配置了数据库邮件来设置监控警报和通知。我还创建了一个包含几封电子邮件的电子邮件分发列表。问题是当我将电子邮件从数据库发送到通讯组列表时,它永远不会到达电子邮件收件箱,但如果我单独发送它。

我尝试从 Outlook 向通讯组列表发送电子邮件,并且工作正常。我不明白发生了什么。请你能帮帮我吗?

sql-server database-mail

5
推荐指数
1
解决办法
3307
查看次数

创建作业以在表值大于 x 时使用 sp_send_dbmail 发送警报

问题

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 t-sql database-mail alerts

5
推荐指数
1
解决办法
2万
查看次数

SQL Server 数据库邮件 - 为什么我不能对 xp_sysmail_activate 运行执行?

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)

细节

  • msdb.dbo.sysmail_mailitems 有每封邮件的记录
  • 数据库邮件日志为空(msdb.dbo.sysmail_log)
  • msdb.dbo.sysmail_sentitems 为空
  • 我已经运行了 sysmail_stop_sp 和 sysmail_start_sp
  • “is_broker_enabled”在 msdb 中设置为“1”

当我是 sysadmin 角色的一部分时,执行权限如何被拒绝?关于可能发生什么的任何建议?

sql-server configuration database-mail

5
推荐指数
1
解决办法
3480
查看次数

xp_cmdshell 的替代方法,用于将报告作为 CSV 文件通过电子邮件发送

我有一个问题,如果可能的话,我可以用一些想法来解决如何在不使用(或启用)的情况下实现所需的问题xp_cmdshell

我知道它xp_cmdshell本身会带来风险,即使使用代理帐户,但是 - 在我们的环境中它被禁用并且说服 IT 经理启用它充其量是困难的。

我遇到的问题是我有一个存储过程,它从各种表中查找数据并将其全部放入表变量中。

我想做以下事情:

  • 将表变量的内容导出到 CSV 文件。
  • 将创建的 CSV 文件附加到电子邮件并将其发送到特定地址。

这需要在没有任何类型的用户输入的情况下自动发生,它的电子邮件端将由同一存储过程中的变量提供。

我已经想到了两种可能做到这一点的方法,都使用 bcp 和xp_cmdshell.

第一种方法是创建一个临时表,从表变量中选择我想要的记录到临时表中,然后使用 bcp 来触发 SSIS 包或 SQL 代理作业,它将查询临时表,导出到 CSV 和 e-给我发邮件。

第二种方法是创建一个临时表,从表变量中选择我想要的记录放入临时表中,然后使用bcp将临时表选择为CSV文件,然后使用sp_send_dbmail发送。

第三种选择可能是触发另一个 SP/函数,并让它执行上述任一方法,从而将新功能分开 - 但这只是为了让事情变得简单。

所以,我要问的是关于如何安全地实现这一目标的任何想法,最好不使用xp_cmdshell. 我不能使用 PowerShell 或类似的技术,因为这里没有人知道 PowerShell,虽然我熟悉 VB.NET,但是我不确定这有什么帮助(如果有的话)。

如果您需要更多信息以提供帮助,请告诉我。

sql-server t-sql database-mail table-variable xp-cmdshell

5
推荐指数
2
解决办法
1896
查看次数

DatabaseMail 进程正在关闭

我已经在 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)

sql-server database-mail sql-server-2014

5
推荐指数
1
解决办法
3971
查看次数

SSMS 无法显示此任务的编辑器(通知操作员任务)

每当我双击 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 构建的错误,而不是服务器的配置问题。

sql-server ssms database-mail sql-server-2016

5
推荐指数
1
解决办法
1275
查看次数