sql-server - 使用 sp_send_dbmail() 发送电子邮件有时不起作用

标签 sql-server t-sql sp-send-dbmail

我使用 SQL Server 发送通知电子邮件,但有时电子邮件不会发送给用户。

这是我的 SQL 表,用于存储将发送给用户的电子邮件

CREATE TABLE [dbo].[EmailNotification](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[EmailAdress] [NVARCHAR](50) NULL,
[EmailBody] [NVARCHAR](500) NULL,
[EmailSubject] [NVARCHAR](250) NULL,
[Attachment] [NVARCHAR](500) NULL,
[EmailSent] [BIT] NULL CONSTRAINT [DF_EmailNotification_EmailSent]  DEFAULT 
((0)),
[EmailCreateDate] [DATETIME] NULL CONSTRAINT 
[DF_EmailNotification_EmailCreateDate]  DEFAULT (GETDATE()),
[EmailSentDate] [DATETIME] NULL,
CONSTRAINT [PK_EmailNotification] PRIMARY KEY CLUSTERED 
([Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

我创建了一个作业,每 1 分钟执行一次此过程

CREATE PROCEDURE [dbo].[spSendEmail] 
AS
BEGIN
BEGIN TRAN
DECLARE @id BIGINT
DECLARE @max_id BIGINT
DECLARE @query NVARCHAR(1000)
DECLARE @EmailBody NVARCHAR(1000)
DECLARE @EmailAdress NVARCHAR(500)
DECLARE @EmailSubject NVARCHAR(500)
DECLARE @attachments NVARCHAR(1000)

if exists (SELECT * FROM dbo.EmailNotification where EmailSent=0)
begin 
SELECT @id=MIN(id) FROM dbo.EmailNotification where EmailSent=0


SELECT @EmailAdress=EmailAdress,@EmailBody=EmailBody,@EmailSubject=EmailSubject,@attachments=Attachment
FROM EmailNotification WHERE id = @id


exec [msdb].[dbo].[sp_send_dbmail] @profile_name='Notification',
@recipients=@EmailAdress,
@blind_copy_recipients='example.email.com',
@subject=@EmailSubject,
@body=@EmailBody,
@file_attachments=@attachments

end
IF(@@ERROR>0)
BEGIN
ROLLBACK
END
ELSE
BEGIN
UPDATE EmailNotification set EmailSent=1, EmailSentDate=getdate() WHERE Id=@id
COMMIT  
END

最佳答案

您的意思是:spSendEmail 未触发 sp_send_dbmail? sp_send_dbmail 被触发但没有执行任何操作......?

请获取sp_send_dbmail的返回码:
0 => 好的
<> 0 => 发生错误

DECLARE @result int;
DECLARE @ErrorNb int;
EXECUTE @result = exec [msdb].[dbo].[sp_send_dbmail] @profile_name='EDMS email notification',
@recipients=@EmailAdress,
@blind_copy_recipients='example.email.com',
@subject=@EmailSubject,
@body=@EmailBody,
@file_attachments=@attachments
SET @ErrorNb = @@ERROR    

IF @result <> 0
BEGIN
-- Something goes wrong
SELECT @result,@ErrorNb  
END

您还可以使用 TRY :

BEGIN TRY
    EXECUTE exec [msdb].[dbo].[sp_send_dbmail] @profile_name='EDMS email notification',
    @recipients=@EmailAdress,
    @blind_copy_recipients='example.email.com',
    @subject=@EmailSubject,
    @body=@EmailBody,
    @file_attachments=@attachments
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE();
END CATCH

关于sql-server - 使用 sp_send_dbmail() 发送电子邮件有时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46501175/

相关文章:

sql-server - SQL Server 触发器 - 按事务分组

SQL 查询以获取活跃客户列表。活跃的是那些每周至少出现一次的表

sql-server - 在 sql server 2008R2 数据库中查找所有出现的 sp_send_dbmail

sp-send-dbmail - sp_send_dbmail : avoid (n rows affected)

sql-server - SQL Server Linux 公共(public)预览版上的 xp_cmdshell

c# - 将 BIT 值传递给 sql server 存储过程

SQL Server 日期转换

sql - T-SQL 查找带有单独换行符的字符串(缺少回车符)

sql - 获取之前的分数

html - 将 SQL 查询结果表转换为用于电子邮件的 HTML 表