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);
        }
示例#2
0
        private bool SendTestMessageTemplate(Guid bulkEmailId, Guid contactId, string emailRecipient,
                                             IMailingTemplate template, SendMessageData messageData, BulkEmailMacroComposer macroComposer)
        {
            var templateContent = template.Content;

            if (templateContent?.IsEmpty() != false)
            {
                MailingUtilities.Log.InfoFormat("[SendTestMessage]: Can't save template");
                return(false);
            }
            var emailMessage = InitEmailMessage(messageData, macroComposer, template);

            emailMessage.images = template.InlineImages.ToCESImage();
            emailMessage.html   = templateContent;
            emailMessage.tags   = new List <string> {
                TestMessageTag
            };
            PrepareTestRecipient(contactId, emailRecipient, macroComposer, emailMessage, template);
            if (!Validator.ValidateTestMessage(bulkEmailId, contactId, template, emailMessage))
            {
                return(false);
            }
            try {
                ServiceApi.SendMessage(emailMessage, bulkEmailId);
                MailingUtilities.Log.InfoFormat("[SendTestMessage]: Can't save template");
                return(true);
            } catch (Exception e) {
                MailingUtilities.Log.ErrorFormat("[SendTestMessage]: Error while sending message", e);
                return(false);
            }
        }
        private SendMessageData CreateSendMessageData(BulkEmail bulkEmail)
        {
            var startDateUtc = TimeZoneInfo.ConvertTimeToUtc(bulkEmail.StartDate,
                                                             Context.UserConnection.CurrentUser.TimeZone);
            var messageData = new SendMessageData {
                UserConnection     = Context.UserConnection,
                BulkEmailStartDate = startDateUtc
            };

            return(messageData);
        }
示例#4
0
        private SendMessageData CreateSendMessageData(BulkEmail bulkEmail)
        {
            var startDateUtc = TimeZoneInfo.ConvertTimeToUtc(bulkEmail.StartDate, _userConnection.CurrentUser.TimeZone);
            var messageData  = new SendMessageData {
                UserConnection     = _userConnection,
                BulkEmail          = bulkEmail,
                BulkEmailStartDate = startDateUtc,
                SessionId          = Guid.NewGuid()
            };

            return(messageData);
        }
        private EmailMessage InitDCEmailMessage(SendMessageData messageData)
        {
            var bulkEmail = messageData.BulkEmail;
            var message   = new EmailMessage {
                track_clicks = true,
                track_opens  = true,
                images       = messageData.Images,
                inline_css   = true
            };

            message.tags = GetBulkEmailCategoryTags(bulkEmail);
            return(message);
        }
        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);
            }
        }
示例#7
0
        private SendTestMessageResult ExecuteDCTestMessageSending(SendTestMessageData data, BulkEmail bulkEmail,
                                                                  SendMessageData messageData, IEnumerable <DCReplicaModel> replicas)
        {
            var sentReplicaMasks   = new List <int>();
            var failedReplicaMasks = new List <int>();
            var templates          = TemplateFactory.CreateInstances(_userConnection, bulkEmail, replicas, BulkEmailMacroParser);
            var templatesWithMasks = templates.Select(t => new {
                Template    = t,
                ReplicaMask = replicas.First(replica => replica.Id == ((IMailingTemplateReplica)t).ReplicaId).Mask
            });
            var macroComposer = GetMacroComposer(data.ContactId, bulkEmail.Id);

            foreach (var template in templatesWithMasks)
            {
                var sentSuccessfully = SendTestMessageTemplate(bulkEmail.Id, data.ContactId, data.EmailRecipients,
                                                               template.Template, messageData, macroComposer);
                if (sentSuccessfully)
                {
                    sentReplicaMasks.Add(template.ReplicaMask);
                }
                else
                {
                    failedReplicaMasks.Add(template.ReplicaMask);
                }
            }
            if (data.ReplicaMasks == null)
            {
                return(new SendTestMessageResult {
                    Success = sentReplicaMasks.Count > 0,
                    SentReplicaMasks = sentReplicaMasks.ToArray(),
                    FailedReplicaMasks = failedReplicaMasks.ToArray()
                });
            }
            foreach (var mask in data.ReplicaMasks)
            {
                if (!sentReplicaMasks.Contains(mask) && !failedReplicaMasks.Contains(mask))
                {
                    failedReplicaMasks.Add(mask);
                }
            }
            return(new SendTestMessageResult {
                Success = sentReplicaMasks.Count > 0,
                SentReplicaMasks = sentReplicaMasks.ToArray(),
                FailedReplicaMasks = failedReplicaMasks.ToArray()
            });
        }
 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);
 }
示例#9
0
        /// <summary>
        /// Clones this instance.
        /// </summary>
        /// <returns></returns>
        public SendMessageData Clone()
        {
            SendMessageData clone = new SendMessageData();

            clone.UserConnection     = UserConnection;
            clone.SessionId          = SessionId;
            clone.BulkEmailStartDate = BulkEmailStartDate;
            clone.BatchId            = BatchId;
            clone.TemplateName       = TemplateName;
            clone.BatchLength        = BatchLength;
            clone.MailingStartTS     = MailingStartTS;
            if (EmailContactCollection != null)
            {
                clone.EmailContactCollection = new Dictionary <Guid, int>(EmailContactCollection);
            }
            if (Images != null)
            {
                clone.Images = new List <image>(Images);
            }
            return(clone);
        }
示例#10
0
        private EmailMessage InitEmailMessage(SendMessageData messageData, BulkEmailMacroComposer macroComposer,
                                              IMailingTemplate template)
        {
            var    bulkEmail = messageData.BulkEmail;
            string senderEmail;
            string senderName;

            if (template is IMailingTemplateWithHeaders templateReplica)
            {
                senderEmail = templateReplica.SenderEmail;
                senderName  = templateReplica.SenderName;
            }
            else
            {
                senderEmail = bulkEmail.SenderEmail;
                senderName  = bulkEmail.SenderName;
            }
            var message = new EmailMessage {
                subject      = template.TemplateSubject,
                from_email   = senderEmail,
                from_name    = senderName,
                track_clicks = true,
                track_opens  = true,
                images       = messageData.Images,
                inline_css   = true
            };
            var globalMacros = macroComposer.GetCommonMacrosValues(template.MacrosCollection);
            var mergeVars    = globalMacros.Select(macros => new merge_var {
                name    = macros.Key,
                content = BulkEmailMacroParser.EncodeUrlMacrosValue(macros.Key, macros.Value)
            }).ToList();

            if (!mergeVars.Any())
            {
                return(message);
            }
            message.InitGlobalVariable();
            message.global_merge_vars.AddRange(mergeVars);
            return(message);
        }
        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);
        }