如何从 SQL Server 发送电子邮件?

Posted

技术标签:

【中文标题】如何从 SQL Server 发送电子邮件?【英文标题】:How to send email from SQL Server? 【发布时间】:2012-11-09 01:35:16 【问题描述】:

如何使用 T-SQL 发送电子邮件但电子邮件地址存储在表中?我想遍历表格并能够发送电子邮件。到目前为止,我找不到这样做的好例子。

【问题讨论】:

您不应将 SQL Server 用作应用服务器。设置电子邮件以提醒您是一回事,但将其用作电子邮件分发者则是另一回事。虽然您可以执行此操作,但您可能需要考虑是否应该执行此操作。 【参考方案1】:

第 1 步)创建个人资料和帐户

您需要使用配置数据库邮件向导创建配置文件和帐户,该向导可从管理节点中数据库邮件节点的配置数据库邮件上下文菜单访问。此向导用于管理帐户、配置文件和数据库邮件全局设置。

第 2 步)

运行:

sp_CONFIGURE 'show advanced', 1
GO
RECONFIGURE
GO
sp_CONFIGURE 'Database Mail XPs', 1
GO
RECONFIGURE
GO

第 3 步)

USE msdb
GO
EXEC sp_send_dbmail @profile_name='yourprofilename',
@recipients='test@Example.com',
@subject='Test message',
@body='This is the body of the test message.
Congrates Database Mail Received By you Successfully.'

循环遍历表格

DECLARE @email_id NVARCHAR(450), @id BIGINT, @max_id BIGINT, @query NVARCHAR(1000)

SELECT @id=MIN(id), @max_id=MAX(id) FROM [email_adresses]

WHILE @id<=@max_id
BEGIN
    SELECT @email_id=email_id 
    FROM [email_adresses]

    set @query='sp_send_dbmail @profile_name=''yourprofilename'',
                        @recipients='''+@email_id+''',
                        @subject=''Test message'',
                        @body=''This is the body of the test message.
                        Congrates Database Mail Received By you Successfully.'''

    EXEC @query
    SELECT @id=MIN(id) FROM [email_adresses] where id>@id

END

发布在以下链接http://ms-sql-queries.blogspot.in/2012/12/how-to-send-email-from-sql-server.html

【讨论】:

谢谢 Ruzbeh,但我需要从我的桌子上获取电子邮件列表。我怎样才能遍历表格并从表格中获取每封电子邮件并发送电子邮件?您展示的方法仅使用一封固定电子邮件。我期待很快收到您的来信。谢谢 我已经编辑了答案..检查它..这里 id 是您地址表中的标识列 应该@max_id=MIN(id)@max_id=MAX(id) 吗?否则似乎不会发送任何电子邮件。 要添加到这个出色的答案,默认情况下只能从 MSDB 发送电子邮件。当我使用这种方法时,我花了几分钟才弄清楚为什么我的 sp 失败了。 既然没有人提到,我会的,DB 邮件的目的是向 DBA 发送状态更新等,而不是用于大量邮件分发。是的,它适用于小型案例,我用它来向小型团队发送报告和更新,但是循环遍历一个表格并向每个人发送一封电子邮件可能会给你的服务器带来压力。【参考方案2】:

您可以使用数据库邮件从 SQL Server 中本地发送电子邮件。这是通知系统管理员有关错误或其他数据库事件的好工具。您还可以使用它向最终用户发送报告或电子邮件。 其基本语法是:

EXEC msdb.dbo.sp_send_dbmail  
@recipients='user@yourdomain.com',
@subject='Testing Email from SQL Server',
@body='<p>It Worked!</p><p>Email sent successfully</p>',
@body_format='html',
@from_address='Sender Name <sender@yourdomain.com>',
@reply_to='sender@yourdomain.com'

在使用之前,必须使用数据库邮件配置向导或 sp_configure 启用数据库邮件。数据库或 Exchange 管理员可能需要帮助您进行配置。 看 http://msdn.microsoft.com/en-us/library/ms190307.aspx 和 http://www.codeproject.com/Articles/485124/Configuring-Database-Mail-in-SQL-Server 了解更多信息。

【讨论】:

【参考方案3】:

你也可以用光标来做。 假设您已经创建了一个帐户和个人资料,例如“个人资料”和一个帐户,并且您拥有准备好电子邮件的表格,例如"EmailMessageTable" 你可以执行以下操作:

USE database_name
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE mass_email AS
declare @email nvarchar (50) 
declare @body nvarchar (255)  

declare test_cur cursor for             
SELECT email from [dbo].[EmailMessageTable]

open test_cur                                        

fetch next from test_cur into   
@email     
while @@fetch_status = 0       
begin                                    

set @body = (SELECT body from [dbo].[EmailMessageTable] where email = @email)
EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'profile',
    @recipients = @email,
    @body = @body,
    @subject = 'Credentials for Web';
fetch next from test_cur into  
@email 
end    
close test_cur   
deallocate test_cur

之后你所要做的就是执行存储过程

EXECUTE mass_email
GO

【讨论】:

【参考方案4】:

以下示例说明了如何将表格中的电子邮件地址连接到单个 @recipients 参数中:

CREATE TABLE #emailAddresses (email VARCHAR(25))

INSERT #emailAddresses (email) VALUES ('foo@foobar.com')
INSERT #emailAddresses (email) VALUES ('bar@foobar.com')
INSERT #emailAddresses (email) VALUES ('buzzlightyear@foobar.com')

DECLARE @recipients VARCHAR(MAX)
SELECT @recipients = COALESCE(@recipients + ';', '') + email 
FROM #emailAddresses

SELECT @recipients

DROP TABLE #emailAddresses

生成的@recipients 将是:

foo@foobar.com;bar@foobar.com;buzzlightyear@foobar.com

【讨论】:

这根本不能回答问题。【参考方案5】:

为了让 SQL Server 发送电子邮件通知,您需要从管理数据库邮件中创建邮件配置文件。

1) 用户右键点击进入邮件配置菜单并选择配置数据库邮件

2)选择第一个打开(按照以下任务设置数据库邮件),然后按下一步 注意:如果没有配置 SMTP,请参考下面的 URL

http://www.symantec.com/business/support/index?page=content&id=TECH86263

3) 在第二个屏幕中填写配置文件名称并添加 SMTP 帐户,然后按下一步

4) 选择邮件帐户类型(公共或私人)然后按下一步

5) 更改与发送邮件选项相关的参数,然后按next 6) 按完成

现在要让 SQL 服务器在动作 X 发生时发送电子邮件,您可以通过触发器或作业来执行此操作(这不是唯一的常用方法)。

1) 您可以从 SQL Server 代理创建作业,然后右键单击操作员并检查邮件(例如填写您的电子邮件),然后单击确定,然后右键单击作业并选择新作业 并填写所需的信息以及步骤、名称等,然后从通知选项卡中选择您创建的配置文件。

2) 来自触发器请参考下面的示例。

AS
declare @results varchar(max)
declare @subjectText varchar(max)
declare @databaseName VARCHAR(255)
SET @subjectText = 'your subject'
SET @results = 'your results'
-- write the Trigger JOB
EXEC msdb.dbo.sp_send_dbmail
 @profile_name = 'SQLAlerts',
 @recipients = 'xxxx@xxxx.com',
 @body = @results,
 @subject = @subjectText,
 @exclude_query_output = 1 --Suppress 'Mail Queued' message
GO

【讨论】:

【参考方案6】:

有时虽然没有直接找到 sp_send_dbmail。您可以使用“msdb.dbo.sp_send_dbmail”来尝试 (在 Windows Server 2008 R2 上工作正常并经过测试)

【讨论】:

【参考方案7】:

要通过 SQL Server 发送邮件,我们需要设置 DB 邮件配置文件,我们可以使用 SQL Server 中的 T-SQl 或 SQL 数据库邮件选项来创建配置文件。以下代码用于通过查询或存储过程发送邮件。

使用以下链接创建数据库邮件配置文件

http://www.freshcodehub.com/Article/42/configure-database-mail-in-sql-server-database

http://www.freshcodehub.com/Article/43/create-a-database-mail-configuration-using-t-sql-script

--Sending Test Mail
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'TestProfile', 
@recipients = 'To Email Here', 
@copy_recipients ='CC Email Here',             --For CC Email if exists
@blind_copy_recipients= 'BCC Email Here',      --For BCC Email if exists
@subject = 'Mail Subject Here', 
@body = 'Mail Body Here',
@body_format='HTML',
@importance ='HIGH',
@file_attachments='C:\Test.pdf';               --For Attachments if exists

【讨论】:

以上是关于如何从 SQL Server 发送电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL Server sp_send_dbmail 从 java 发送电子邮件

如何使用 SQL Server 通过电子邮件发送包含查询结果的 Excel 工作簿

发送“代表”电子邮件

Access 2016 定时发送自动电子邮件

Mime 和 Office365

SQL Server 使用触发器(trigger)发送电子邮件