0

編集この件に関する
以前の投稿には、使用されなくなった手順内の特定のトランザクションが含まれており、会社の電子メールアドレスに無効なユーザー名を使用すると、非常に特定の状況でのみエラーが発生するようになりました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>&#13;&#13;<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;
4

0 に答える 0