Ejemplo n.º 1
0
        public RegistrationResponse RegisterMail(RegisterMailRequest request)
        {
            try
            {
                var dbRequest = new MailRegistrationDb
                {
                    Guid            = Guid.NewGuid(),
                    Name            = request.Name == null?"":request.Name,
                    Host            = request.Host,
                    APIKey          = request.APIKey,
                    UserName        = request.UserName,
                    Password        = request.Password,
                    Port            = request.Port,
                    IsSSLEnabled    = true,
                    MailProviderID  = request.MailProviderID,
                    VMTA            = request.VMTA,
                    MailChimpListID = request.MailChimpListID,
                    SenderDomain    = request.SenderDomain,
                    ImageDomain     = request.ImageDomain
                };

                unitOfWork.MailRegistrationsRepository.Add(dbRequest);
                unitOfWork.Commit();
                return(new RegistrationResponse {
                    Token = dbRequest.Guid
                });
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Exception occurred while fetching the campaign templates.", ex);
                return(null);
            }
        }
Ejemplo n.º 2
0
        public bool SubmitWithTimeOut_testing(MailRegistrationDb mailRegistration, Message message, int campaignId, string subject) // created this method for testing PMTA emails by ram on 11th may 2018 for NEXG-3007 NEXG-3004
        {
            bool connectionStatus = false;
            var  connection       = new Connection(mailRegistration.Host, mailRegistration.Port ?? 25, mailRegistration.UserName, mailRegistration.Password);

            try
            {
                var tokenSource         = new CancellationTokenSource();
                CancellationToken token = tokenSource.Token;
                int timeOut             = 10000;

                var task = Task.Factory.StartNew(() => connection.Submit(message), token);
                if (!task.Wait(timeOut, token))
                {
                    string           errorMessage = "Sending a campaign with subject : " + subject + " and campaignId : " + campaignId + " through VMTA has timed out";
                    TimeoutException ex           = new TimeoutException(errorMessage);
                    Logger.Current.Critical(errorMessage, ex);
                    throw ex;
                }
                connectionStatus = true;
                Logger.Current.Informational("Campaign send successfully through VMTA");
            }
            catch (Exception ex)
            {
                Logger.Current.Critical("PMTA Connection failed for Job Id : " + message.JobID + " Error Message : ", ex);
                connectionStatus = false;
                connection.Close();
            }
            finally
            {
                connection.Close();
            }
            return(connectionStatus);
        }
Ejemplo n.º 3
0
        public MailRegistrationDb GetMailChimpDetails(IEnumerable <Guid> tokens)
        {
            Logger.Current.Verbose("Request received for fetching VMTA details : ");
            MailRegistrationDb registration = this.unitOfWork.MailRegistrationsRepository.FirstOrDefault(mr => tokens.Contains(mr.Guid) && mr.MailProviderID == MailProvider.MailChimp);

            return(registration);
        }
Ejemplo n.º 4
0
        private string ProcessEmailContent(Campaign campaign, MailRegistrationDb mailRegistration, ServiceProviderViewModel serviceProvider)
        {
            string content;
            var    imageHostingUrl = _jobConfig.ImageHostingServiceUrl;
            var    accountDomain   = serviceProvider.Account.DomainURL.ToLower();

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

            return(content.Replace("*|CAMPID|*", campaign.Id.ToString()).Replace("<o:p>", "").Replace("</o:p>", ""));
        }
Ejemplo n.º 5
0
        public MailRegistrationDb GetMailRegistrationDetails(Guid token)
        {
            Logger.Current.Verbose("Request received for fetching mail registration details with token :" + token);
            MailRegistrationDb registration = this.unitOfWork.MailRegistrationsRepository.FirstOrDefault(ft => ft.Guid == token);

            return(registration);
        }
Ejemplo n.º 6
0
 public SmtpMailService(MailRegistrationDb registration)
 {
     smtpClient             = new SmtpClient(registration.Host);
     smtpClient.Credentials = new NetworkCredential(registration.UserName, registration.Password);
     if (registration.Port.HasValue)
     {
         smtpClient.Port = registration.Port.Value;
     }
     smtpClient.EnableSsl = registration.IsSSLEnabled;
     provider             = MailProvider.Smtp;
     this.registration    = registration;
 }
Ejemplo n.º 7
0
        private bool EmailSend(string subject, string emailBody, string toEmail, int accountId, int userId)
        {
            Logger.Current.Informational("In Email Send Method:  " + toEmail);
            var success     = false;
            var mailService = new MailService();
            ServiceProviderViewModel serviceProviderViewModel = communicationService.GetAccountServiceProviders(new GetServiceProviderRequest()
            {
                CommunicationTypeId = CommunicationType.Mail,
                AccountId           = accountId,
                MailType            = MailType.TransactionalEmail
            }).ServiceProviderViewModel.FirstOrDefault();
            MailRegistrationDb mailRegistration = mailService.GetMailRegistrationDetails(serviceProviderViewModel.LoginToken);

            LandmarkIT.Enterprise.CommunicationManager.Requests.SendMailRequest sendMailRequest = new LandmarkIT.Enterprise.CommunicationManager.Requests.SendMailRequest();
            var senderEmail = serviceProviderRepository.GetServiceProviderEmail(serviceProviderViewModel.CommunicationLogID);

            sendMailRequest.TokenGuid     = mailRegistration.Guid;
            sendMailRequest.RequestGuid   = Guid.NewGuid();
            sendMailRequest.IsBodyHtml    = true;
            sendMailRequest.From          = senderEmail.EmailId;
            sendMailRequest.Subject       = subject;
            sendMailRequest.ScheduledTime = DateTime.Now.ToUniversalTime().AddSeconds(5);
            sendMailRequest.Body          = emailBody;
            sendMailRequest.DisplayName   = mailRegistration.Name;
            sendMailRequest.To            = new List <string>()
            {
                toEmail
            };
            sendMailRequest.CategoryID = (short)EmailNotificationsCategory.InvalidCouponReport;
            sendMailRequest.AccountID  = accountId;
            try
            {
                mailService.Send(sendMailRequest);
                success = true;
            }
            catch (Exception ex)
            {
                ex.Data.Clear();
                ex.Data.Add("AccountId", accountId);
                ex.Data.Add("UserID", userId);
                ex.Data.Add("TO Email", toEmail);
                Logger.Current.Error("Error while sending email through transaction provider ", ex);
                success = false;
            }
            return(success);
        }
Ejemplo n.º 8
0
        private IMailProvider GetEmailProvider(MailRegistrationDb mailRegistration)
        {
            switch (mailRegistration.MailProviderID)
            {
            case LM.MailProvider.MailChimp:
                return(new MailChimpCampaign(mailRegistration.APIKey));

            case LM.MailProvider.SmartTouch:
                return(new SmartTouchProvider());

            case LM.MailProvider.Undefined:
            case LM.MailProvider.Smtp:
            case LM.MailProvider.SendGrid:
            case LM.MailProvider.CustomSmartTouch:
            case LM.MailProvider.CustomMailChimp:
            default:
                break;
            }
            return(null);
        }
Ejemplo n.º 9
0
 public SmtpMailService(IUnitOfWork unitOfWork, Guid token, short parallelLoad = 10)
 {
     Logger.Current.Verbose("Request received for sending an email through smtp-mailservice");
     this.unitOfWork   = unitOfWork;
     this.parallelLoad = parallelLoad;
     registration      = this.unitOfWork.MailRegistrationsRepository.Single(mr => mr.Guid == token);
     if (registration != null && registration.Port.HasValue)
     {
         smtpClient = new SmtpClient(registration.Host, registration.Port.Value);
     }
     else
     {
         smtpClient = new SmtpClient(registration.Host);
     }
     smtpClient.Credentials = new NetworkCredential(registration.UserName, registration.Password);
     if (registration.Port.HasValue)
     {
         smtpClient.Port = registration.Port.Value;
     }
     smtpClient.EnableSsl = registration.IsSSLEnabled;
 }
Ejemplo n.º 10
0
 public VmtaMailService(IUnitOfWork unitOfWork, Guid token)
 {
     Logger.Current.Verbose("Request received for sending an email through vmta-mailservice");
     this.unitOfWork = unitOfWork;
     registration    = this.unitOfWork.MailRegistrationsRepository.Single(mr => mr.Guid == token);
 }
Ejemplo n.º 11
0
        public string SendCampaign(Campaign campaign, List <EmailRecipient> emails,
                                   IEnumerable <FieldValueOption> customFieldsValueOptions
                                   , string accountCode, string accountAddress, string accountDomain
                                   , string providerEmail, MailRegistrationDb mailRegistration)
        {
            Connection connection = null;

            try
            {
                connection = new Connection(
                    mailRegistration.Host, mailRegistration.Port ?? 25,
                    mailRegistration.UserName, mailRegistration.Password);

                /*
                 * HtmlEncode method encodes any special characters into their relavent html codes.
                 * */
                campaign.HTMLContent = campaign.HTMLContent; //.FormatHTML();

                var message = BuildMessage(campaign, accountDomain, accountCode, accountAddress, providerEmail,
                                           mailRegistration);

                for (var i = 0; i < emails.Count; i++)
                {
                    var item      = emails[i];
                    var recipient = new Recipient(item.EmailId);
                    recipient["*from"] = string.Format("{0}-{1}_{2}@bounce.{3}", item.CampaignRecipientID, accountCode,
                                                       campaign.Id, mailRegistration.SenderDomain);
                    recipient["*envid"] = item.CampaignRecipientID.ToString();
                    recipient["*parts"] = "1";
                    foreach (var mergeField in item.ContactFields)
                    {
                        recipient[mergeField.Key] = mergeField.Value;
                        // var key = mergeField.Key;
                        //// int fid = 0;
                        // var value = mergeField.Value;
                        // if (key.Contains("CF"))
                        // {
                        //     //int.TryParse(key.Replace("CF", ""), out fid);
                        //     //var SelectedValues = value.ToIntList();
                        //     //var customfieldoptions =
                        //     //    customFieldsValueOptions.Where(cf => cf.FieldId == fid && SelectedValues.Contains(cf.Id))
                        //     //        .Select(x => x.Value);
                        //     //string replacablecode = string.Join(",", customfieldoptions);
                        //     value = (string.IsNullOrEmpty(value) ? key : value);
                        //     recipient[mergeField.Key] = value;
                        // }
                        // else
                        // {

                        // }
                    }

                    message.AddRecipient(recipient);
                }

                SubmitWithTimeOut(connection, message, campaign.Id, campaign.Subject);
            }
            finally
            {
                connection?.Close();
            }
            return(string.Empty);
        }
Ejemplo n.º 12
0
        private Message BuildMessage(Campaign campaign, string accountDomain
                                     , string accountCode, string accountAddress
                                     , string providerEmail, MailRegistrationDb mailRegistration)
        {
            var    addressLine   = "<p style='margin-bottom:2px;margin-top:2px;'> " + accountAddress + "</p>";
            var    contentType   = campaign.CampaignTypeId == 132 ? "text/plain" : "text/html";
            String innerBoundary = campaign.IncludePlainText == true ? "--=_innerBoundary" : "";
            var    returnPath    = string.Format(providerEmail);
            var    message       = new Message(returnPath)
            {
                Verp       = true,
                VirtualMTA = mailRegistration.VMTA,
                JobID      = string.Format("{0}/{1}", accountCode, campaign.Id)
            };

            message.AddDateHeader();
            message.ReturnType = ReturnType.Headers;

            var discliamarAccounts = ConfigurationManager.AppSettings["EXCLUDING_DISCLIAMAR_ACCOUNTS"].ToString();

            Logger.Current.Informational("Campaign send successfully through VMTA AccountID" + campaign.AccountID);
            bool accountFound = discliamarAccounts.Contains(campaign.AccountID.ToString());
            var  index        = mailRegistration.ImageDomain.IndexOf("//");
            var  dotCount     = mailRegistration.ImageDomain.Count(d => d == '.');
            var  linkDomain   = accountDomain;

            if (index >= 0 && dotCount == 1)
            {
                linkDomain = mailRegistration.ImageDomain.Insert(index + 2, accountCode + ".");
            }

            var unsubscribeLink = string.Format(linkDomain.IndexOf("http") >= 0 ? "{0}/campaignUnsubscribe?crid=[CRID]&acct={1}" : "https://{0}/campaignUnsubscribe?crid=[CRID]&acct={1}", linkDomain, campaign.AccountID);
            var headers         = BuildMergeHeader(campaign, accountCode, mailRegistration.SenderDomain, returnPath, unsubscribeLink, providerEmail, innerBoundary);

            if (string.Equals(ConfigurationManager.AppSettings["INCLUDE_VMTA_ENVID"], "YES", StringComparison.OrdinalIgnoreCase))
            {
                message.EnvID = campaign.Id.ToString();
            }
            message.AddMergeData(headers);

            var regex       = new Regex(@"\*\|\w+\|\*", RegexOptions.IgnoreCase | RegexOptions.Singleline);
            var matches     = regex.Matches(campaign.HTMLContent);
            var mergeFields = new List <string>();

            foreach (Match match in matches)
            {
                mergeFields.Add(match.Value.Replace("*|", string.Empty).Replace("|*", string.Empty));
            }

            campaign.HTMLContent = campaign.HTMLContent.Replace("*|", "[").Replace("|*", "]");

            if (campaign.CampaignTypeId == 132)
            {
                var recipientInfoLine = (campaign.HasDisclaimer.Value == false && accountFound) ? "" : "\r\n\r\n\r\n\r\nThis e-mail was sent to [EMAILID] by " + campaign.SenderName + " " + campaign.From + ". \r\n";
                var unsubscribeLine   = (campaign.HasDisclaimer.Value == false && accountFound) ? "Click the following link to opt out from mailing list: \r\n" + unsubscribeLink + "\r\n" : "Click the following link to unsubscribe: \r\n" + unsubscribeLink + "\r\n";
                if (campaign.HasDisclaimer.Value == false && accountFound)
                {
                    accountAddress = string.Empty;
                }

                var footer = recipientInfoLine + accountAddress + "\r\n" + unsubscribeLine;

                message.AddMergeData(string.Concat(campaign.HTMLContent, footer));
            }
            else
            {
                if (campaign.IncludePlainText == true && !string.IsNullOrEmpty(campaign.PlainTextContent))
                {
                    Logger.Current.Verbose("Adding plain text boundary");
                    var plainTextMergeFields = new List <string>();
                    var pMatches             = regex.Matches(campaign.PlainTextContent);
                    foreach (Match match in pMatches)
                    {
                        plainTextMergeFields.Add(match.Value.Replace("*|", string.Empty).Replace("|*", string.Empty));
                    }

                    campaign.PlainTextContent = campaign.PlainTextContent.Replace("*|", "[").Replace("|*", "]");

                    var plainTextContent = "\n\n" + innerBoundary + "\n"
                                           + "Content-Disposition: inline;" + "\n"
                                           + "Content-Type: text/plain; charset=utf-8" + "\n\n"
                                           + campaign.PlainTextContent + "\n";
                    message.AddMergeData(plainTextContent);
                }
                message.AddData("\n\n" + innerBoundary + "\n");

                if (campaign.IncludePlainText == true)
                {
                    message.AddData("Content-Disposition: inline;" + "\n");
                    message.AddData("Content-Type: text/html; charset=utf-8" + "\n\n");
                }
                var unsubscribeLine   = string.Empty;
                var recipientInfoLine = "<p style='margin-bottom:2px;margin-top:2px;'> This e-mail was sent to "
                                        + "[EMAILID] by " + campaign.SenderName + " &lt;" + campaign.From + "&gt;. </p>";

                if (campaign.HasDisclaimer.Value == false && accountFound)
                {
                    unsubscribeLine = " <p style='margin-bottom:2px;margin-top:2px;'> <a href='" + unsubscribeLink + "' style='color: #808080;'>Click here to opt out from mailing list</a></p>";
                }
                else
                {
                    unsubscribeLine = " <p style='margin-bottom:2px;margin-top:2px;'> <a href='" + unsubscribeLink + "' style='color: #808080;'>Unsubscribe</a></p>";
                }

                var htmlWrapper = "<!DOCTYPE html PUBLIC \" -//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n<html>\r\n"
                                  + "<head>\r\n<meta name=\"robots\" content=\"noindex\">\r\n<meta http-equiv=\"Content-Type\" content=\"text/html\"; charset=utf-8\">\r\n<title></title>\r\n</head>\r\n<body>\r\n " + campaign.HTMLContent + "\r\n</body>\r\n</html>";
                var footer = "<div style='color: #808080; font-family: Arial, Verdana, Helvetica; font-size: 8pt; font-weight: bold; width: 80%; text-align: center;margin: auto; '>"
                             + ((campaign.HasDisclaimer.Value == false && accountFound) ? "" : recipientInfoLine)
                             + ((campaign.HasDisclaimer.Value == false && accountFound) ? "" : addressLine)
                             + unsubscribeLine + "</div>";

                message.AddMergeData(string.Concat(htmlWrapper, footer));
                if (campaign.IncludePlainText == true)
                {
                    message.AddData("\n\n" + innerBoundary + "--\n\n");
                }
            }

            return(message);
        }
Ejemplo n.º 13
0
        public static void Trigger(object stateInfo)
        {
            try
            {
                if (dailySummaryInprogress)
                {
                    return;
                }
                dailySummaryInprogress = true;
                Logger.Current.Verbose("WebVisit DailySummary Processor triggered");

                string includeToday = System.Configuration.ConfigurationManager.AppSettings["INCLUDE_CURRENT_DAY_IN_DAILY_SUMMARY"].ToLower();

                var webAnalyticProviders = accountRepository.GetWebAnalyticsProviders();

                var accounts = webAnalyticProviders.Select(a => a.AccountID);

                var startDate = DateTime.Now.ToUniversalTime().Date.AddDays(-1);
                var endDate   = includeToday == "true" ? DateTime.Now.ToUniversalTime() : DateTime.Now.ToUniversalTime().Date;


                foreach (var accountId in accounts)
                {
                    Logger.Current.Informational("Current Account:", accountId.ToString());

                    var account = accountRepository.GetAccountBasicDetails(accountId);

                    var webAnalyticProvider = webAnalyticProviders.Where(p => p.AccountID == accountId).FirstOrDefault() ?? new WebAnalyticsProvider();

                    var accountInfo = new AccountBasicInfo()
                    {
                        AccountID      = accountId,
                        AccountName    = account.AccountName,
                        TimeZone       = account.TimeZone,
                        WebAnalyticsID = webAnalyticProvider.Id
                    };


                    GetDropdownValueResponse lifeCycleStages = dropdownService.GetDropdownValue(new GetDropdownValueRequest()
                    {
                        AccountId = accountInfo.AccountID, DropdownID = (byte)DropdownFieldTypes.LifeCycle
                    });

                    var emailProviderResponse = communicationService.GetEmailProviders(new GetEmailProvidersRequest()
                    {
                        AccountId = accountInfo.AccountID
                    });
                    if (emailProviderResponse.Exception != null)
                    {
                        throw emailProviderResponse.Exception;
                    }

                    var communicationResponse = communicationService.GetDefaultCampaignEmailProvider(new GetDefaultCampaignEmailProviderRequest()
                    {
                        AccountId = accountInfo.AccountID
                    });
                    var serviceProviderGuids            = emailProviderResponse.ServiceProviderGuids;
                    MailRegistrationDb mailRegistration = mailService.GetVMTADetails(serviceProviderGuids);
                    var    providerDetails      = accountService.GetTransactionalProviderDetails(accountInfo.AccountID);
                    string emailContentToAdmins = string.Empty;
                    try
                    {
                        TimeZoneInfo accountTzInfo = TimeZoneInfo.FindSystemTimeZoneById(accountInfo.TimeZone);
                        startDate = TimeZoneInfo.ConvertTimeFromUtc(startDate, accountTzInfo);
                        endDate   = includeToday == "true" ? endDate : TimeZoneInfo.ConvertTimeFromUtc(endDate, accountTzInfo);

                        Logger.Current.Informational("StartDate After: " + startDate);
                        Logger.Current.Informational("StartDate After: " + endDate);

                        GetWebVisitDailySummaryResponse response = webAnalyticsService.GetWebVisitDailySummary(new GetWebVisitDailySummaryRequest()
                        {
                            AccountId = accountInfo.AccountID, StartDate = startDate, EndDate = endDate
                        });

                        GetUsersOptedWebVisitSummaryEmailResponse users = userService.GetUsersOptedWebVisitSummaryEmail(new GetUsersOptedWebVisitSummaryEmailRequest()
                        {
                            AccountId = accountInfo.AccountID
                        });

                        byte status = accountRepository.GetAccountStatus(accountInfo.AccountID);

                        if (status != (byte)AccountStatus.Suspend)
                        {
                            string emailCopyContent = string.Empty;
                            #region Send Mail To Owner
                            foreach (UserBasicInfo userInfo in users.AllUsers)
                            {
                                Logger.Current.Informational("Sending daily summary email to user: "******". To owner: " + userInfo.Email);
                                try
                                {
                                    List <WebVisitReport> relatedVisits = response.WebVisits.Where(c => c.OwnerID == userInfo.UserID).OrderBy(c => c.VisitedOn).ToList();

                                    string emailContent = GetEmailContent(accountInfo, relatedVisits, lifeCycleStages, userInfo.FirstName + " " + userInfo.LastName);
                                    if (emailContent.Length > 0)
                                    {
                                        emailCopyContent = emailCopyContent + emailContent + "<br><hr>";
                                    }

                                    if (webAnalyticProvider.DailyStatusEmailOpted && emailContent.Length > 0)
                                    {
                                        NotifyByEmail(accountInfo, "SmartTouch Web Visit Daily Summary", providerDetails, userInfo.Email, emailContent);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Logger.Current.Error("Error occured while sending web visit daily summary emails for account user: "******" " + userInfo.Email, ex);
                                }
                            }
                            #endregion

                            #region Send Mail To Opted User
                            //add no owner visits to html
                            List <WebVisitReport> unassignedVisits = response.WebVisits.Where(v => ((v.OwnerID.HasValue) ? v.OwnerID.Value == 1 : v.OwnerID == null)).OrderBy(c => c.VisitedOn).ToList();
                            emailCopyContent += GetEmailContent(accountInfo, unassignedVisits, lifeCycleStages, "Not Assigned");
                            foreach (UserBasicInfo userInfo in users.UsersOpted)
                            {
                                Logger.Current.Informational("ADMIN - Sending daily summary email to user: "******". To owner: " + userInfo.Email);
                                try
                                {
                                    if (emailCopyContent.Length > 0)
                                    {
                                        NotifyByEmail(accountInfo, "SmartTouch Web Visit Daily Summary", providerDetails, userInfo.Email, emailCopyContent + "<br>");
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Logger.Current.Error("Error occured while sending Opted User Daily Web Visit Daily Summary email for user: "******" " + userInfo.Email, ex);
                                }
                            }
                            #endregion
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Current.Error("Error occured while sending web visit daily summary emails for account: " + accountInfo, ex);
                    }
                }

                dailySummaryInprogress = false;
                Logger.Current.Informational("Completed processing daily summary emails");
            }
            catch (Exception ex)
            {
                dailySummaryInprogress = false;
                Logger.Current.Error("Error occured while sending web visit daily summary emails", ex);
            }
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Send Campaign through VMTA for test email
        /// </summary>
        /// <param name="campaignId"></param>
        /// <param name="campaignName"></param>
        /// <param name="contactTagIds"></param>
        /// <param name="searchDefinitionIds"></param>
        /// <param name="emails"></param>
        /// <param name="Companies">Obsolete</param>
        /// <param name="customFieldsValueOptions"></param>
        /// <param name="title"></param>
        /// <param name="subject"></param>
        /// <param name="content"></param>
        /// <param name="fromEmail"></param>
        /// <param name="fromName"></param>
        /// <param name="accountCode"></param>
        /// <param name="senderDomain"></param>
        /// <param name="accountDomain"></param>
        /// <param name="vmtaEmail"></param>
        /// <param name="accountAddress"></param>
        /// <param name="listName"></param>
        /// <param name="accountId"></param>
        /// <returns></returns>
        public IList <int> SendCampaignFromScheduler(int campaignId, string campaignName, List <int> contactTagIds, List <int> searchDefinitionIds, IEnumerable <EmailRecipient> emails
                                                     , IEnumerable <Company> Companies, IEnumerable <FieldValueOption> customFieldsValueOptions, string title, string subject, string content, string fromEmail
                                                     , string fromName, string accountCode, string senderDomain, string accountDomain, string vmtaEmail, string accountAddress, int accountId, byte?campaignTypeId, MailRegistrationDb mailRegistration, bool hasDisCliamer, string listName = null)
        {
            #region Variables Declaration
            var            count                = emails.Count();
            string         returnPath           = string.Empty;
            EmailRecipient item                 = null;
            Message        msg                  = null;
            IList <int>    successfulRecipients = new List <int>();
            #endregion

            var includeVMTAENVId = ConfigurationManager.AppSettings["INCLUDE_VMTA_ENVID"].ToString();
            content = content.Replace("*|CAMPID|*", campaignId.ToString()).Replace("<o:p>", "").Replace("</o:p>", "");//.FormatHTML();
            var        contentType        = campaignTypeId == 132 ? "text/plain" : "text/html";
            var        discliamarAccounts = ConfigurationManager.AppSettings["EXCLUDING_DISCLIAMAR_ACCOUNTS"].ToString();
            bool       accountFound       = discliamarAccounts.Contains(accountId.ToString());
            Connection con = new Connection(host, port, userName, password);
            if (con == null)
            {
                return(successfulRecipients);
            }

            var addressLine = "<p style='margin-bottom:2px;margin-top:2px;'> " + accountAddress + "</p>";

            for (var i = 0; i < count; i++)
            {
                item = emails.ToArray()[i];
                try
                {
                    returnPath = item.CampaignRecipientID.ToString() + "-" + accountCode + "_" + campaignId + "@bounce." + senderDomain;
                    msg        = new Message(returnPath);
                    if (msg == null)
                    {
                        continue;
                    }
                    msg.AddDateHeader();
                    msg.ReturnType = ReturnType.Headers;
                    var index      = mailRegistration.ImageDomain.IndexOf("//");
                    var dotCount   = mailRegistration.ImageDomain.Count(d => d == '.');
                    var linkDomain = accountDomain;
                    if (index >= 0 && dotCount == 1)
                    {
                        linkDomain = mailRegistration.ImageDomain.Insert(index + 2, accountCode + ".");
                    }
                    //var unsubscribeLink = "https://" + linkDomain + "/campaignUnsubscribe?crid=" + item.CampaignRecipientID.ToString() + "&acct=" + accountId;
                    var unsubscribeLink = string.Format(linkDomain.IndexOf("http") >= 0 ? "{0}/campaignUnsubscribe?crid=[CRID]&acct={1}" : "https://{0}/campaignUnsubscribe?crid=[CRID]&acct={1}", linkDomain, accountId);

                    String headers = BuildHeader(campaignId, subject, accountCode, item, returnPath, unsubscribeLink, fromName, fromEmail, vmtaEmail, senderDomain, campaignTypeId);

                    if (includeVMTAENVId == "YES")
                    {
                        msg.EnvID = item.CampaignRecipientID.ToString();
                    }

                    msg.Verp       = true;
                    msg.VirtualMTA = vmta;
                    msg.JobID      = accountCode + "/" + campaignId;
                    msg.AddData(headers);
                    var contentSb = new StringBuilder(content, content.Length * 2);
                    contentSb.Replace("*|CID|*", item.ContactId.ToString()).Replace("*|CAMPID|*", campaignId.ToString()).Replace("*|CRID|*", item.CampaignRecipientID.ToString()).Replace("<o:p>", "").Replace("</o:p>", "");
                    var    body = contentSb.ToString();
                    string mergedhtmlcontent = item.ContactFields != null?ReplaceMergeFields(body, item.ContactInfo, customFieldsValueOptions, null, item.ContactFields) : body;

                    var unsubscribeLine = string.Empty;

                    var recipientInfoLine = "<p style='margin-bottom:2px;margin-top:2px;'> This e-mail was sent to "
                                            + item.EmailId + " by " + fromName + " &lt;" + fromEmail + "&gt;. </p>";
                    if (accountFound && !hasDisCliamer)
                    {
                        unsubscribeLine = " <p style='margin-bottom:2px;margin-top:2px;'> <a href='" + unsubscribeLink + "' style='color: #808080;'>Click here to opt out from mailing list</a></p>";
                    }
                    else
                    {
                        unsubscribeLine = " <p style='margin-bottom:2px;margin-top:2px;'> <a href='" + unsubscribeLink + "' style='color: #808080;'>Unsubscribe</a></p>";
                    }

                    var htmlWrapper = "<!DOCTYPE html PUBLIC \" -//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n<html>\r\n"
                                      + "<head>\r\n"
                                      + "<meta name='robots' content='noindex'>\r\n"
                                      + "<meta http-equiv=\"Content-Type\" content=\"" + contentType + "; charset=utf-8\">\r\n<title></title>\r\n</head>\r\n<body>\r\n*|CONTENT|*\r\n</body>\r\n</html>";
                    var footer = "<div style='color: #808080; font-family: Arial, Verdana, Helvetica; font-size: 8pt; font-weight: bold;margin: auto;width: 80%;text-align: center;'>"
                                 + ((accountFound && !hasDisCliamer) ? "" : recipientInfoLine)
                                 + ((accountFound && !hasDisCliamer) ? "" : addressLine)
                                 + unsubscribeLine + "</div>";


                    mergedhtmlcontent = campaignTypeId == 132 ? body : htmlWrapper.Replace("*|CONTENT|*", mergedhtmlcontent + footer);
                    msg.AddData(mergedhtmlcontent);

                    String textHeaders = headers.Replace("Content-Type: text/html;", "Content-Type: text/plain;");
                    msg.BeginPart(2);
                    msg.AddData(textHeaders);
                    msg.AddData(mergedhtmlcontent);
                    Recipient recipient = new Recipient(item.EmailId);
                    msg.AddRecipient(recipient);
                    SubmitWithTimeOut(con, msg, campaignId, subject);
                    successfulRecipients.Add(item.CampaignRecipientID);
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Unable to send campaign to: " + item.EmailId + ". Error:", ex);
                }
            }
            return(successfulRecipients);
        }
        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);
            }
        }
 public static RegisterMailRequest ToSmtpMailRegistrationRequest(this MailRegistrationDb mailRegistraion)
 {
     throw new NotImplementedException();
 }