2

我刚刚在 MSSQL 2005 中设置了数据库邮件。我已经能够从服务器上的管理员帐户并通过 SQL Server 代理作业发送电子邮件。但是,当我尝试通过仅有权访问我们的 Web 应用程序的数据库的登录名发送电子邮件时,我无法发送电子邮件。

设置对数据库邮件的访问的最佳方式是什么?

我有 2 个要发送电子邮件的 senerios。

  1. 通过 SQL Server 代理安排作业以运行存储过程,该过程执行某些过程,然后发送电子邮件。(这不是问题)
  2. 有一个从 Web 应用程序调用的存储过程,该应用程序调用另一个可以发送电子邮件的存储过程。(这是我的权限问题)

可能的解决方案

  1. 我发现授予登录权限的唯一方法是将登录名映射到msdb数据库并授予publicDatabaseMailUserRole。这真的让我很担心,因为我认为这会提供对msdb数据库的很多访问权限。

  2. 将我要发送的电子邮件存储在一个表中,然后让 SQL Server 代理作业每隔一段时间查看该表以发送任何排队的电子邮件。这样,Web 应用程序的数据库登录不会执行 [msdb].[dbo].[sp_send_dbmail] 调用,因此不需要对msdb数据库的任何权限。

还有其他解决方案吗?

4

2 回答 2

1

您应该能够使用 EXECUTE AS OWNER选项创建一个存储过程,以便它在所有者而不是调用者的上下文中运行。

CREATE PROCEDURE [dbo].[sp_SendMail]
(
    @To nvarchar(1000),
    @Subject nvarchar(100),
    @Body nvarchar(max)
)
WITH EXECUTE AS OWNER
AS
BEGIN
    exec msdb.dbo.sp_send_dbmail @profile_name = 'MailProfile', 
                @recipients = @To, 
                @subject = @Subject, 
                @body = @Body
END
于 2008-12-31T18:07:13.457 回答
0

我正在尝试做同样的事情,但正在执行

GRANT EXECUTE ON dbo.sp_SendMail TO User1

没有解决这个问题。唯一使此程序起作用的不是添加

EXECUTE AS OWNER

(我仅使用“WITH ENCRYPTION”创建它)并将运行此过程的用户添加到 msdb DatabaseMailUserRole 角色:

USE msdb
GO
EXEC sp_adduser @loginame='USERNAME', @grpname='DatabaseMailUserRole'
GO

谢谢

于 2009-06-01T22:04:33.777 回答