Esempio n. 1
0
        /// <summary>
        /// Sends a campaign to specified emails
        /// </summary>
        /// <param name="campaign">Campaign</param>
        /// <param name="emailAccount">Email account</param>
        /// <param name="subscriptions">Subscriptions</param>
        /// <returns>Total emails sent</returns>
        public virtual int SendCampaign(Campaign campaign, EmailAccount emailAccount,
                                        IEnumerable <NewsLetterSubscription> subscriptions, int languageId, List <int> Categories, DateTime startDate, DateTime?endDate, int itemCount)
        {
            if (campaign == null)
            {
                throw new ArgumentNullException("campaign");
            }

            if (emailAccount == null)
            {
                throw new ArgumentNullException("emailAccount");
            }

            int  totalEmailsSent    = 0;
            bool hasProductsToken   = campaign.Body.IndexOf("%Store.RecentProducts%") > 0;
            bool hasBuyingRequests  = campaign.Body.IndexOf("%Store.RecentProductBuyingRequests%") > 0;
            var  productDates       = new NewsletterDates();
            var  buyingRequestDates = new NewsletterDates();
            var  tokens             = new List <Token>();

            if (hasProductsToken)
            {
                productDates = _newsletterDatesService.GetAllNewsletterDates().Where(x => x.LanguageId == languageId && x.IsProduct).FirstOrDefault();
                if (endDate == null)
                {
                    startDate = productDates.LastSubmit;
                }
                _messageTokenProvider.AddRecentProductsToken(tokens, languageId, Categories, startDate, endDate, itemCount);
            }
            if (hasBuyingRequests)
            {
                buyingRequestDates = _newsletterDatesService.GetAllNewsletterDates().Where(x => x.LanguageId == languageId && !x.IsProduct).FirstOrDefault();
                if (endDate == null)
                {
                    startDate = buyingRequestDates.LastSubmit;
                }
                _messageTokenProvider.AddRecentBuyingRequestsToken(tokens, languageId, Categories, startDate, endDate, itemCount);
            }

            foreach (var subscription in subscriptions.Where(x => x.LanguageId == languageId))
            {
                var tokensTemp = new List <Token>();
                tokensTemp.AddRange(tokens);
                _messageTokenProvider.AddStoreTokens(tokensTemp);
                _messageTokenProvider.AddNewsLetterSubscriptionTokens(tokensTemp, subscription);

                var customer = _customerService.GetCustomerByEmail(subscription.Email);
                if (customer != null)
                {
                    _messageTokenProvider.AddCustomerTokens(tokensTemp, customer);
                }

                string subject = _tokenizer.Replace(campaign.Subject, tokensTemp, false);
                string body    = _tokenizer.Replace(campaign.Body, tokensTemp, true);

                var email = new QueuedEmail()
                {
                    Priority       = 3,
                    From           = emailAccount.Email,
                    FromName       = emailAccount.DisplayName,
                    To             = subscription.Email,
                    Subject        = subject,
                    Body           = body,
                    CreatedOnUtc   = DateTime.UtcNow,
                    EmailAccountId = emailAccount.Id
                };
                _queuedEmailService.InsertQueuedEmail(email);
                totalEmailsSent++;
            }
            if (hasProductsToken)
            {
                productDates.LastSubmit = DateTime.UtcNow;
                _newsletterDatesService.UpdateNewsletterDates(productDates);
            }
            if (hasBuyingRequests)
            {
                buyingRequestDates.LastSubmit = DateTime.UtcNow;
                _newsletterDatesService.UpdateNewsletterDates(buyingRequestDates);
            }

            return(totalEmailsSent);
        }
Esempio n. 2
0
        public ActionResult SendTestEmail(CampaignModel model, List <TreeViewItem> category_treeview_checkedNodes)
        {
            if (!_permissionService.Authorize(StandardPermissionProvider.ManageCampaigns))
            {
                return(AccessDeniedView());
            }
            List <int> categoryList;

            if (model.EnableTimePeriod)
            {
                categoryList = category_treeview_checkedNodes.Where(x => x.Checked).Select(x => int.Parse(x.Value)).ToList();
            }
            else
            {
                categoryList = _categoryService.GetAllCategories(showHidden: true).Select(x => x.Id).ToList();
            }
            if (!CheckLocales(model) || categoryList.Count == 0 || (ModelState["StartDate"] != null && ModelState["StartDate"].Errors.Count > 0) || model.CompaignLanguages.Where(x => x.Selected).Count() == 0 || (model.EnableTimePeriod && !model.EndDate.HasValue))
            {
                if (model.CompaignLanguages.Where(x => x.Selected).Count() == 0)
                {
                    AddNotification(NotifyType.Error, _localizationService.GetResource("Admin.ETF.Languages.One"), false);
                }
                if (model.EnableTimePeriod && !model.EndDate.HasValue)
                {
                    AddNotification(NotifyType.Error, _localizationService.GetResource("Admin.ETF.Campaign.EndDate"), false);
                }
                var lang = model.CompaignLanguages.Where(x => x.LanguageName != null).FirstOrDefault();
                if (lang != null)
                {
                    string Error = String.Format(_localizationService.GetResource("Admin.Campaign.LocaleError", _workContext.WorkingLanguage.Id), lang.LanguageName, _languageService.GetLanguageById(lang.LanguageId).Name);
                    AddNotification(NotifyType.Error, Error, false);
                }
                model.CompaignLanguages = _languageService.GetAllLanguages()
                                          .Select(x => new CompaignLanguage()
                {
                    LanguageId   = x.Id,
                    LanguageName = x.Name,
                    Selected     = false
                }).ToList();
                model.AllowedTokens  = FormatTokens(_messageTokenProvider.GetListOfCampaignAllowedTokens());
                model.CategoriesTree = new List <TreeViewItemModel>();
                model.CategoriesTree = PrepareTreeView(model.CategoriesTree, 0);
                return(View(model));
            }
            var campaign = _campaignService.GetCampaignById(model.Id);

            if (campaign == null)
            {
                //No campaign found with the specified id
                return(RedirectToAction("List"));
            }

            model.AllowedTokens = FormatTokens(_messageTokenProvider.GetListOfCampaignAllowedTokens());
            if (!model.EnableTimePeriod)
            {
                model.EndDate = null;
            }
            foreach (var lang in model.CompaignLanguages.Where(x => x.Selected))
            {
                campaign.Body    = campaign.GetLocalized(x => x.Body, lang.LanguageId);
                campaign.Subject = campaign.GetLocalized(x => x.Subject, lang.LanguageId);
                try
                {
                    var emailAccount = _emailAccountService.GetAllEmailAccounts().Where(x => x.DisplayName == "TradeBel newsletter").FirstOrDefault();
                    if (emailAccount == null)
                    {
                        throw new NopException("Email account could not be loaded");
                    }
                    if (!model.EnableTimePeriod)
                    {
                        model.StartDate = _newsletterDatesService.GetAllNewsletterDates().Where(x => x.LanguageId == lang.LanguageId).FirstOrDefault().LastSubmit;
                        model.EndDate   = null;
                    }

                    //no subscription found
                    _campaignService.SendCampaign(campaign, emailAccount, model.TestEmail, lang.LanguageId, categoryList, model.StartDate, model.EndDate, model.NumberOfItems);

                    model.CompaignLanguages = _languageService.GetAllLanguages()
                                              .Select(x => new CompaignLanguage()
                    {
                        LanguageId   = x.Id,
                        LanguageName = x.Name,
                        Selected     = false
                    }).ToList();
                    SuccessNotification(_localizationService.GetResource("Admin.Promotions.Campaigns.TestEmailSentToCustomers"), false);
                }
                catch (Exception exc)
                {
                    ErrorNotification(exc, false);
                }
            }

            model.CompaignLanguages = _languageService.GetAllLanguages()
                                      .Select(x => new CompaignLanguage()
            {
                LanguageId   = x.Id,
                LanguageName = x.Name,
                Selected     = false
            }).ToList();
            model.CategoriesTree = new List <TreeViewItemModel>();
            model.CategoriesTree = PrepareTreeView(model.CategoriesTree, 0);
            //If we got this far, something failed, redisplay form
            return(View(model));
        }