spBulkUpdate_EmailJob_Recipient
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@XML | ntext | IN |
Definition
Copy
CREATE procedure dbo.SPBULKUPDATE_EMAILJOB_RECIPIENT
(
@XML as ntext = null
)
as
begin
set nocount on
begin transaction
declare @temp table (
SIGNATUREID int,
CATEGORY int,
DATEPROCESSED datetime,
DSNBRIEFING ntext,
CLIENTEMAILJOBRECIPIENTGUID uniqueidentifier,
HARDBOUNCE int,
SOFTBOUNCE int,
SPAMCOMPLAINT int,
EMAILADDRESS nvarchar(255),
LISTUNSUBSCRIBE int
)
declare @CONTINUE bit
set @CONTINUE = 0
declare @IDOC int
exec sp_xml_preparedocument @IDOC output, @XML
insert into @TEMP(SIGNATUREID,CATEGORY, DATEPROCESSED,DSNBRIEFING,CLIENTEMAILJOBRECIPIENTGUID,HARDBOUNCE,SOFTBOUNCE,SPAMCOMPLAINT,EMAILADDRESS,LISTUNSUBSCRIBE)
select
SignatureID,
case when len(BounceCode) >0 then
case when SpamComplaint = 1 or isnull(BounceCode,0) in (108, 109) then
BounceCode
else
left(BounceCode, 1)
end
else null
end as Category,
convert(datetime, left(DateProcessed,23),126),
BounceMessage,
case when try_cast(ClientRecipientIdentifier as uniqueidentifier) is not null -- sometimes we received text inn this field.
then cast(ClientRecipientIdentifier as uniqueidentifier)
else cast(cast(0 as binary) as uniqueidentifier) end,
HardBounce,
SoftBounce,
SpamComplaint,
EmailAddress,
ListUnsubscribe
from openxml (@idoc, '/NewDataSet/RecipientDSN', 2) -- Updated as per new response from service
with (
SignatureID int,
BounceCode int,
DateProcessed nvarchar(66),
BounceMessage ntext, -- The label value is changed
ClientRecipientIdentifier nvarchar(100) , -- The label value is changed
HardBounce int,
SoftBounce int,
SpamComplaint int,
EmailAddress nvarchar(255),
ListUnsubscribe int
) as d
if @@rowcount > 0
set @CONTINUE = 1
exec sp_xml_removedocument @IDOC
if @CONTINUE = 1
begin
--handling list unsubscribe case ,mark that email unsubscribe if its listunsubscribe=1
update [dbo].EMAILJOB_RECIPIENT
set
[UPDATEDATE]=getutcdate(),
UNSUBSCRIBED=1
from [dbo].EMAILJOB_RECIPIENT as EJR
inner join @Temp as tmpDta
on EJR.MERGEID = tmpDta.CLIENTEMAILJOBRECIPIENTGUID
and tmpDta.LISTUNSUBSCRIBE =1
--make that email unsubscribe by mark as Global optout
declare @ListUnsubscribeCursor CURSOR,
@EmailAddress nvarchar(255),
@Email nvarchar(255),
@DATE date =GETDATE(),
@SENDMAIL bit
begin
set @ListUnsubscribeCursor = CURSOR local FORWARD_ONLY FOR
select EMAILADDRESS
from @Temp as tmpData
where tmpData.LISTUNSUBSCRIBE =1
open @ListUnsubscribeCursor
fetch next from @ListUnsubscribeCursor
into @Email
while @@FETCH_STATUS = 0
begin
exec dbo.USP_ADD_GLOBALOPTOUTPREFERENCEADD_LISTUNSUBSCRIBE @EMAILADDRESS=@Email,@SENDMAIL=0,@STARTDATE=@Date
fetch next from @ListUnsubscribeCursor
into @Email
end;
close @ListUnsubscribeCursor ;
DEALLOCATE @ListUnsubscribeCursor;
end;
--handling soft bounce case, mark that email address as soft bounce which have softbounce =1
update [dbo].EMAILJOB_RECIPIENT
set
[UPDATEDATE]=getutcdate(),
[DSNED]= 1,
[RECENTDSNDATE]=DATEPROCESSED,
[RECENTDSNSIGNATUREID] = SIGNATUREID,
[RECENTDSNCATEGORY] = case when CATEGORY =2 then 1 else CATEGORY end, -- This is fine as all category except 2 are soft bounce as per BBIS code for email report
[STATUSREPORT] = DSNBRIEFING
from [dbo].EMAILJOB_RECIPIENT as R
inner join @Temp as D
on R.MERGEID = D.CLIENTEMAILJOBRECIPIENTGUID
and R.OPENED = 0
and D.SOFTBOUNCE =1
update [dbo].EMAILJOB_RECIPIENT
set
[UPDATEDATE]=getutcdate(),
[DSNED]= 1,
[RECENTDSNDATE]=DATEPROCESSED,
[RECENTDSNSIGNATUREID] = SIGNATUREID,
[RECENTDSNCATEGORY] = CATEGORY,
[STATUSREPORT] = DSNBRIEFING
from [dbo].EMAILJOB_RECIPIENT as R
inner join @Temp as D
on R.MERGEID = D.CLIENTEMAILJOBRECIPIENTGUID
AND D.CATEGORY = 0
--handling hard bounce case, mark that email address as hard bounce which have hardbounce =1
update [dbo].EMAILJOB_RECIPIENT
SET
[UPDATEDATE]=getutcdate(),
[DSNED]= 1,
[RECENTDSNDATE]=DATEPROCESSED,
[RECENTDSNSIGNATUREID] = SIGNATUREID,
[RECENTDSNCATEGORY] = case when D.SPAMCOMPLAINT =1 then 112 when CATEGORY in (108,109) then CATEGORY else 2 end, --spam complaint its value is 112, for previously marked as hard bounce it is 108 for previously marked as spamcomplaint it is 109. Only for spam, previously Marked as spam complaint and previously marked as hard bounce we are using 3 digits.
[STATUSREPORT] = DSNBRIEFING
from [dbo].EMAILJOB_RECIPIENT as R
inner join @Temp as D
on R.MERGEID = D.CLIENTEMAILJOBRECIPIENTGUID
and (D.HARDBOUNCE =1 or D.SPAMCOMPLAINT =1)
--Hard bounce should be mark as Invalid Account Recipients
insert into EMAILINVALIDACCOUNTRECIPIENT(EMAILADDRESS, EMAILJOBRECIPIENTID, CREATEDATE, UPDATEDATE, SPAM)
select R.EMAILADDRESS, R.ID, D.DATEPROCESSED, D.DATEPROCESSED, D.SPAMCOMPLAINT
from [dbo].EMAILJOB_RECIPIENT as R
inner join @Temp AS D
on R.MERGEID = D.CLIENTEMAILJOBRECIPIENTGUID
and (D.HARDBOUNCE =1 or D.SPAMCOMPLAINT =1)
update EMAIL_RECIPIENT
set INVALIDACCOUNT = 1
from EMAIL_RECIPIENT ER
inner join EMAILJOB_RECIPIENT EJR on EJR.EMAILRECIPIENTID = ER.ID
inner join @Temp D on D.CLIENTEMAILJOBRECIPIENTGUID = EJR.MERGEID and D.CATEGORY = 6
update EMAILJOB
set NUMBERINVALIDACCOUNT = NUMBERINVALIDACCOUNT + X.ADDITIONALINVALIDACCOUNTS
from EMAILJOB EJ
inner join (
select EJR.EMAILJOBID EMAILJOBID, count(*) ADDITIONALINVALIDACCOUNTS
from @Temp D
inner join EMAILJOB_RECIPIENT EJR on D.CLIENTEMAILJOBRECIPIENTGUID = EJR.MERGEID and D.CATEGORY = 6
group by EJR.EMAILJOBID
) X on X.EMAILJOBID = EJ.ID
delete from EMAILJOB_RECIPIENT
where MERGEID in (
select CLIENTEMAILJOBRECIPIENTGUID from @Temp where CATEGORY = 6
)
declare @UPDATEDATE datetime
select @UPDATEDATE = max(DATEPROCESSED)
from @Temp
update [dbo].[SERVERSTATUS]
set UPDATEDATE = @UPDATEDATE
where ID = 2
if @@rowcount = 0
insert into dbo.SERVERSTATUS(ID, UPDATEDATE) values (2, @UPDATEDATE)
end
commit
end