Ejemplo n.º 1
0
        protected override void ExecuteInternal(IJobExecutionContext context)
        {
            var      mailChimpCampaignId = string.Empty;
            Campaign campaign            = null;

            var imageHostingUrl           = _jobConfig.ImageHostingServiceUrl;
            var maxHours                  = _jobConfig.RetryMaxHours;
            var timeToRescheduleInMinutes = _jobConfig.RescheduleMinutes;

            try
            {
                //Get the campaign to start processing
                campaign = _campaignService.GetNextCampaignToTriggerAsync().Result.Campaign;

                while (campaign != null)
                {
                    var isDelayed = campaign.CampaignStatus == CampaignStatus.Delayed;
                    Log.Informational(string.Format("Campaign {0} has been picked up for sending.", campaign));

                    //Campaign primary information
                    var serviceProvider = campaign.ServiceProviderID.HasValue
                        ? _communicationService.GetEmailProviderById(new GetServiceProviderByIdRequest {
                        AccountId = campaign.AccountID, ServiceProviderId = campaign.ServiceProviderID.Value
                    }).CampaignEmailProvider
                        : _communicationService.GetDefaultCampaignEmailProvider(new GetDefaultCampaignEmailProviderRequest {
                        AccountId = campaign.AccountID
                    }).CampaignEmailProvider;

                    var emailProvider = campaign.ServiceProviderID.HasValue
                        ? _campaignService.GetEmailProviderById(new GetServiceProviderSenderEmailRequest {
                        AccountId = campaign.AccountID, RequestedBy = campaign.CreatedBy, ServiceProviderID = campaign.ServiceProviderID.Value
                    })
                        : _campaignService.GetDefaultBulkEmailProvider(new GetServiceProviderSenderEmailRequest {
                        AccountId = campaign.AccountID, RequestedBy = campaign.CreatedBy
                    });

                    var accountDomain  = serviceProvider.Account.DomainURL.ToLower();
                    var accountAddress = serviceProvider.Account.Addresses?.Any(a => a.IsDefault) ?? false?
                                         serviceProvider.Account.Addresses.First(a => a.IsDefault).ToString() :
                                             string.Empty;

                    Log.Informational(string.Format("Update campaign status to sending {0}", campaign));
                    var successfulRecipients = new List <int>();

                    //Update campaign to sending status
                    UpdateCampaignTriggerStatus(campaign, isDelayed ? CampaignStatus.Retrying : CampaignStatus.Sending, "The campaign has been picked up for sending", serviceProvider, successfulRecipients, campaign.AccountID, isDelayed);
                    //Campaign Recipients
                    Log.Informational(string.Format("Get recipients info {0}", campaign));
                    try
                    {
                        var campaignRecipientsInfo = _campaignService.GetCampaignRecipientsInfo(new GetCampaignRecipientsRequest {
                            CampaignId = campaign.Id, IsLinkedToWorkflow = false
                        });
                        if (campaignRecipientsInfo.RecipientsInfo.IsAny())
                        {
                            var customFieldsValueOptions = _customFieldRepository.GetCustomFieldsValueOptions(campaign.AccountID).ToArray();

                            var campaignRecipients = campaignRecipientsInfo.RecipientsInfo.Select(c => new EmailRecipient
                            {
                                ContactId           = Convert.ToInt32(c.Value["CONTACTID"]),
                                CampaignRecipientID = Convert.ToInt32(c.Value["CRID"]),
                                EmailId             = c.Value["EMAILID"].ToString().TrimEnd(),
                                ContactFields       = c.Value
                            }).ToList();

                            var    mailRegistration = _mailService.GetMailRegistrationDetails(serviceProvider.LoginToken);
                            string content;
                            if (!string.IsNullOrEmpty(serviceProvider.ImageDomain?.Domain))
                            {
                                mailRegistration.ImageDomain = serviceProvider.ImageDomain.Domain;
                                content = campaign.HTMLContent.Replace(imageHostingUrl, serviceProvider.ImageDomain.Domain);
                                var imageDomainProtocol = serviceProvider.ImageDomain.Domain.Substring(0, serviceProvider.ImageDomain.Domain.IndexOf("://") + 3);
                                var index      = serviceProvider.ImageDomain.Domain.IndexOf("//");
                                var dotCount   = serviceProvider.ImageDomain.Domain.Count(d => d == '.');
                                var linkDomain = serviceProvider.ImageDomain.Domain;
                                if (index >= 0 && dotCount == 1)
                                {
                                    linkDomain = serviceProvider.ImageDomain.Domain.Replace(imageDomainProtocol, imageDomainProtocol + serviceProvider.AccountCode + ".");
                                    content    = content.Replace("http://" + accountDomain, linkDomain).Replace("https://" + accountDomain, linkDomain);
                                }
                            }
                            else
                            {
                                content = campaign.HTMLContent;
                            }

                            content = content.Replace("*|CAMPID|*", campaign.Id.ToString()).Replace("<o:p>", "").Replace("</o:p>", "");
                            campaign.HTMLContent = content;
                            var mailProvider = default(IMailProvider);
                            switch (mailRegistration.MailProviderID)
                            {
                            case LM.MailProvider.MailChimp:
                                mailProvider = new MailChimpCampaign(mailRegistration.APIKey);
                                break;

                            case LM.MailProvider.SmartTouch:
                                mailProvider = new SmartTouchProvider();
                                break;

                            case LM.MailProvider.Undefined:
                            case LM.MailProvider.Smtp:
                            case LM.MailProvider.SendGrid:
                            case LM.MailProvider.CustomSmartTouch:
                            case LM.MailProvider.CustomMailChimp:
                            default:
                                break;
                            }

                            var failedRecipientIDs = new List <Tuple <Exception, int[]> >();
                            try
                            {
                                var numberOfIternations = mailProvider.BatchCount == 0 ? 1 : Math.Ceiling(campaignRecipients.Count / (decimal)mailProvider.BatchCount);
                                #region Batch Process
                                for (int i = 0; i < numberOfIternations; i++)
                                {
                                    var batchRecipientIDs = campaignRecipients
                                                            .Skip(mailProvider.BatchCount * i)
                                                            .Take(mailProvider.BatchCount)
                                                            .Select(r => r.CampaignRecipientID)
                                                            .ToArray();

                                    var batchCount = mailRegistration.MailProviderID == LM.MailProvider.MailChimp ? campaignRecipients.Count() : mailProvider.BatchCount;
                                    Log.Informational("Batch count: " + batchCount);

                                    var recipients = campaignRecipients
                                                     .Skip(mailProvider.BatchCount * i)
                                                     .Take(batchCount)
                                                     .ToList();

                                    var validRecipients = recipients
                                                          .Where(x => _emailValidator.IsValidEmail(x.EmailId))
                                                          .ToList();

                                    try
                                    {
                                        Log.Informational(string.Format("Sending campaign to vmta {0}, iteration {1}", campaign, i));
                                        mailChimpCampaignId = mailProvider.SendCampaign(campaign, validRecipients
                                                                                        , customFieldsValueOptions, serviceProvider.AccountCode, accountAddress, accountDomain
                                                                                        , (emailProvider.SenderEmail != null ? emailProvider.SenderEmail.EmailId : string.Empty), mailRegistration);

                                        _campaignService.UpdateCampaignRecipientsStatus(new UpdateCampaignRecipientsStatusRequest
                                        {
                                            CampaignRecipientIDs = validRecipients.Select(r => r.CampaignRecipientID).ToList(),
                                            Remarks        = "Campaign Sent Successfully",
                                            SentOn         = DateTime.UtcNow,
                                            DeliveredOn    = DateTime.UtcNow,
                                            DeliveryStatus = CampaignDeliveryStatus.Delivered
                                        });

                                        successfulRecipients.AddRange(batchRecipientIDs);

                                        var invalidRecipients = recipients
                                                                .Except(validRecipients)
                                                                .ToList();

                                        if (invalidRecipients.Any())
                                        {
                                            Log.Informational(string.Format("Updating invalid email recipients {0}, count {1}", campaign, invalidRecipients.Count()));
                                            _campaignService.UpdateCampaignRecipientsStatus(new UpdateCampaignRecipientsStatusRequest
                                            {
                                                CampaignRecipientIDs = invalidRecipients.Select(r => r.CampaignRecipientID).ToList(),
                                                Remarks        = "Failed due to invalid email",
                                                SentOn         = DateTime.UtcNow,
                                                DeliveredOn    = DateTime.UtcNow,
                                                DeliveryStatus = CampaignDeliveryStatus.Failed
                                            });
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        failedRecipientIDs.Add(Tuple.Create(ex, batchRecipientIDs));
                                        var message = string.Format("Campaign batch failed - {0} - Iteration {1} - Batch Count {2}", campaign, i, mailProvider.BatchCount);
                                        Log.Critical(message, ex);
                                    }
                                }

                                #endregion

                                var isCampaignPartialFailed = failedRecipientIDs.Any();
                                if (isCampaignPartialFailed &&
                                    campaign.ScheduleTime - campaign.CreatedDate <
                                    TimeSpan.FromMinutes(timeToRescheduleInMinutes))
                                {
                                    _campaignService.ReScheduleCampaign(campaign.Id, DateTime.UtcNow.AddMinutes(5));
                                    UpdateCampaignTriggerStatus(campaign, CampaignStatus.Scheduled, "The campaign has been rescheduled", serviceProvider, successfulRecipients, campaign.AccountID, isDelayed);
                                }
                                else
                                {
                                    foreach (var failedBatch in failedRecipientIDs)
                                    {
                                        _campaignService.UpdateCampaignRecipientsStatus(
                                            new UpdateCampaignRecipientsStatusRequest
                                        {
                                            CampaignRecipientIDs = failedBatch.Item2.ToList(),
                                            Remarks        = string.Format("Exception:{0}", failedBatch.Item1.Message),
                                            SentOn         = DateTime.UtcNow,
                                            DeliveredOn    = DateTime.UtcNow,
                                            DeliveryStatus = CampaignDeliveryStatus.Failed
                                        });
                                    }
                                }

                                var remarks = isCampaignPartialFailed ? "Campaign partially failed due to bad emails" : "The campaign has been picked up for sending";
                                var status  = isCampaignPartialFailed ? CampaignStatus.Delayed :
                                              mailRegistration.MailProviderID == LM.MailProvider.MailChimp ?
                                              CampaignStatus.Analyzing : CampaignStatus.Sent;

                                //if (status == CampaignStatus.Delayed && (campaign.CampaignStatus == CampaignStatus.Scheduled || campaign.CampaignStatus == CampaignStatus.Queued))
                                //{
                                //    SendSupportNotificationEmail(campaign.AccountID, campaign.CreatedBy, campaign.Id, false, campaign.Name);
                                //}
                                //else
                                if (status == CampaignStatus.Delayed &&
                                    campaign.CampaignStatus == CampaignStatus.Delayed &&
                                    (DateTime.UtcNow - campaign.ScheduleTime)?.TotalHours > maxHours)
                                {
                                    status = CampaignStatus.Draft;
                                    //SendSupportNotificationEmail(campaign.AccountID, campaign.CreatedBy, campaign.Id, true, campaign.Name);
                                }

                                _accountService.ScheduleAnalyticsRefresh(campaign.Id, (byte)IndexType.Campaigns);
                                UpdateCampaignTriggerStatus(campaign, status, remarks, serviceProvider, successfulRecipients, campaign.AccountID, isDelayed, mailChimpCampaignId);
                            }
                            catch (Exception ex)
                            {
                                Log.Critical("Campaign batch failed " + campaign, ex);
                                var remarks = "Error while sending campaign, please contact administrator. Additional Info: " + ex;
                                UpdateCampaignTriggerStatus(campaign, CampaignStatus.Failure, remarks, serviceProvider, successfulRecipients, campaign.AccountID, isDelayed);
                            }
                        }
                        else
                        {
                            var remarks = "No campaign recipients found";
                            UpdateCampaignTriggerStatus(campaign, CampaignStatus.Failure, remarks, serviceProvider, successfulRecipients, campaign.AccountID, isDelayed);
                        }

                        //Social posts
                        ShareSocialPost(_socialIntegrationService, campaign);
                    }
                    catch (Exception ex)
                    {
                        var remarks     = "Error while sending campaign, Additional Info: " + ex;
                        var campaignKey = "Campaign";
                        if (!ex.Data.Contains(campaignKey))
                        {
                            ex.Data.Add(campaignKey, campaign.Id.ToString());
                        }

                        _campaignService.UpdateCampaignTriggerStatus(
                            new UpdateCampaignTriggerStatusRequest(campaign.Id)
                        {
                            Status       = CampaignStatus.Delayed,
                            SentDateTime = DateTime.UtcNow,
                            Remarks      = remarks
                        });

                        Log.Error(remarks, ex);
                    }
                    finally
                    {
                        campaign = _campaignService.GetNextCampaignToTriggerAsync().Result.Campaign;
                    }
                }
                AnalizeMailChimpCampaigns();
            }
            catch (Exception ex)
            {
                ExceptionHandler.Current.HandleException(ex, DefaultExceptionPolicies.LOG_ONLY_POLICY);
                if (campaign != null)
                {
                    var remarks = "Error while sending campaign, please contact administrator. Additional Info: " + ex;
                    _campaignService.UpdateCampaignTriggerStatus(new UpdateCampaignTriggerStatusRequest(campaign.Id)
                    {
                        Status       = CampaignStatus.Failure,
                        SentDateTime = DateTime.UtcNow,
                        Remarks      = remarks
                    });
                }
            }
        }
Ejemplo n.º 2
0
        protected override void ExecuteInternal(IJobExecutionContext context)
        {
            var imageHostingUrl           = _jobConfig.ImageHostingServiceUrl;
            var timeToRescheduleInMinutes = _jobConfig.RescheduleMinutes;

            try
            {
                var automationCampaignRecipients = _campaignService
                                                   .GetNextAutomationCampaignRecipients(new GetNextAutomationCampaignRecipientsRequest())
                                                   .AutomationCampaignRecipients
                                                   .ToArray();

                if (automationCampaignRecipients.Any())
                {
                    Log.Informational("Automation campaign recipients found");
                    var campaignIds = automationCampaignRecipients
                                      .Select(s => s.CampaignID)
                                      .Distinct()
                                      .ToArray();

                    var campaigns = _campaignService
                                    .GetAutomationCampaigns(new GetAutomationCampaignRequest
                    {
                        CampaignIds = campaignIds
                    }).Campaigns;

                    foreach (var campaign in campaigns)
                    {
                        var firstRecipient = automationCampaignRecipients.First(x => x.CampaignID == campaign.Id);
                        var createdOn      = firstRecipient.CreatedDate;
                        var scheduledTo    = firstRecipient.ScheduleTime;

                        var campaignRecipients = new List <EmailRecipient>();
                        try
                        {
                            Log.Informational("Request received to get email providers, automation campaign id " + campaign.Id);
                            var communicationResponse = (campaign.ServiceProviderID.HasValue && campaign.ServiceProviderID.Value > 0)
                                ? _communicationService.GetEmailProviderById(new GetServiceProviderByIdRequest {
                                AccountId = campaign.AccountID, ServiceProviderId = campaign.ServiceProviderID.Value
                            }).CampaignEmailProvider
                                : _communicationService.GetDefaultCampaignEmailProvider(new GetDefaultCampaignEmailProviderRequest {
                                AccountId = campaign.AccountID
                            }).CampaignEmailProvider;

                            Log.Informational("Request received to get default email providers, automation campaign id " + campaign.Id);
                            var accountDomain  = communicationResponse.Account.DomainURL;
                            var accountAddress = "";
                            if (communicationResponse.Account.Addresses != null && communicationResponse.Account.Addresses.Any())
                            {
                                var primaryAddress = communicationResponse.Account.Addresses.FirstOrDefault(a => a.IsDefault);
                                if (primaryAddress != null)
                                {
                                    accountAddress = primaryAddress.ToString();
                                }
                            }
                            var providerSenderEmailResponse = _campaignService.GetDefaultBulkEmailProvider(
                                new GetServiceProviderSenderEmailRequest
                            {
                                AccountId   = campaign.AccountID,
                                RequestedBy = campaign.CreatedBy
                            });

                            var recipients = _campaignService.GetCampaignRecipientsInfo(new GetCampaignRecipientsRequest {
                                CampaignId = campaign.Id, IsLinkedToWorkflow = true
                            });
                            if (recipients != null)
                            {
                                campaignRecipients = recipients.RecipientsInfo.Select(c => new EmailRecipient()
                                {
                                    ContactId           = Convert.ToInt32(c.Value["CONTACTID"]),
                                    CampaignRecipientID = Convert.ToInt32(c.Value["CRID"]),
                                    EmailId             = c.Value["EMAILID"].ToString().TrimEnd(),
                                    ContactFields       = c.Value
                                }).ToList();
                                _contactRepository.GetCompanyDetails(campaignRecipients.Select(c => c.ContactId), campaign.AccountID);
                            }

                            var mailRegistration = _mailService.GetVMTADetails(new List <Guid>()
                            {
                                communicationResponse.LoginToken
                            });
                            var imageDomainResponse = _communicationService.GetServiceProviderImageDomain(new GetServiceProviderImageDomainRequest()
                            {
                                Guid = mailRegistration.Guid
                            }).ServiceProvider;
                            if (imageDomainResponse != null && imageDomainResponse.ImageDomain != null && imageDomainResponse.ImageDomain.Domain != null)
                            {
                                mailRegistration.ImageDomain = imageDomainResponse.ImageDomain.Domain;
                            }

                            if (mailRegistration != null && mailRegistration.MailProviderID == MailProvider.SmartTouch)
                            {
                                Log.Informational("VMTA service provider found for this account");
                                string content;
                                if (mailRegistration.ImageDomain != null)
                                {
                                    content = campaign.HTMLContent.Replace(imageHostingUrl, mailRegistration.ImageDomain);
                                    var index      = mailRegistration.ImageDomain.IndexOf("//");
                                    var dotCount   = mailRegistration.ImageDomain.Count(d => d == '.');
                                    var linkDomain = mailRegistration.ImageDomain;
                                    if (index >= 0 && dotCount == 1)
                                    {
                                        linkDomain = mailRegistration.ImageDomain.Insert(index + 2, communicationResponse.AccountCode + ".").Replace("https://", "").Replace("http://", "").Replace("www.", "");
                                        content    = content.Replace("http://" + accountDomain, "http://" + linkDomain).Replace("https://" + accountDomain, "http://" + linkDomain);
                                    }
                                }
                                else
                                {
                                    content = campaign.HTMLContent;
                                }

                                content = content.Replace("*|CAMPID|*", campaign.Id.ToString()).Replace("<o:p>", "").Replace("</o:p>", "");
                                campaign.HTMLContent = content;

                                var senderEmail = providerSenderEmailResponse.SenderEmail != null ? providerSenderEmailResponse.SenderEmail.EmailId : "";
                                var customFieldsValueOptions = _customFieldRepository.GetCustomFieldsValueOptions(campaign.AccountID);

                                var mailProvider = new SmartTouchProvider();
                                mailProvider.SendCampaign(
                                    campaign, campaignRecipients, customFieldsValueOptions,
                                    communicationResponse.AccountCode, accountAddress,
                                    accountDomain, senderEmail, mailRegistration);
                                var successfulRecipients = campaignRecipients;

                                Log.Informational("Automation campaign sent to vmta, automation campaign id " + campaign.Id);
                                if (successfulRecipients.Any())
                                {
                                    _campaignService.UpdateCampaignTriggerStatus(new UpdateCampaignTriggerStatusRequest(campaign.Id)
                                    {
                                        Status                    = CampaignStatus.Sent,
                                        SentDateTime              = DateTime.UtcNow,
                                        ServiceProviderID         = communicationResponse.CommunicationLogID,
                                        Remarks                   = "Campaign sent successfully",
                                        SentCount                 = campaignRecipients.Count(),
                                        RecipientIds              = campaignRecipients.Select(c => c.CampaignRecipientID),
                                        ServiceProviderCampaignId = communicationResponse.AccountCode + "/" + campaign.Id,
                                        IsRelatedToWorkFlow       = true,
                                        AccountId                 = campaign.AccountID
                                    });
                                    _accountService.ScheduleAnalyticsRefresh(campaign.Id, (byte)IndexType.Campaigns);
                                }
                                else
                                {
                                    _campaignService.UpdateCampaignTriggerStatus(new UpdateCampaignTriggerStatusRequest(campaign.Id)
                                    {
                                        Status              = CampaignStatus.Failure,
                                        SentDateTime        = DateTime.UtcNow,
                                        Remarks             = "Could not send the campaign through VMTA service.",
                                        SentCount           = campaignRecipients.Count(),
                                        RecipientIds        = campaignRecipients.Select(c => c.CampaignRecipientID),
                                        IsRelatedToWorkFlow = true,
                                        AccountId           = campaign.AccountID
                                    });
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            //Workaround for connection issue we have on SmartTouch mail server
                            if (scheduledTo - createdOn < TimeSpan.FromMinutes(timeToRescheduleInMinutes))
                            {
                                _campaignService.ReScheduleAutomationCampaign(campaign.Id, DateTime.UtcNow.AddMinutes(5));
                            }
                            else
                            {
                                Log.Error("Exception occurred while sending a campaign:" + campaign.Id, ex);
                                _campaignService.UpdateCampaignTriggerStatus(
                                    new UpdateCampaignTriggerStatusRequest(campaign.Id)
                                {
                                    Status              = CampaignStatus.Failure,
                                    SentDateTime        = DateTime.UtcNow,
                                    Remarks             = ex.InnerException?.Message ?? ex.Message,
                                    RecipientIds        = campaignRecipients.Select(c => c.CampaignRecipientID),
                                    IsRelatedToWorkFlow = true,
                                    AccountId           = campaign.AccountID
                                });
                                ExceptionHandler.Current.HandleException(ex, DefaultExceptionPolicies.LOG_ONLY_POLICY);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionHandler.Current.HandleException(ex, DefaultExceptionPolicies.LOG_ONLY_POLICY);
            }
        }
        protected override void Execute()
        {
            try
            {
                var imageHostingUrl              = ConfigurationManager.AppSettings["IMAGE_HOSTING_SERVICE_URL"].ToString();
                var campaignService              = IoC.Container.GetInstance <ICampaignService>();
                var communicationService         = IoC.Container.GetInstance <ICommunicationService>();
                var customFieldRepository        = IoC.Container.GetInstance <ICustomFieldRepository>();
                var contactRepository            = IoC.Container.GetInstance <IContactRepository>();
                var accountService               = IoC.Container.GetInstance <IAccountService>();
                var automationCampaignRecipients = campaignService.GetNextAutomationCampaignRecipients(new GetNextAutomationCampaignRecipientsRequest()
                {
                }).AutomationCampaignRecipients;

                if (automationCampaignRecipients != null && automationCampaignRecipients.Any())
                {
                    Logger.Current.Informational("Automation campaign recipients found");
                    var campaignIds = automationCampaignRecipients.Select(s => s.CampaignID);
                    var campaigns   = campaignService.GetAutomationCampaigns(new GetAutomationCampaignRequest()
                    {
                        CampaignIds = campaignIds
                    }).Campaigns;
                    foreach (var campaign in campaigns)
                    {
                        IEnumerable <EmailRecipient> campaignRecipients = new List <EmailRecipient>();
                        try
                        {
                            Logger.Current.Informational("Request received to get email providers, automation campaign id " + campaign.Id);
                            //  var response = communicationService.GetEmailProviders(new GetEmailProvidersRequest() { AccountId = campaign.AccountID });
                            // if (response.Exception != null)
                            //throw response.Exception;
                            var communicationResponse = (campaign.ServiceProviderID.HasValue && campaign.ServiceProviderID.Value > 0)
                        ? communicationService.GetEmailProviderById(new GetServiceProviderByIdRequest {
                                AccountId = campaign.AccountID, ServiceProviderId = campaign.ServiceProviderID.Value
                            }).CampaignEmailProvider
                        : communicationService.GetDefaultCampaignEmailProvider(new GetDefaultCampaignEmailProviderRequest {
                                AccountId = campaign.AccountID
                            }).CampaignEmailProvider;

                            Logger.Current.Informational("Request received to get default email providers, automation campaign id " + campaign.Id);
                            var accountDomain  = communicationResponse.Account.DomainURL;
                            var accountAddress = "";
                            if (communicationResponse.Account.Addresses != null && communicationResponse.Account.Addresses.Any())
                            {
                                var primaryAddress = communicationResponse.Account.Addresses.Where(a => a.IsDefault == true).FirstOrDefault();
                                if (primaryAddress != null)
                                {
                                    accountAddress = primaryAddress.ToString();
                                }
                            }
                            //var serviceProviderGuids = response.ServiceProviderGuids;

                            IEnumerable <Company> companies = default(IEnumerable <Company>);
                            GetServiceProviderSenderEmailResponse providerSenderEmailResponse = campaignService.GetDefaultBulkEmailProvider(new GetServiceProviderSenderEmailRequest()
                            {
                                AccountId   = campaign.AccountID,
                                RequestedBy = campaign.CreatedBy
                            });

                            //var recipients = automationCampaignRecipients.Where(cr => cr.CampaignID == campaign.Id);
                            var recipients = campaignService.GetCampaignRecipientsInfo(new GetCampaignRecipientsRequest {
                                CampaignId = campaign.Id, IsLinkedToWorkflow = true
                            });
                            if (recipients != null)
                            {
                                campaignRecipients = recipients.RecipientsInfo.Select(c => new EmailRecipient()
                                {
                                    ContactId           = Convert.ToInt32(c.Value["CONTACTID"]),
                                    CampaignRecipientID = Convert.ToInt32(c.Value["CRID"]),
                                    EmailId             = c.Value["EMAILID"].ToString().TrimEnd(),
                                    ContactFields       = c.Value
                                });
                                companies = contactRepository.GetCompanyDetails(campaignRecipients.Select(c => c.ContactId), campaign.AccountID);
                            }

                            var senderName = campaign.SenderName;

                            MailService        mailService      = new MailService();
                            MailRegistrationDb mailRegistration = mailService.GetVMTADetails(new List <Guid>()
                            {
                                communicationResponse.LoginToken
                            });
                            var imageDomainResponse = communicationService.GetServiceProviderImageDomain(new GetServiceProviderImageDomainRequest()
                            {
                                Guid = mailRegistration.Guid
                            }).ServiceProvider;
                            if (imageDomainResponse != null && imageDomainResponse.ImageDomain != null && imageDomainResponse.ImageDomain.Domain != null)
                            {
                                mailRegistration.ImageDomain = imageDomainResponse.ImageDomain.Domain;
                            }

                            var contactTagIds        = campaign.ContactTags.Select(c => c.Id).ToList();
                            var searchDefinidtionIds = campaign.SearchDefinitions.Select(c => c.Id).ToList();

                            if (mailRegistration != null && mailRegistration.MailProviderID == MailProvider.SmartTouch)
                            {
                                Logger.Current.Informational("VMTA service provider found for this account");
                                var content = string.Empty;
                                var vmta    = new VMTACampaign(mailRegistration.VMTA, mailRegistration.UserName, mailRegistration.Password, mailRegistration.Host, mailRegistration.Port);


                                if (imageHostingUrl != null && mailRegistration.ImageDomain != null)
                                {
                                    content = campaign.HTMLContent.Replace(imageHostingUrl, mailRegistration.ImageDomain);
                                    var index      = mailRegistration.ImageDomain.IndexOf("//");
                                    var dotCount   = mailRegistration.ImageDomain.Count(d => d == '.');
                                    var linkDomain = mailRegistration.ImageDomain;
                                    if (index >= 0 && dotCount == 1)
                                    {
                                        linkDomain = mailRegistration.ImageDomain.Insert(index + 2, communicationResponse.AccountCode + ".").Replace("https://", "").Replace("http://", "").Replace("www.", "");
                                        content    = content.Replace("http://" + accountDomain, "http://" + linkDomain).Replace("https://" + accountDomain, "http://" + linkDomain);
                                    }
                                }
                                else
                                {
                                    content = campaign.HTMLContent;
                                }
                                content = content.Replace("*|CAMPID|*", campaign.Id.ToString()).Replace("<o:p>", "").Replace("</o:p>", "");

                                campaign.HTMLContent = content;

                                if (vmta == null)
                                {
                                    continue;
                                }
                                var senderEmail = providerSenderEmailResponse.SenderEmail != null ? providerSenderEmailResponse.SenderEmail.EmailId : "";
                                IEnumerable <FieldValueOption> customFieldsValueOptions = customFieldRepository.GetCustomFieldsValueOptions(campaign.AccountID);

                                //var successfulRecipients = vmta.SendCampaign(campaign.Id, campaign.Name, contactTagIds, searchDefinidtionIds
                                //    , campaignRecipients, companies, customFieldsValueOptions, campaign.Subject, campaign.Subject, content
                                //    , campaign.From, senderName, communicationResponse.CampaignEmailProvider.AccountCode
                                //    , mailRegistration.SenderDomain, accountDomain, senderEmail, accountAddress,campaign.AccountID,null);

                                var mailProvider = new SmartTouchProvider();

                                mailProvider.SendCampaign(campaign, campaignRecipients.ToList()
                                                          , customFieldsValueOptions, communicationResponse.AccountCode, accountAddress, accountDomain
                                                          , senderEmail, mailRegistration);
                                var successfulRecipients = campaignRecipients;

                                Logger.Current.Informational("Automation campaign sent to vmta, automation campaign id " + campaign.Id);
                                if (successfulRecipients != null && successfulRecipients.Any())
                                {
                                    campaignService.UpdateCampaignTriggerStatus(new UpdateCampaignTriggerStatusRequest(campaign.Id)
                                    {
                                        Status                    = CampaignStatus.Sent,
                                        SentDateTime              = DateTime.Now.ToUniversalTime(),
                                        ServiceProviderID         = communicationResponse.CommunicationLogID,
                                        Remarks                   = "Campaign sent successfully",
                                        SentCount                 = campaignRecipients.Count(),
                                        RecipientIds              = campaignRecipients.Select(c => c.CampaignRecipientID),
                                        ServiceProviderCampaignId = communicationResponse.AccountCode + "/" + campaign.Id,
                                        IsRelatedToWorkFlow       = true,
                                        AccountId                 = campaign.AccountID
                                    });
                                    accountService.ScheduleAnalyticsRefresh(campaign.Id, (byte)IndexType.Campaigns);
                                }
                                else
                                {
                                    campaignService.UpdateCampaignTriggerStatus(new UpdateCampaignTriggerStatusRequest(campaign.Id)
                                    {
                                        Status              = CampaignStatus.Failure,
                                        SentDateTime        = DateTime.Now.ToUniversalTime(),
                                        Remarks             = "Could not send the campaign through VMTA service.",
                                        SentCount           = campaignRecipients.Count(),
                                        RecipientIds        = campaignRecipients.Select(c => c.CampaignRecipientID),
                                        IsRelatedToWorkFlow = true,
                                        AccountId           = campaign.AccountID
                                    });
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.Current.Error("Exception occurred while sending a campaign:" + campaign.Id, ex);
                            campaignService.UpdateCampaignTriggerStatus(new UpdateCampaignTriggerStatusRequest(campaign.Id)
                            {
                                Status       = CampaignStatus.Failure,
                                SentDateTime = DateTime.Now.ToUniversalTime(),
                                Remarks      = ex.InnerException != null && ex.InnerException.Message != null ?
                                               ex.InnerException.Message.ToString() : ex.Message.ToString(),
                                RecipientIds        = campaignRecipients.Select(c => c.CampaignRecipientID),
                                IsRelatedToWorkFlow = true,
                                AccountId           = campaign.AccountID
                            });
                            ExceptionHandler.Current.HandleException(ex, DefaultExceptionPolicies.LOG_ONLY_POLICY);
                            continue;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionHandler.Current.HandleException(ex, DefaultExceptionPolicies.LOG_ONLY_POLICY);
            }
        }
Ejemplo n.º 4
0
        protected override void ExecuteInternal(IJobExecutionContext context)
        {
            #region local variables

            var      customFieldRepository    = IoC.Container.GetInstance <ICustomFieldRepository>();
            var      socialIntegrationService = IoC.Container.GetInstance <ISocialIntegrationService>();
            var      mailService         = new MailService();
            var      mailChimpCampaignId = string.Empty;
            Campaign campaign            = null;
            bool     isDelayedCampaign   = false;
            #endregion

            try
            {
                //Get the campaign to start processing
                campaign = _campaignService.GetNextCampaignToTriggerAsync().Result.Campaign;

                while (campaign != null)
                {
                    isDelayedCampaign = campaign.CampaignStatus == CampaignStatus.Delayed ? true : false;
                    var imageHostingUrl = ConfigurationManager.AppSettings["IMAGE_HOSTING_SERVICE_URL"].ToString();

                    Log.Informational(string.Format("Campaign {0} has been picked up for sending.", campaign.ToString()));

                    //Campaign primary information
                    var serviceProvider = campaign.ServiceProviderID.HasValue
                        ? _communicationService.GetEmailProviderById(new GetServiceProviderByIdRequest {
                        AccountId = campaign.AccountID, ServiceProviderId = campaign.ServiceProviderID.Value
                    }).CampaignEmailProvider
                        : _communicationService.GetDefaultCampaignEmailProvider(new GetDefaultCampaignEmailProviderRequest {
                        AccountId = campaign.AccountID
                    }).CampaignEmailProvider;

                    var emailProvider = campaign.ServiceProviderID.HasValue
                        ? _campaignService.GetEmailProviderById(new GetServiceProviderSenderEmailRequest {
                        AccountId = campaign.AccountID, RequestedBy = campaign.CreatedBy, ServiceProviderID = campaign.ServiceProviderID.Value
                    })
                        : _campaignService.GetDefaultBulkEmailProvider(new GetServiceProviderSenderEmailRequest {
                        AccountId = campaign.AccountID, RequestedBy = campaign.CreatedBy
                    });

                    var accountDomain  = serviceProvider.Account.DomainURL.ToLower();
                    var accountAddress = (serviceProvider.Account.Addresses != null && serviceProvider.Account.Addresses.Where(a => a.IsDefault == true).Any()) ? serviceProvider.Account.Addresses.Where(a => a.IsDefault == true).First().ToString() : string.Empty;
                    Log.Informational(string.Format("Update campaign status to sending {0}", campaign.ToString()));
                    List <int> successfulRecipients = new List <int>();

                    //Update campaign to sending status
                    UpdateCampaignTriggerStatus(campaign, isDelayedCampaign ? CampaignStatus.Retrying : CampaignStatus.Sending, "The campaign has been picked up for sending", serviceProvider, successfulRecipients, campaign.AccountID, isDelayedCampaign);
                    //Campaign Recipients
                    Log.Informational(string.Format("Get recipients info {0}", campaign.ToString()));
                    try
                    {
                        var campaignRecipientsInfo = _campaignService.GetCampaignRecipientsInfo(new GetCampaignRecipientsRequest {
                            CampaignId = campaign.Id, IsLinkedToWorkflow = false
                        });
                        if (campaignRecipientsInfo.RecipientsInfo.IsAny())
                        {
                            var customFieldsValueOptions = customFieldRepository.GetCustomFieldsValueOptions(campaign.AccountID);

                            var campaignRecipients = campaignRecipientsInfo.RecipientsInfo.Select(c => new EmailRecipient
                            {
                                ContactId           = Convert.ToInt32(c.Value["CONTACTID"]),
                                CampaignRecipientID = Convert.ToInt32(c.Value["CRID"]),
                                EmailId             = c.Value["EMAILID"].ToString().TrimEnd(),
                                ContactFields       = c.Value
                            }).ToList();

                            var mailRegistration = mailService.GetMailRegistrationDetails(serviceProvider.LoginToken);
                            var content          = "";
                            if (imageHostingUrl != null && serviceProvider.ImageDomain != null && !string.IsNullOrEmpty(serviceProvider.ImageDomain.Domain))
                            {
                                mailRegistration.ImageDomain = serviceProvider.ImageDomain.Domain;
                                content = campaign.HTMLContent.Replace(imageHostingUrl, serviceProvider.ImageDomain.Domain);
                                var imageDomainProtocol = serviceProvider.ImageDomain.Domain.Substring(0, serviceProvider.ImageDomain.Domain.IndexOf("://") + 3);
                                var index      = serviceProvider.ImageDomain.Domain.IndexOf("//");
                                var dotCount   = serviceProvider.ImageDomain.Domain.Count(d => d == '.');
                                var linkDomain = serviceProvider.ImageDomain.Domain;
                                if (index >= 0 && dotCount == 1)
                                {
                                    linkDomain = serviceProvider.ImageDomain.Domain.Replace(imageDomainProtocol, imageDomainProtocol + serviceProvider.AccountCode + ".");
                                    content    = content.Replace("http://" + accountDomain, linkDomain).Replace("https://" + accountDomain, linkDomain);
                                }
                            }
                            else
                            {
                                content = campaign.HTMLContent;
                            }

                            content = content.Replace("*|CAMPID|*", campaign.Id.ToString()).Replace("<o:p>", "").Replace("</o:p>", "");
                            campaign.HTMLContent = content;
                            var mailProvider = default(IMailProvider);
                            switch (mailRegistration.MailProviderID)
                            {
                            case LM.MailProvider.MailChimp:
                                mailProvider = new MailChimpCampaign(mailRegistration.APIKey);
                                break;

                            case LM.MailProvider.SmartTouch:
                                mailProvider = new SmartTouchProvider();
                                break;

                            case LM.MailProvider.Undefined:
                            case LM.MailProvider.Smtp:
                            case LM.MailProvider.SendGrid:
                            case LM.MailProvider.CustomSmartTouch:
                            case LM.MailProvider.CustomMailChimp:
                            default:
                                break;
                            }

                            try
                            {
                                var numberOfIternations = mailProvider.BatchCount == 0 ? 1 : Math.Ceiling(campaignRecipients.Count / (decimal)mailProvider.BatchCount);

                                var isCampaignPartialFailed = default(bool);

                                #region Batch Process
                                for (int i = 0; i < numberOfIternations; i++)
                                {
                                    IEnumerable <int> batchRecipientIDs = campaignRecipients.Skip(mailProvider.BatchCount * i).Take(mailProvider.BatchCount).Select(r => r.CampaignRecipientID).ToList();

                                    var batchCount = mailRegistration.MailProviderID == LM.MailProvider.MailChimp ? campaignRecipients.Count() : mailProvider.BatchCount;
                                    Log.Informational("Batch count: " + batchCount);
                                    var validRecipients = GetValidEmailRecipients(campaignRecipients.Skip(mailProvider.BatchCount * i).Take(batchCount).ToList());
                                    try
                                    {
                                        Log.Informational(string.Format("Sending campaign to vmta {0}, iteration {1}", campaign.ToString(), i));
                                        mailChimpCampaignId = mailProvider.SendCampaign(campaign, validRecipients
                                                                                        , customFieldsValueOptions, serviceProvider.AccountCode, accountAddress, accountDomain
                                                                                        , (emailProvider.SenderEmail != null ? emailProvider.SenderEmail.EmailId : string.Empty), mailRegistration);

                                        _campaignService.UpdateCampaignRecipientsStatus(new UpdateCampaignRecipientsStatusRequest
                                        {
                                            CampaignRecipientIDs = validRecipients.Select(r => r.CampaignRecipientID).ToList(),
                                            Remarks        = "Campaign Sent Successfully",
                                            SentOn         = DateTime.UtcNow,
                                            DeliveredOn    = DateTime.UtcNow,
                                            DeliveryStatus = CampaignDeliveryStatus.Delivered
                                        });

                                        successfulRecipients.AddRange(batchRecipientIDs);

                                        var invalidRecipients = campaignRecipients.Skip(mailProvider.BatchCount * i).Take(mailProvider.BatchCount).ToList().Except(validRecipients);
                                        if (invalidRecipients != null && invalidRecipients.Any())
                                        {
                                            Log.Informational(string.Format("Updating invalid email recipients {0}, count {1}", campaign.ToString(), invalidRecipients.Count()));
                                            _campaignService.UpdateCampaignRecipientsStatus(new UpdateCampaignRecipientsStatusRequest
                                            {
                                                CampaignRecipientIDs = invalidRecipients.Select(r => r.CampaignRecipientID).ToList(),
                                                Remarks        = "Failed due to invalid email",
                                                SentOn         = DateTime.UtcNow,
                                                DeliveredOn    = DateTime.UtcNow,
                                                DeliveryStatus = CampaignDeliveryStatus.Failed
                                            });
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        var deliveryStatus = CampaignDeliveryStatus.Failed;
                                        if (ex is TimeoutException)
                                        {
                                            isCampaignPartialFailed = false;
                                            deliveryStatus          = CampaignDeliveryStatus.Delivered;
                                        }
                                        else
                                        {
                                            isCampaignPartialFailed = true;
                                            deliveryStatus          = CampaignDeliveryStatus.Failed;
                                        }
                                        if (deliveryStatus == CampaignDeliveryStatus.Delivered)
                                        {
                                            successfulRecipients.AddRange(batchRecipientIDs);
                                        }
                                        _campaignService.UpdateCampaignRecipientsStatus(new UpdateCampaignRecipientsStatusRequest
                                        {
                                            CampaignRecipientIDs = batchRecipientIDs.ToList(),
                                            Remarks        = string.Format("Exception:{0}", ex.Message),
                                            SentOn         = DateTime.UtcNow,
                                            DeliveredOn    = DateTime.UtcNow,
                                            DeliveryStatus = deliveryStatus
                                        });

                                        var message = string.Format("Campaign batch failed - {0} - Iteration {1} - Batch Count {2}", campaign.ToString(), i, mailProvider.BatchCount);
                                        Log.Critical(message, ex);
                                    }
                                }
                                _accountService.ScheduleAnalyticsRefresh(campaign.Id, (byte)IndexType.Campaigns);

                                #endregion

                                var remarks = isCampaignPartialFailed ? "Campaign partially failed due to bad emails" : "The campaign has been picked up for sending";
                                var status  = isCampaignPartialFailed ? CampaignStatus.Delayed :
                                              (mailRegistration.MailProviderID == LM.MailProvider.MailChimp) ? CampaignStatus.Analyzing :
                                              CampaignStatus.Sent;
                                int maxHours = int.Parse(ConfigurationManager.AppSettings["RetryMaxHours"].ToString());
                                if (status == CampaignStatus.Delayed && (campaign.CampaignStatus == CampaignStatus.Scheduled || campaign.CampaignStatus == CampaignStatus.Queued))
                                {
                                    SendEmail(campaign.AccountID, campaign.CreatedBy, campaign.Id, false, campaign.Name);
                                }
                                else if (status == CampaignStatus.Delayed && campaign.CampaignStatus == CampaignStatus.Delayed && campaign.ScheduleTime.HasValue && DateTime.UtcNow.Subtract(campaign.ScheduleTime.Value).TotalHours > maxHours)
                                {
                                    status = CampaignStatus.Draft;
                                    SendEmail(campaign.AccountID, campaign.CreatedBy, campaign.Id, true, campaign.Name);
                                }
                                UpdateCampaignTriggerStatus(campaign, status, remarks, serviceProvider, successfulRecipients, campaign.AccountID, isDelayedCampaign, mailChimpCampaignId);
                            }
                            catch (Exception ex)
                            {
                                Log.Critical("Campaign batch failed " + campaign.ToString(), ex);
                                var remarks = "Error while sending campaign, please contact administrator. Additional Info: " + ex.ToString();
                                UpdateCampaignTriggerStatus(campaign, CampaignStatus.Failure, remarks, serviceProvider, successfulRecipients, campaign.AccountID, isDelayedCampaign);
                            }
                        }
                        else
                        {
                            var remarks = "No campaign recipients found";
                            UpdateCampaignTriggerStatus(campaign, CampaignStatus.Failure, remarks, serviceProvider, successfulRecipients, campaign.AccountID, isDelayedCampaign);
                        }

                        //Social posts
                        ShareSocialPost(socialIntegrationService, campaign);
                    }
                    catch (Exception ex)
                    {
                        var remarks     = "Error while sending campaign, Additional Info: " + ex.ToString();
                        var campaignKey = "Campaign";
                        if (!ex.Data.Contains(campaignKey))
                        {
                            ex.Data.Add(campaignKey, campaign.Id.ToString());
                        }

                        _campaignService.UpdateCampaignTriggerStatus(new UpdateCampaignTriggerStatusRequest(campaign.Id)
                        {
                            Status       = CampaignStatus.Delayed,
                            SentDateTime = DateTime.Now.ToUniversalTime(),
                            Remarks      = remarks
                        });

                        Log.Error(remarks, ex);
                    }
                    finally
                    {
                        campaign = _campaignService.GetNextCampaignToTriggerAsync().Result.Campaign;
                    }
                }
                AnalizeMailChimpCampaigns();
            }
            catch (Exception ex)
            {
                ExceptionHandler.Current.HandleException(ex, DefaultExceptionPolicies.LOG_ONLY_POLICY);
                if (campaign != null)
                {
                    var remarks = "Error while sending campaign, please contact administrator. Additional Info: " + ex.ToString();
                    _campaignService.UpdateCampaignTriggerStatus(new UpdateCampaignTriggerStatusRequest(campaign.Id)
                    {
                        Status       = CampaignStatus.Failure,
                        SentDateTime = DateTime.Now.ToUniversalTime(),
                        Remarks      = remarks
                    });
                }
            }
        }