private bool SendBatch(SendMessageData messageData)
        {
            MailingUtilities.Log.InfoFormat("[CESMaillingProvider.SendBatch]: Start: BulkEmailId: {0}. GroupId {1}.",
                                            messageData.BulkEmail.Id, messageData.BatchId);
            var sendResult = false;

            try {
                var startSendingTime = DateTime.UtcNow;
                Utilities.RetryOnFailure(() => ServiceApi.SendTemplate(messageData.EmailMessage,
                                                                       messageData.TemplateName, null, messageData.BulkEmail.Id));
                sendResult = true;
                BulkEmailEventLogger.LogInfo(messageData.BulkEmail.Id, startSendingTime,
                                             GetLczStringValue("SentBatchStatus"), GetLczStringValue("SentBatchStatusDescription"),
                                             UserConnection.CurrentUser.ContactId, messageData.BatchId);
            } catch (Exception e) {
                MailingUtilities.Log.ErrorFormat(
                    "[CESMaillingProvider.SendBatch]: Error while sending BulkEmail with Id: {0}. " +
                    "SessionId: {1}. GroupId {2}.", e, messageData.BulkEmail.Id, messageData.SessionId,
                    messageData.BatchId);
                BulkEmailEventLogger.LogError(messageData.BulkEmail.Id, DateTime.UtcNow,
                                              GetLczStringValue("BatchSendEvent"), e, GetLczStringValue("BatchSendErrorMsg"),
                                              UserConnection.CurrentUser.ContactId, messageData.BulkEmail);
                sendResult = false;
            }
            return(sendResult);
        }
        private void LogRecipientState(List <IMessageRecipientInfo> recipients, Guid bulkEmailId, int batchId,
                                       DateTime startDate)
        {
            if (!recipients.Any())
            {
                return;
            }
            var validCount          = recipients.Count(x => x.InitialResponseCode == (int)MailingResponseCode.PostedProvider);
            var incorrectEmailCount = recipients.Count(x =>
                                                       x.InitialResponseCode == (int)MailingResponseCode.CanceledIncorrectEmail);
            var blankEmailCount =
                recipients.Count(x => x.InitialResponseCode == (int)MailingResponseCode.CanceledBlankEmail);
            var invalidEmailCount =
                recipients.Count(x => x.InitialResponseCode == (int)MailingResponseCode.CanceledInvalidEmail);
            var unsubCount      = recipients.Count(x => x.InitialResponseCode == (int)MailingResponseCode.Unsub);
            var duplicatedCount = recipients.Count(x => x.InitialResponseCode == (int)MailingResponseCode.Duplicated);
            var noTemplateCount = recipients.Count(x =>
                                                   x.InitialResponseCode == (int)MailingResponseCode.CanceledTemplateNotFound);
            var senderDomainNotVerifiedCount = recipients.Count(x =>
                                                                x.InitialResponseCode == (int)MailingResponseCode.CanceledSendersDomainNotVerified);
            var senderNameNotValidCount = recipients.Count(x =>
                                                           x.InitialResponseCode == (int)MailingResponseCode.CanceledSendersNameNotValid);

            BulkEmailEventLogger.LogInfo(bulkEmailId, startDate, GetLczStringValue("PrepareBatch"),
                                         GetLczStringValue("PrepareBatchDescription"), UserConnection.CurrentUser.ContactId, batchId,
                                         recipients.Count, validCount, incorrectEmailCount, blankEmailCount, invalidEmailCount, unsubCount,
                                         duplicatedCount, noTemplateCount, senderDomainNotVerifiedCount, senderNameNotValidCount);
        }
Пример #3
0
 public override void Initialize()
 {
     base.Initialize();
     UserConnection       = Context.UserConnection;
     ServiceApi           = Context.ServiceApi;
     BulkEmailEventLogger = new BulkEmailEventLogger(UserConnection);
 }
 public override void Initialize()
 {
     base.Initialize();
     UserConnection            = Context.UserConnection;
     TemplateRepository        = new DCTemplateRepository <DCTemplateModel>(UserConnection);
     TemplateFactory           = new CESMailingTemplateFactory();
     ServiceApi                = Context.ServiceApi;
     Validator                 = new BulkEmailValidator(UserConnection, ServiceApi);
     BulkEmailEventLogger      = new BulkEmailEventLogger(UserConnection);
     AudienceDataSourceFactory = new BulkEmailAudienceDataSourceFactory();
     BulkEmailMacroParser      = GetMacroParser();
 }
        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);
            }
        }
        public override void Initialize()
        {
            base.Initialize();
            UserConnection            = Context.UserConnection;
            TemplateRepository        = new DCTemplateRepository <DCTemplateModel>(UserConnection);
            TemplateFactory           = new CESMailingTemplateFactory();
            ServiceApi                = Context.ServiceApi;
            Validator                 = new BulkEmailValidator(UserConnection, ServiceApi);
            BulkEmailEventLogger      = new BulkEmailEventLogger(UserConnection);
            AudienceDataSourceFactory = new BulkEmailAudienceDataSourceFactory();
            BulkEmailMacroParser      = GetMacroParser();
            InitializeAudienceDataSource(Context.BulkEmailEntity.PrimaryColumnValue);
            var validationBuilder = new BulkEmailRecipientValidatorBuilder(ServiceApi);

            RecipientsValidator = new BulkEmailRecipientValidator(validationBuilder);
        }
        private bool PingProvider(Guid emailId)
        {
            var startPingTime = DateTime.UtcNow;

            try {
                object pingResult;
                var    result = Utilities.TryExecute(ServiceApi.Ping, MailingServicePingAttemptsCount,
                                                     MailingServicePingTimeout, out pingResult);
                BulkEmailEventLogger.LogInfo(emailId, startPingTime, GetLczStringValue("PingCes"),
                                             GetLczStringValue("PingCesDescription"), UserConnection.CurrentUser.ContactId);
                return(result);
            } catch (Exception e) {
                BulkEmailEventLogger.LogError(emailId, startPingTime, GetLczStringValue("PingCes"), e,
                                              GetLczStringValue("PingCesDescription"), UserConnection.CurrentUser.ContactId);
                return(false);
            }
        }
Пример #8
0
        public override MailingResponse ExecuteState()
        {
            var response = new MailingResponse {
                Success  = false,
                StatusId = MailingConsts.BulkEmailStatusErrorId
            };
            var bulkEmailId = Context.BulkEmailEntity.PrimaryColumnValue;

            if (!ValidateBulkEmail(Context.BulkEmailEntity))
            {
                return(response);
            }
            var validationResult = ActiveContactsHelper.ValidatePermissionEditBulkEmail(UserConnection);

            if (validationResult.Code == ActiveContactsValidationResult.Error)
            {
                MailingUtilities.Log.ErrorFormat(
                    "[CESMaillingProvider.ExecuteSendMessage]: License check failed. SessionId: {0}.",
                    Context.SessionId);
                BulkEmailEventLogger.LogError(bulkEmailId, DateTime.UtcNow, GetLczStringValue("BatchSendEvent"),
                                              GetLczStringValue("LicenceErrorMsg"), UserConnection.CurrentUser.ContactId);
                return(new MailingResponse {
                    Success = false,
                    StatusId = MailingConsts.BulkEmailStatusErrorId,
                    RemindingLczStringCode = validationResult.Message
                });
            }
            if (!PingProvider())
            {
                MailingUtilities.Log.ErrorFormat(
                    "[CESMaillingProvider.ExecuteSendMessage]: CESApi.Ping Fails. SessionId: {0}.", Context.SessionId);
                BulkEmailEventLogger.LogError(bulkEmailId, DateTime.UtcNow, GetLczStringValue("BatchSendEvent"),
                                              GetLczStringValue("CloudUnreachableMsg"), UserConnection.CurrentUser.ContactId);
                return(new MailingResponse {
                    Success = false,
                    StatusId = MailingConsts.BulkEmailStatusErrorId,
                    RemindingLczStringCode = "CESPingFailsMsg"
                });
            }
            RegisterSenderDomain(Context.BulkEmailEntity.GetTypedColumnValue <string>("SenderEmail"));
            response.Success  = true;
            response.StatusId = MailingConsts.BulkEmailStatusWaitingBeforeSendId;
            return(response);
        }
        public override MailingResponse ExecuteState()
        {
            var bulkEmailEntity = Context.BulkEmailEntity;
            var bulkEmailId     = bulkEmailEntity.PrimaryColumnValue;

            SetBulkEmailStatus(bulkEmailId, MailingConsts.BulkEmailStatusWaitingBeforeSendId);
            PerformWaitBeforeSend();
            var currentBulkEmailStatus = BulkEmailQueryHelper.GetBulkEmailStatus(bulkEmailId, Context.UserConnection);

            if (currentBulkEmailStatus == MailingConsts.BulkEmailStatusStoppedId)
            {
                MailingUtilities.Log.InfoFormat(
                    "[CESMaillingProvider.ExecuteSendMessageTask]: Break iterations. " +
                    "bulkEmilId {0} has status 'Stopped'.", bulkEmailId);
                return(new MailingResponse {
                    Success = true
                });
            }
            InitializeAudienceDataSource(bulkEmailId);
            MailingUtilities.Log.InfoFormat(
                "[CESMaillingProvider.CreateSendAction]: Start action for send. " + "bulkEmilId: {0}", bulkEmailId);
            try {
                var bulkEmail = (BulkEmail)bulkEmailEntity;
                ResolveRecipientsReplica(bulkEmailId);
                var templateReplicas = CreateTemplates(bulkEmail, BulkEmailMacroParser).ToList();
                foreach (var template in templateReplicas)
                {
                    SaveTemplate(template, bulkEmail);
                }
                PrepareRecipientsMacros(bulkEmail, templateReplicas);
            } catch (Exception e) {
                SetBulkEmailStatus(bulkEmailId, MailingConsts.BulkEmailStatusErrorId);
                MailingUtilities.Log.ErrorFormat(
                    "[CESMaillingProvider.ExecuteSendMessage]: " + "Error while saving template. BulkEmailId {0}.", e,
                    bulkEmailId);
                BulkEmailEventLogger.LogError(bulkEmailId, DateTime.UtcNow, GetLczStringValue("BatchSendEvent"), e,
                                              GetLczStringValue("TemplateSaveErrorMsg"), Context.UserConnection.CurrentUser.ContactId);
                CreateReminding(Context.BulkEmailEntity, "CESTemplateFailsMsg");
                throw;
            }
            return(new MailingResponse {
                Success = true
            });
        }
 private void UpdateSendEmailIterationResult(SendMessageData messageData,
                                             IEnumerable <IMessageRecipientInfo> recipients, TypedCounter <MailingResponseCode> resultsCounter)
 {
     try {
         HandleEmailResult(messageData.BulkEmailRId, recipients);
         UpdateResultCounter(recipients, resultsCounter);
     } catch (Exception e) {
         MailingUtilities.Log.ErrorFormat(
             "[CESMaillingProvider.SendBatch]: Error while handling result of BulkEmail with Id: {0}", e,
             messageData.BulkEmail.Id);
         BulkEmailEventLogger.LogError(messageData.BulkEmail.Id, DateTime.UtcNow,
                                       GetLczStringValue("BatchSendEvent"), e, GetLczStringValue("HandleResultErrorMsg"),
                                       UserConnection.CurrentUser.ContactId);
     } finally {
         messageData.EmailMessage = null;
     }
     MailingUtilities.Log.InfoFormat("[CESMaillingProvider.SendBatch]: Success: BulkEmailId: {0}. GroupId {1}.",
                                     messageData.BulkEmail.Id, messageData.BatchId);
 }
        public override MailingResponse ExecuteState()
        {
            var startSendingTime = DateTime.UtcNow;
            var bulkEmail        = (BulkEmail)Context.BulkEmailEntity;

            MailingUtilities.Log.InfoFormat(
                "[CESMaillingProvider.ExecuteSendMessage]: Start: " + "BulkEmail.Id: {0}, SessionId: {1}", bulkEmail.Id,
                Context.SessionId);
            try {
                var validationResult = ActiveContactsHelper.ValidatePermissionEditBulkEmail(UserConnection);
                if (validationResult.Code == ActiveContactsValidationResult.Error)
                {
                    MailingUtilities.Log.ErrorFormat(
                        "[CESMaillingProvider.ExecuteSendMessage]: License check failed. SessionId: {0}.",
                        Context.SessionId);
                    BulkEmailEventLogger.LogError(bulkEmail.Id, DateTime.UtcNow, GetLczStringValue("BatchSendEvent"),
                                                  GetLczStringValue("LicenceErrorMsg"), UserConnection.CurrentUser.ContactId);
                    return(new MailingResponse {
                        Success = false,
                        StatusId = MailingConsts.BulkEmailStatusErrorId,
                        RemindingLczStringCode = validationResult.Message
                    });
                }
                if (!PingProvider(bulkEmail.Id))
                {
                    MailingUtilities.Log.ErrorFormat(
                        "[CESMaillingProvider.ExecuteSendMessage]: CESApi.Ping Fails. SessionId: {0}.",
                        Context.SessionId);
                    BulkEmailEventLogger.LogError(bulkEmail.Id, DateTime.UtcNow, GetLczStringValue("BatchSendEvent"),
                                                  GetLczStringValue("CloudUnreachableMsg"), UserConnection.CurrentUser.ContactId);
                    return(new MailingResponse {
                        Success = false,
                        StatusId = MailingConsts.BulkEmailStatusErrorId,
                        RemindingLczStringCode = "CESPingFailsMsg"
                    });
                }
                SetBulkEmailStatus(bulkEmail.Id, MailingConsts.BulkEmailStatusLaunchedId);
                InitBulkEmailCounters(bulkEmail.Id, false);
                BulkEmailEventLogger.LogInfo(bulkEmail.Id, startSendingTime, GetLczStringValue("StartSendingEmail"),
                                             GetLczStringValue("StartSendingEmailDescription"), UserConnection.CurrentUser.ContactId);
                var messageData = CreateSendMessageData(bulkEmail);
                ExecuteSendMessageTask(messageData);
                BulkEmailEventLogger.LogInfo(bulkEmail.Id, startSendingTime, GetLczStringValue("EmailSent"),
                                             GetLczStringValue("EmailSentDescription"), UserConnection.CurrentUser.ContactId);
            } catch (Exception e) {
                MailingUtilities.Log.ErrorFormat(
                    "[CESMaillingProvider.ExecuteSendMessage]: Error when execute send message for BulkEmail with Id: {0},",
                    e, bulkEmail.Id);
                BulkEmailEventLogger.LogError(bulkEmail.Id, DateTime.UtcNow, GetLczStringValue("BatchSendEvent"), e,
                                              GetLczStringValue("ExecuteSendMessageErrorMsg"), UserConnection.CurrentUser.ContactId);
                return(new MailingResponse {
                    Success = false,
                    StatusId = MailingConsts.BulkEmailStatusErrorId,
                    RemindingLczStringCode = "ExecuteSendMessageErrorMsg"
                });
            }
            return(new MailingResponse {
                Success = true,
                StatusId = MailingConsts.BulkEmailStatusFinishedId,
                RemindingLczStringCode = "CESMassMailingFinishedMsg"
            });
        }
        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);
        }