Отправка электронной почты с помощью 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]

И я создал задание, которое выполняет эту процедуру каждую минуту.

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

person Nurlan    schedule 30.09.2017    source источник
comment
Не работает. Вы имеете в виду, что они не получают письмо? Сначала измените свой код, обратите внимание на возвращаемое значение, как указано ниже. Затем проверьте журналы SQL, чтобы узнать, упоминается ли какая-либо ошибка.   -  person Nick.McDermaid    schedule 30.09.2017


Ответы (1)


Что вы имеете в виду: spSendEmail не запускает sp_send_dbmail? sp_send_dbmail запускается, но ничего не делает....?

Получите код возврата sp_send_dbmail :
0 => OK
‹> 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
person Stéphane CLEMENT    schedule 30.09.2017
comment
Клементакис, спасибо за ответ. Попробую то, что вы предлагаете. - person Nurlan; 30.09.2017
comment
Вы узнали свою проблему? Надеюсь на это ^^ - person Stéphane CLEMENT; 30.09.2017
comment
Проблема заключалась в том, что иногда превышался максимальный размер вложения :)) - person Nurlan; 30.09.2017
comment
Хорошо, это значение можно изменить... Спокойной ночи ^^ - person Stéphane CLEMENT; 30.09.2017
comment
Привет, Клементакис. У меня снова проблема с отправкой электронной почты. Когда я вижу историю просмотра задания, были некоторые ошибки с сообщением об ошибке Id 22051 Ошибка вложения. Но я выполняю запрос вручную, он работал, а затем задание начало работать правильно. - person Nurlan; 02.10.2017
comment
Службы SQL Server должны иметь права на доступ к папке, в которую вы поместили вложенные файлы. Обратите внимание, что службы должны иметь права на полный путь к файлу и на сам файл. - person Stéphane CLEMENT; 02.10.2017
comment
Используйте SELECT * FROM sys.dm_server_services, чтобы узнать, какой пользователь используется для служб. затем вы должны увидеть, частью какой группы является этот пользователь ... И затем посмотрите на окна справа от каждого подкаталога в пути к файлу. - person Stéphane CLEMENT; 02.10.2017
comment
Привет, Клементаки. Я пробую ваш оператор select, он показал мне, что учетная запись службы .\sqldb, и я собираюсь добавить этого пользователя в папки и подпапки, из которых я хочу прикрепить файл, но Windows не позволяет мне выбрать этого пользователя - person Nurlan; 03.10.2017
comment
Windows выходит за рамки моих знаний: извините. Может быть, вы могли бы задать другой вопрос по этой отдельной проблеме... - person Stéphane CLEMENT; 03.10.2017