編集この件に関する
以前の投稿には、使用されなくなった手順内の特定のトランザクションが含まれており、会社の電子メールアドレスに無効なユーザー名を使用すると、非常に特定の状況でのみエラーが発生するようになりましたbadname@ourcompany.co.uk
エージェントはストアド プロシージャを 10 分ごとに実行して、電子メールを送信します。新しいレコードが見つかった場合は、メールを送信します。
いくつかの奇妙な動作に気付きました。TO
フィールドは正しいが、BCC
が無効な電子メール アドレスであり、有効な会社のドメイン名 (例: rubbishPart@ourcompany.co.uk
) を使用している場合、ストアド プロシージャは に 2 つの電子メールを送信しますTO
。この動作を行うには、ドメイン名が当社のドメイン名である必要があります ...ドメインを変更すると、gmail.com
メールが 1 つしか送信されません。
- なぜこうなった?
- この動作を変更するにはどうすればよいですか?
Catch
この手順は冗長ですか?
手順は次のとおりです。
BEGIN TRY
DECLARE @Exit TINYINT = 0
WHILE @Exit = 0
BEGIN
DECLARE @MailIdFound INT =
(
SELECT CASE
WHEN MIN(EmailId) IS NULL THEN 0
ELSE MIN(EmailId)
END
FROM WH.dbo.EmailQueue
WHERE DateEmailKey IS NULL
)
IF @MailIdFound = 0
BEGIN SET @Exit = 1 END --exit here as
ELSE
BEGIN --send the mail here
DECLARE @DateEmailKey INT
DECLARE @EmailBCC NVARCHAR(1000)
DECLARE @EmailTO NVARCHAR(1000)
DECLARE @EmailCC NVARCHAR(1000)
DECLARE @EmailBody NVARCHAR(MAX)
DECLARE @EmailImportance VARCHAR(6)
DECLARE @EmailSubject NVARCHAR(1000);
WITH myMostUrgentMail_cte
AS
(
SELECT TOP 1
DateEmailKey,
EmailBCC,
EmailTO,
EmailCC,
EmailBody,
EmailImportance,
EmailSubject
FROM WH.dbo.EmailQueue
WHERE EmailId = @MailIdFound
)
SELECT @DateEmailKey = DateEmailKey,
@EmailTO = EmailTO,
@EmailCC = EmailCC,
@EmailBCC = EmailBCC,
@EmailBody = EmailBody,
@EmailSubject = EmailSubject
FROM myMostUrgentMail_cte;
SET @EmailBody = @EmailBody + '<html> <span style=''font-size:11.0pt;font-family:"Calibri","sans-serif"; color:black''><p><b>blah blah</b></p></span></html>'
EXEC msdb..sp_send_dbmail
@recipients = @EmailTO,
@copy_recipients = @EmailCC,
@blind_copy_recipients = @EmailBCC,
@subject = @EmailSubject,
@Importance = @EmailImportance,
@body_format = 'html',
@body = @EmailBody
UPDATE x
SET x.DateEmailKey = (CONVERT(CHAR(8),GETDATE(),(112))),
x.DateEmailTime = (CONVERT([time](7),left(CONVERT([char](12),GETDATE(),(114)),(8)),(0)))
FROM WH.dbo.EmailQueue x
WHERE x.EmailId = @MailIdFound
END
END
END TRY
BEGIN CATCH
-- handle error here
EXEC msdb..sp_send_dbmail
@recipients = 'ME@ME.com;'
, @subject = 'ERROR OCCURED DURING EMAIL CREATION'
, @body_format = 'html'
, @body = 'ERROR OCCURED'
UPDATE x
SET x.ErrorOccured = 1
FROM WH.dbo.EmailQueue x
WHERE x.EmailId = @MailIdFound
END CATCH;