protected void ExecuteSendMessagePostProcessing(SendMessageData sendMessageData,
                                                        List <TypedCounter <MailingResponseCode> > sendResults, SendMessageTaskData sendMessageTaskData)
        {
            var bulkEmail                     = sendMessageData.BulkEmail;
            var sessionId                     = sendMessageData.SessionId;
            var blankEmailCount               = sendResults.Sum("BlankEmail");
            var doNotUseEmailCount            = sendResults.Sum("DoNotUseEmail");
            var incorrectEmailCount           = sendResults.Sum("IncorrectEmail");
            var unreachableEmailCount         = sendResults.Sum("UnreachableEmail");
            var communicationLimitCount       = sendResults.Sum("CommunicationLimit");
            var duplicateEmailCount           = sendResults.Sum("DuplicateEmail");
            var templateNotFoundCount         = sendResults.Sum("TemplateNotFound");
            var sendersDomainNotVerifiedCount = sendResults.Sum("SendersDomainNotVerified");
            var sendersNameNotValidCount      = sendResults.Sum("SendersNameNotValid");
            var invalidAddresseeCount         = sendResults.Sum("InvalidAddressee");

            if (sendMessageTaskData.IsBreaking)
            {
                SetBulkEmailStatus(bulkEmail.Id, MailingConsts.BulkEmailStatusStoppedId);
                BulkEmailEventLogger.LogInfo(bulkEmail.Id, DateTime.UtcNow, GetLczStringValue("MailingStoppedManually"),
                                             GetLczStringValue("MailingStoppedManuallyDescription"), UserConnection.CurrentUser.ContactId);
                SetInvalidBulkEmailCounters(bulkEmail.Id, invalidAddresseeCount);
                CreateReminding(bulkEmail, "CESStoppedMailingMsg");
                MailingUtilities.Log.InfoFormat("BulkEmail with Id: {0} Was stopped manually.", bulkEmail.Id);
                return;
            }
            BulkEmailQueryHelper.UpdateBulkEmail(bulkEmail.Id, UserConnection,
                                                 new KeyValuePair <string, object>("SendDueDate", DateTime.UtcNow),
                                                 new KeyValuePair <string, object>("BlankEmailCount", blankEmailCount),
                                                 new KeyValuePair <string, object>("DoNotUseEmailCount", doNotUseEmailCount),
                                                 new KeyValuePair <string, object>("IncorrectEmailCount", incorrectEmailCount),
                                                 new KeyValuePair <string, object>("UnreachableEmailCount", unreachableEmailCount),
                                                 new KeyValuePair <string, object>("CommunicationLimitCount", communicationLimitCount),
                                                 new KeyValuePair <string, object>("DuplicateEmailCount", duplicateEmailCount),
                                                 new KeyValuePair <string, object>("TemplateNotFoundCount", templateNotFoundCount),
                                                 new KeyValuePair <string, object>("SendersDomainNotVerifiedCount", sendersDomainNotVerifiedCount),
                                                 new KeyValuePair <string, object>("SendersNameNotValidCount", sendersNameNotValidCount),
                                                 new KeyValuePair <string, object>("InvalidAddresseeCount", invalidAddresseeCount));
            MailingUtilities.Log.InfoFormat(
                "[CESMaillingProvider.ExecuteSendMessage]: Finished: BulkEmail.Id: {0}, SessionId: {1}", bulkEmail.Id,
                sessionId);
            if (sendMessageTaskData.ProcessedGroupsCounter == 0)
            {
                SetBulkEmailStatus(bulkEmail.Id, MailingConsts.BulkEmailStatusErrorId);
                CreateReminding(bulkEmail, "CESNoRecipientsMsg");
                MailingUtilities.Log.InfoFormat("BulkEmail with Id: {0} Has no recipients.", bulkEmail.Id);
            }
        }
        private void ExecuteSendMessageTask(SendMessageData sourceData)
        {
            var bulkEmail           = sourceData.BulkEmail;
            var bulkEmailRId        = sourceData.BulkEmailRId;
            var sessionId           = sourceData.SessionId;
            var culture             = Thread.CurrentThread.CurrentCulture;
            var sendMessageTaskData = new SendMessageTaskData();
            var sendResults         = new List <TypedCounter <MailingResponseCode> >();

            _audienceDataSource.PageNumber = 0;
            while (sendMessageTaskData.HasDataToProceed)
            {
                _audienceDataSource.PageNumber++;
                sendMessageTaskData.BatchId = _audienceDataSource.PageNumber;
                MailingUtilities.Log.InfoFormat(
                    "[CESMaillingProvider.ExecuteSendMessageTask]: Set BatchId - {0}. " +
                    "BulkEmail.Id {1}, Session {2}.", sendMessageTaskData.BatchId, bulkEmail.Id, sessionId);
                var messageData = sourceData.Clone();
                messageData.BulkEmail = sourceData.BulkEmail;
                var email = InitDCEmailMessage(messageData);
                messageData.BatchId     = sendMessageTaskData.BatchId;
                messageData.BatchLength = MassMailingRecipientsLimit;
                List <IMessageRecipientInfo> recipients;
                var nextBatchLength = 0;
                try {
                    email.InitRecipientVariable();
                    var startGetRecipientTime = DateTime.UtcNow;
                    recipients = GetRecipients();
                    RecipientsValidator.Validate(recipients);
                    LogRecipientState(recipients, messageData.BulkEmail.Id, messageData.BatchId, startGetRecipientTime);
                    var validRecipients       = GetValidRecipient(recipients);
                    var recipientEmailAddress = CreateEmailAddresses(validRecipients);
                    email.to        = recipientEmailAddress;
                    nextBatchLength = recipients.Count;
                    MailingUtilities.Log.InfoFormat(
                        "[CESMaillingProvider.ExecuteSendMessageTask]: Prepared {0} " +
                        "recipients. BulkEmail.Id {1}, BatchId {2}, SessionId: {3}", nextBatchLength, bulkEmail.Id,
                        sendMessageTaskData.BatchId, sessionId);
                } catch (SqlException e) {
                    MailingUtilities.Log.ErrorFormat(
                        "[CESMaillingProvider.GetRecipients]: Group processing fails. BulkEmailRId: {0}, " +
                        "SessionId: {1}. GroupId: {2}.", e, messageData.BulkEmailRId, messageData.SessionId,
                        messageData.BatchId);
                    BulkEmailEventLogger.LogError(messageData.BulkEmail.Id, DateTime.UtcNow,
                                                  GetLczStringValue("AudienceAddEvent"), e, GetLczStringValue("BatchProcessingErrorMsg"),
                                                  UserConnection.CurrentUser.ContactId, messageData.BatchId);
                    sendMessageTaskData.RetryMessageProcessing();
                    if (!sendMessageTaskData.HasDataToProceed)
                    {
                        MailingUtilities.Log.InfoFormat(
                            "[CESMaillingProvider.ExecuteSendMessage]: Terminated. Failed groups limit reached. " +
                            "BulkEmail.Id: {0}, SessionId: {1}", bulkEmailRId, sessionId);
                    }
                    continue;
                } catch (Exception exception) {
                    MailingUtilities.Log.ErrorFormat(
                        "[CESMaillingProvider.GetRecipients]: Group processing fails. BulkEmailRId: {0}, " +
                        "SessionId: {1}. GroupId: {2}.", exception, messageData.BulkEmailRId, messageData.SessionId,
                        messageData.BatchId);
                    BulkEmailEventLogger.LogError(messageData.BulkEmail.Id, DateTime.UtcNow,
                                                  GetLczStringValue("AudienceAddEvent"), exception, GetLczStringValue("BatchProcessingErrorMsg"),
                                                  UserConnection.CurrentUser.ContactId, messageData.BatchId);
                    throw;
                }
                sendMessageTaskData.LastFailedGroupId = 0;
                sendMessageTaskData.CheckMessageCanProceed(nextBatchLength);
                BulkEmailQueryHelper.ResetBulkEmailCounters(sourceData.BulkEmailRId, UserConnection);
                if (sendMessageTaskData.HasDataToProceed)
                {
                    messageData.MailingStartTS = GetMailingStartTs(bulkEmail);
                    MailingUtilities.Log.InfoFormat(
                        "[CESMaillingProvider.ExecuteSendMessageTask]: Has data to " +
                        "proceed and start new thread. BulkEmail.Id {0}, BatchId {1}, SessionId: {2}", bulkEmail.Id,
                        sendMessageTaskData.BatchId, sessionId);
                    try {
                        Thread.CurrentThread.CurrentCulture = culture;
                        var resultsCounter = CreateResultsCounter();
                        messageData.EmailMessage = email;
                        var sentResult = true;
                        if (email.to.Any())
                        {
                            sentResult = SendBatch(messageData);
                        }
                        if (!sentResult)
                        {
                            recipients.Where(x => x.InitialResponseCode == (int)BulkEmailResponseCode.Sent).ForEach(y =>
                                                                                                                    y.InitialResponseCode = (int)MailingResponseCode.RequestFailed);
                        }
                        UpdateSendEmailIterationResult(messageData, recipients, resultsCounter);
                        sendResults.Add(resultsCounter);
                    } catch (Exception e) {
                        MailingUtilities.Log.ErrorFormat(
                            "[CESMaillingProvider.ExecuteSendMessageTask]: Error occurs when sends batch." +
                            " BulkEmailRId: {0}, SessionId: {1}. GroupId: {2}.", e, messageData.BulkEmailRId,
                            messageData.SessionId, messageData.BatchId);
                    }
                }
                else
                {
                    MailingUtilities.Log.InfoFormat(
                        "[CESMaillingProvider.ExecuteSendMessageTask]: Has no data to " +
                        "proceed and BatchSendThreadPool released. BulkEmail.Id {0}, BatchId {1}, SessionId: {2}",
                        bulkEmail.Id, sendMessageTaskData.BatchId, sessionId);
                }
            }
            ExecuteSendMessagePostProcessing(sourceData, sendResults, sendMessageTaskData);
        }