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 }); } } }
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); } }
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 }); } } }