USP_EMAIL_UPDATEEXTERNALSTATUS

Updates the General Purpose and Transaction Email Statuses with status data returned by the external email service.

Parameters

Parameter Parameter Type Mode Description
@STATUSDATA nvarchar(max) IN

Definition

Copy


            CREATE procedure dbo.USP_EMAIL_UPDATEEXTERNALSTATUS
            (
                @STATUSDATA nvarchar(max)
            )
            as
            begin

                declare @STATUSTABLE table
                (
                    EXTERNALJOBID uniqueidentifier,
                    STATUS integer,
                    DATEMODIFIED datetime,
                    ACTUALSENT integer,
                    REQUESTEDSENT integer,
                    EXTERNALSERVICESTATUS integer
                );

         declare @INVALIDACCOUNTSTAMPSHAREDSERVICEDATA table 
         (
            DATEPROCESSED datetime,
            BOUNCEMESSAGE nvarchar(max),
            EMAILADDRESS nvarchar(max),
            HARDBOUNCE integer,
            SOFTBOUNCE integer,
            BOUNCECODE nvarchar(10),
            BOUNCECODEDESCRIPTION nvarchar(100),
            SPAMCOMPLAINT integer
         );

                declare @INVALIDACCOUNTSTEMP table
                (
                    EMAILADDRESS nvarchar(255),
                    BOUNCEMESSAGE nvarchar(max),
                    DATEPROCESSED datetime,
                    CATEGORY integer
                );

                declare @INVALIDACCOUNTS table
                (
                    EMAILADDRESS nvarchar(255),
                    BOUNCEMESSAGE nvarchar(max),
                    DATEPROCESSED datetime,
                    CATEGORY integer
                );

                declare @IDOC int;
                declare @ISSHAREDSERVICESDATA bit=0;

                exec sp_xml_preparedocument @IDOC output, @STATUSDATA;

                insert into 
                    @STATUSTABLE (EXTERNALJOBID, STATUS, DATEMODIFIED, ACTUALSENT, REQUESTEDSENT, EXTERNALSERVICESTATUS)
                select 
                    ExternalJobIdentifier, 
                    dbo.UFN_GET_CONVERTEDEXTERNALSERVICESTATUS(JobStatus), 
                    convert(datetime,
                        case 
                            when (substring(DateModified,23,1)='-') then left(DateModified,22)+'0' 
                            when (substring(DateModified,22,1)='-') then left(DateModified,21)+'00' 
                            else left(DateModified,23) end,127), 
                    ActualSent, 
                    RequestedSent, 
                    JobStatus 
                from 
                    openxml(@IDOC, '/Emails/ArrayOfEmailJobStatusData/EmailJobStatusData', 2)
                    with
                    (
                        ExternalJobIdentifier uniqueidentifier,
                        JobStatus integer,
                        DateModified char(33),
                        ActualSent integer,
                        RequestedSent integer
                    );

                insert into @INVALIDACCOUNTSTEMP (EMAILADDRESS, BOUNCEMESSAGE, DATEPROCESSED, CATEGORY)
                select 
                    EmailAddress, 
                    ResponseMessage, 
                    convert(datetime, left(DateProcessed,23),127), 
                    ResponseCategory
                from 
                    openxml(@IDOC, '/Emails/ArrayOfEmailRecipientStatusData/EmailRecipientStatusData', 2
                    with
                    (
                        EmailAddress nvarchar(255),
                        ResponseMessage nvarchar(max),
                        DateProcessed nvarchar(66),
                        ResponseCategory integer
                    );


             insert into @INVALIDACCOUNTSTAMPSHAREDSERVICEDATA
                  (DATEPROCESSED,BOUNCEMESSAGE,EMAILADDRESS,HARDBOUNCE,SOFTBOUNCE,BOUNCECODE,BOUNCECODEDESCRIPTION,SPAMCOMPLAINT)

                  select     
                  convert(datetime, left(DATEPROCESSED,23),127),
                  BOUNCEMESSAGE,
                  EMAILADDRESS,
                  HARDBOUNCE,
                  SOFTBOUNCE,
                  BOUNCECODE, 
                  BOUNCECODEDESCRIPTION,
                  SPAMCOMPLAINT
                  from 
                openxml(@IDOC, '/Emails/ArrayOfUnsentEmailRecipientStatusData/UnsentEmailRecipientStatusData', 2)
                with
                (
                    DateProcessed nvarchar(30),
                    BounceMessage nvarchar(max),
                    EmailAddress nvarchar(max),
                    HardBounce integer,
                    SoftBounce integer,
                    BounceCode nvarchar(10),
                    BounceCodeDescription nvarchar(100),
                    SpamComplaint integer
                );

                if exists (select 1 from @INVALIDACCOUNTSTAMPSHAREDSERVICEDATA where len(Emailaddress)>0)
                begin
                set @ISSHAREDSERVICESDATA =1;
                end 

        exec sp_xml_removedocument @IDOC;        

                if @ISSHAREDSERVICESDATA =1
                begin

                --Spam complaint code will be 112 and we are using 3 digit code only for spam complaint

                --An email address can be either spam complaint or can be hard bounce only at a time.

        insert into @INVALIDACCOUNTS (EMAILADDRESS, BOUNCEMESSAGE, DATEPROCESSED, CATEGORY)
                select distinct 
                    EMAILADDRESS, 
                    BOUNCEMESSAGE, 
                    DATEPROCESSED, 
                    case
                        when O.HARDBOUNCE = 1 then 2
                        when O.SPAMCOMPLAINT = 1 then 112
                        else 
                            case when len(O.BOUNCECODE) >0 then left(O.BOUNCECODE, 1
                                else null 
                            end 
                    end 
                from 
                    @INVALIDACCOUNTSTAMPSHAREDSERVICEDATA O
                group by 
                    EMAILADDRESS, 
                    BOUNCEMESSAGE, 
                    DATEPROCESSED, 
                    BOUNCECODE,
                    HARDBOUNCE,
                    SPAMCOMPLAINT
                having 
                    O.DATEPROCESSED = (select MAX(DATEPROCESSED) from @INVALIDACCOUNTSTAMPSHAREDSERVICEDATA O1 where O.EMAILADDRESS = O1.EMAILADDRESS)
                    and O.BOUNCEMESSAGE = (select top 1 BOUNCEMESSAGE from @INVALIDACCOUNTSTAMPSHAREDSERVICEDATA O2 where O.EMAILADDRESS = O2.EMAILADDRESS order by O2.DATEPROCESSED desc)
                    and O.BounceCode = (select top 1 BounceCode  from @INVALIDACCOUNTSTAMPSHAREDSERVICEDATA O3 where O.EMAILADDRESS = O3.EMAILADDRESS order by O3.DATEPROCESSED desc);

        end
                else
                begin

        insert into @INVALIDACCOUNTS (EMAILADDRESS, BOUNCEMESSAGE, DATEPROCESSED, CATEGORY)
                select distinct 
                    EMAILADDRESS, 
                    BOUNCEMESSAGE, 
                    DATEPROCESSED, 
                    CATEGORY 
                from 
                    @INVALIDACCOUNTSTEMP O
                group by 
                    EMAILADDRESS, 
                    BOUNCEMESSAGE, 
                    DATEPROCESSED, 
                    CATEGORY
                having 
                    O.DATEPROCESSED = (select MAX(DATEPROCESSED) from @INVALIDACCOUNTSTEMP O1 where O.EMAILADDRESS = O1.EMAILADDRESS)
                    and O.BOUNCEMESSAGE = (select top 1 BOUNCEMESSAGE from @INVALIDACCOUNTSTEMP O2 where O.EMAILADDRESS = O2.EMAILADDRESS order by O2.DATEPROCESSED desc)
                    and O.CATEGORY = (select top 1 CATEGORY from @INVALIDACCOUNTSTEMP O3 where O.EMAILADDRESS = O3.EMAILADDRESS order by O3.DATEPROCESSED desc);

        end

                -- EMAIL JOB STATUS PROCESSING          

                update 
                    S 
                set 
                    [STATUS] = T.[STATUS],
                    ACTUALSENT = T.ACTUALSENT, 
                    REQUESTEDSENT = T.REQUESTEDSENT, 
                    S.SERVERMODIFIEDDATE = T.DATEMODIFIED, 
                    S.EXTERNALSERVICESTATUS = T.EXTERNALSERVICESTATUS 
                from 
                    dbo.EMAILSTATUSTRANSACTIONAL S
                inner join 
                    @STATUSTABLE T on S.EXTERNALJOBIDENTITY = T.EXTERNALJOBID;

                -- Only update status if email job was not deleted or if it was marked as deleted, but already sent to the external mail server  

                update 
                    S 
                set 
                    [STATUS] = T.[STATUS], 
                    ACTUALSENT = T.ACTUALSENT, 
                    REQUESTEDSENT = T.REQUESTEDSENT, 
                    S.SERVERMODIFIEDDATE = T.DATEMODIFIED, 
                    S.EXTERNALSERVICESTATUS = T.EXTERNALSERVICESTATUS 
                from 
                    dbo.EMAILSTATUSGENERALPURPOSE S
                inner join 
                    @STATUSTABLE T on S.EXTERNALJOBIDENTITY = T.EXTERNALJOBID
                where 
                    (S.[STATUS] <> 18 or T.[STATUS] <> 10);

                declare @UPDATEDATE datetime;          
                select 
                    @UPDATEDATE = max(DATEMODIFIED)
                from 
                    @STATUSTABLE;

                -- cant be sure this exists.

                if @UPDATEDATE is not null
                begin
                    if exists(select * from dbo.EMAILEXTERNALSERVERSTATUS where STATUSTYPE='EMAILJOB')
                    begin
                        update dbo.EMAILEXTERNALSERVERSTATUS 
                        set UPDATEDATE = @UPDATEDATE
                        where STATUSTYPE='EMAILJOB';
                    end
                else
                    begin
                        insert into dbo.EMAILEXTERNALSERVERSTATUS (STATUSTYPE, UPDATEDATE)
                        values ('EMAILJOB', @UPDATEDATE);
                    end
                end            

                -- INVALID ACCOUNT PROCESSING  


                declare @CHANGEAGENTID uniqueidentifier;
                exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

                merge into 
                    dbo.EMAILINVALIDRECIPIENT I
                using 
                    @INVALIDACCOUNTS A on I.ADDRESS = A.EMAILADDRESS
                when matched and (A.CATEGORY = 2 or A.CATEGORY = 6 or A.CATEGORY =112) then
                    update set I.FAILEDATTEMPTS = I.FAILEDATTEMPTS + 1, I.FAILEDMESSAGE = A.BOUNCEMESSAGE, CHANGEDBYID = @CHANGEAGENTID, I.DATEPROCESSED = A.DATEPROCESSED, I.ISBLACKLISTED = 1, I.CATEGORY = A.CATEGORY
                when not matched and A.EMAILADDRESS is not null and (A.CATEGORY = 2 or A.CATEGORY = 6 or A.CATEGORY =112) then
                    insert (ADDRESS, FAILEDATTEMPTS, FAILEDMESSAGE, ADDEDBYID, CHANGEDBYID, DATEPROCESSED, CATEGORY)
                    values (A.EMAILADDRESS, 1, A.BOUNCEMESSAGE, @CHANGEAGENTID, @CHANGEAGENTID, A.DATEPROCESSED, A.CATEGORY);


                select 
                    @UPDATEDATE = max(DATEPROCESSED)
                from 
                    @INVALIDACCOUNTS;

                -- cant be sure this exists.

                if @UPDATEDATE is not null
                begin
                if exists(select * from dbo.EMAILEXTERNALSERVERSTATUS where STATUSTYPE = 'EMAILRECIPIENT')
                    begin
                        update dbo.EMAILEXTERNALSERVERSTATUS 
                        set UPDATEDATE = @UPDATEDATE
                        where STATUSTYPE = 'EMAILRECIPIENT';
                    end
                else
                    begin
                        insert into dbo.EMAILEXTERNALSERVERSTATUS (STATUSTYPE, UPDATEDATE)
                        values ('EMAILRECIPIENT', @UPDATEDATE);
                    end
                end
            end