/// <summary> /// Gets and bulk updates subscribers. Called when the "Get and bulk update subscribers" button is pressed. /// Expects the CreateSubscriber method to be run first. /// </summary> private bool GetAndBulkUpdateSubscribers() { // Prepare the parameters string where = "SubscriberEmail LIKE N'[email protected]%'"; // Get the data DataSet subscribers = SubscriberInfoProvider.GetSubscribers(where, null); if (!DataHelper.DataSourceIsEmpty(subscribers)) { // Loop through the individual items foreach (DataRow subscriberDr in subscribers.Tables[0].Rows) { // Create object from DataRow SubscriberInfo modifySubscriber = new SubscriberInfo(subscriberDr); // Update the properties modifySubscriber.SubscriberFullName = modifySubscriber.SubscriberFullName.ToUpper(); // Save the changes SubscriberInfoProvider.SetSubscriberInfo(modifySubscriber); } return(true); } return(false); }
/// <summary> /// Creates and sends unsubscription e-mail. /// </summary> /// <param name="subscriber">Subscriber object</param> /// <param name="news">Newsletter object</param> /// <param name="subscription">Subscription object</param> /// <param name="siteName">Site name</param> protected void SendUnsubscriptionRequest(SubscriberInfo subscriber, NewsletterInfo news, SubscriberNewsletterInfo subscription, string siteName) { // Get global e-mail template with unsubscription request EmailTemplateInfo et = EmailTemplateProvider.GetEmailTemplate("newsletter.unsubscriptionrequest", siteName); if (et != null) { // Get subscriber member SortedDictionary <int, SubscriberInfo> subscribers = SubscriberInfoProvider.GetSubscribers(subscriber, 1, 0); foreach (KeyValuePair <int, SubscriberInfo> item in subscribers) { // Get 1st subscriber's member SubscriberInfo sb = item.Value; string body = et.TemplateText; string plainBody = et.TemplatePlainText; // Resolve newsletter macros (first name, last name etc.) IssueHelper ih = new IssueHelper(); if (ih.LoadDynamicFields(sb, news, subscription, null, false, siteName, null, null, null)) { body = ih.ResolveDynamicFieldMacros(body); plainBody = ih.ResolveDynamicFieldMacros(plainBody); } // Create e-mail EmailMessage msg = new EmailMessage(); msg.EmailFormat = EmailFormatEnum.Default; msg.From = EmailHelper.GetSender(et, news.NewsletterSenderEmail); msg.Recipients = sb.SubscriberEmail; msg.BccRecipients = et.TemplateBcc; msg.CcRecipients = et.TemplateCc; msg.Subject = ResHelper.LocalizeString(et.TemplateSubject); msg.Body = URLHelper.MakeLinksAbsolute(body); msg.PlainTextBody = URLHelper.MakeLinksAbsolute(plainBody); // Add attachments and send e-mail MetaFileInfoProvider.ResolveMetaFileImages(msg, et.TemplateID, EmailObjectType.EMAILTEMPLATE, MetaFileInfoProvider.OBJECT_CATEGORY_TEMPLATE); EmailSender.SendEmail(siteName, msg); } } else { // Log missing template EventLogProvider ev = new EventLogProvider(); ev.LogEvent(EventLogProvider.EVENT_TYPE_ERROR, DateTime.Now, "UnsubscriptionRequest", "Unsubscription request e-mail template is missing."); } }
private void InitializeSubscribersForNewsletter(IssueInfo issue, NewsletterInfo newsletter) { var subscribers = SubscriberInfoProvider .GetSubscribers() .TopN(MAX_PREVIEW_SUBSCRIBERS) .WhereIn("SubscriberID", new IDQuery(SubscriberNewsletterInfo.OBJECT_TYPE, "SubscriberID") .WhereEquals("NewsletterID", issue.IssueNewsletterID) .Where(w => w.WhereTrue("SubscriptionApproved") .Or() .WhereNull("SubscriptionApproved"))); int subscriberIndex = 0; foreach (var subscriber in subscribers) { var member = SubscriberInfoProvider.GetSubscribers(subscriber, 1).FirstOrDefault(); if (member == null) { continue; } var emailViewer = new EmailViewer(issue, newsletter, member, true); var identifier = GetSubscriberIdentifier(member, subscriber.SubscriberType); var subject = GetEncodedSubscriberSubject(emailViewer); var preheader = GetEncodedSubscriberPreheader(emailViewer); subjects.Add(subject); preheaders.Add(preheader); emails.Add(HttpUtility.UrlEncode(member.SubscriberEmail)); drpSubscribers.Items.Add(new ListItem(identifier, subscriberIndex.ToString())); subscriberIndex++; } if (!SubscriberExists()) { DisableSubscribersDropDownList(); var emailViewer = new EmailViewer(issue, newsletter, null, true); InitializeZeroSubscribers(emailViewer.GetSubject(), emailViewer.GetPreheader()); } }
/// <summary> /// Builds where condition with subscriber IDs from main DB who meet base filter condition. /// </summary> /// <param name="baseCondition">Base condition</param> /// <param name="subscriberCondition">Condition for subscribers from main DB</param> /// <param name="useView">Indicates if subscriber view should be used</param> protected string BuildCondition(string baseCondition, string subscriberCondition, bool useView) { string result = string.Empty; // Get IDs of subscribers from current site who meet the original condition string tempWhere = SqlHelper.AddWhereCondition("SubscriberSiteID=" + SiteContext.CurrentSiteID, subscriberCondition); DataSet ds = null; if (useView) { ds = SubscriberInfoProvider.GetSubscribersFromView().Where(tempWhere).Column("SubscriberID"); } else { ds = SubscriberInfoProvider.GetSubscribers().Where(tempWhere).Column("SubscriberID"); } if (!DataHelper.DataSourceIsEmpty(ds)) { List <string> subscriberIDs = DataHelper.GetStringValues(ds.Tables[0], "SubscriberID"); string subscriberIDCond = string.Empty; int maxItems = 10000; int maxToProcess = 0; do { maxToProcess = (subscriberIDs.Count > maxItems) ? maxItems : subscriberIDs.Count; // Get condition in form 'SubscriberID IN (....)' with maximally 10.000 items subscriberIDCond = SqlHelper.AddWhereCondition(subscriberIDCond, SqlHelper.GetWhereCondition <string>("SubscriberID", subscriberIDs.GetRange(0, maxToProcess), false), "OR"); subscriberIDs.RemoveRange(0, maxToProcess); }while (subscriberIDs.Count > 0); // Add the condition that only clasic subscribers should be filtered with the IDs condition result = SqlHelper.AddWhereCondition("SubscriberID>0", subscriberIDCond); } // Add original condition for contact group members return(SqlHelper.AddWhereCondition(result, string.Format("(SubscriberID=0 AND {0})", baseCondition), "OR")); }
/// <summary> /// Gets and bulk updates subscribers. Called when the "Get and bulk update subscribers" button is pressed. /// Expects the CreateSubscriber method to be run first. /// </summary> private bool GetAndBulkUpdateSubscribers() { // Get the data var subscribers = SubscriberInfoProvider.GetSubscribers().Where("SubscriberEmail", QueryOperator.Like, "[email protected]%"); if (subscribers.Any()) { // Loop through the individual items foreach (var subscriber in subscribers) { // Update the properties subscriber.SubscriberFullName = subscriber.SubscriberFullName.ToUpper(); // Save the changes SubscriberInfoProvider.SetSubscriberInfo(subscriber); } return(true); } return(false); }
private string GetPreviewScriptForNewsletter(IssueInfo issue, NewsletterInfo newsletter, IssueHelper issueHelper) { string script; string siteName = SiteContext.CurrentSiteName; // Get specific number of subscribers subscribed to the newsletter DataSet subscribers = SubscriberInfoProvider .GetSubscribers() .TopN(MAX_PREVIEW_SUBSCRIBERS) .WhereIn("SubscriberID", new IDQuery(SubscriberNewsletterInfo.OBJECT_TYPE, "SubscriberID") .WhereEquals("NewsletterID", issue.IssueNewsletterID) .Where(w => w.WhereTrue("SubscriptionApproved") .Or() .WhereNull("SubscriptionApproved"))); if (!DataHelper.DataSourceIsEmpty(subscribers)) { // Limit max subscribers count to number of rows int maxCount = subscribers.Tables[0].Rows.Count; // Generate javascript based on subscribers script = InitializePreviewScript(issue, maxCount); for (int i = 0; i < maxCount; i++) { // Get subscriber SubscriberInfo subscriber = new SubscriberInfo(subscribers.Tables[0].Rows[i]); // Insert subscriber GUID script = string.Format("{0} guid[{1}] = '{2}'; \n ", script, i, subscriber.SubscriberGUID); // Get subscriber's member SortedDictionary <int, SubscriberInfo> subMembers = SubscriberInfoProvider.GetSubscribers(subscriber, 1); if ((subMembers != null) && (subMembers.Count > 0)) { foreach (KeyValuePair <int, SubscriberInfo> item in subMembers) { // Get 1st subscriber's member SubscriberInfo sbMember = item.Value; if (sbMember != null) { // Create information line string infoLine = ScriptHelper.GetString(sbMember.SubscriberEmail, false); // Add info about subscriber type if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACTGROUP, true)) { infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contactgroup").ToLowerCSafe()); } else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACT, true)) { infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contact").ToLowerCSafe()); } script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, HTMLHelper.HTMLEncode(infoLine)); // Create resolved subject script = string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(GetPreviewSubject(issue, newsletter, issueHelper, sbMember, siteName)))); } } } else { // Get generic name for external subscribers var related = BaseAbstractInfoProvider.GetInfoById(subscriber.SubscriberType, subscriber.SubscriberRelatedID); script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, HTMLHelper.HTMLEncode(TypeHelper.GetNiceObjectTypeName(subscriber.SubscriberType) + " \"" + HTMLHelper.HTMLEncode(related.Generalized.ObjectDisplayName) + "\"")); // Create resolved subject return(string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(GetPreviewSubject(issue, newsletter, issueHelper, null, siteName))))); } } } else { return(InitializePreviewScriptForZeroSubscribers(issue, GetPreviewSubject(issue, newsletter, issueHelper, null, siteName))); } return(script); }
protected void Page_Load(object sender, EventArgs e) { // Get Issue object IssueInfo issue = (IssueInfo)UIContext.EditedObject; if ((issue == null) || (issue.IssueSiteID != SiteContext.CurrentSiteID)) { return; } // Get newsletter object NewsletterInfo news = NewsletterInfoProvider.GetNewsletterInfo(issue.IssueNewsletterID); string subject = null; IssueHelper ih = new IssueHelper(); string siteName = SiteContext.CurrentSiteName; // Get specific number of subscribers subscribed to the newsletter DataSet subscribers = SubscriberInfoProvider .GetSubscribers() .TopN(MAX_PREVIEW_SUBSCRIBERS) .WhereIn("SubscriberID", new IDQuery(SubscriberNewsletterInfo.OBJECT_TYPE, "SubscriberID") .WhereEquals("NewsletterID", issue.IssueNewsletterID) .Where(w => w.WhereTrue("SubscriptionApproved") .Or() .WhereNull("SubscriptionApproved")) .Where(w => w.WhereTrue("SubscriptionEnabled") .Or() .WhereNull("SubscriptionEnabled")) ); string script; if (!DataHelper.DataSourceIsEmpty(subscribers)) { // Limit max subscribers count to number of rows int maxCount = subscribers.Tables[0].Rows.Count; // Generate javascript based on subscribers script = string.Format( @"var currentSubscriberIndex = 0; var newsletterIssueId ={0}; var guid = new Array({1}); var email = new Array({1}); var subject = new Array({1}); var subscribers = new Array(guid, email);", issue.IssueID, maxCount); for (int i = 0; i < maxCount; i++) { // Get subscriber SubscriberInfo subscriber = new SubscriberInfo(subscribers.Tables[0].Rows[i]); // Insert subscriber GUID script = string.Format("{0} guid[{1}] = '{2}'; \n ", script, i, subscriber.SubscriberGUID); // Get subscriber's member (different for user, role or contact group subscribers) SortedDictionary <int, SubscriberInfo> subMembers = SubscriberInfoProvider.GetSubscribers(subscriber, 1, 0, issue.IssueNewsletterID); if ((subMembers != null) && (subMembers.Count > 0)) { foreach (KeyValuePair <int, SubscriberInfo> item in subMembers) { // Get 1st subscriber's member SubscriberInfo sbMember = item.Value; if (sbMember != null) { // Create information line string infoLine = ScriptHelper.GetString(sbMember.SubscriberEmail, false); // Add info about subscriber type if (sbMember.SubscriberType.EqualsCSafe(UserInfo.OBJECT_TYPE, true)) { infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.cms_user").ToLowerCSafe()); } else if (sbMember.SubscriberType.EqualsCSafe(RoleInfo.OBJECT_TYPE, true)) { infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.cms_role").ToLowerCSafe()); } else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACTGROUP, true)) { infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contactgroup").ToLowerCSafe()); } else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.PERSONA, true)) { infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.personas_persona").ToLowerCSafe()); } else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACT, true)) { infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contact").ToLowerCSafe()); } script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, HTMLHelper.HTMLEncode(infoLine)); // Resolve dynamic field macros ({%FirstName%}, {%LastName%}, {%Email%}) if (ih.LoadDynamicFields(sbMember, news, null, issue, true, siteName, null, null, null)) { subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject, news, issue); } // Create resolved subject script = string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(subject))); } } } else { // Get generic name for external subscribers var related = BaseAbstractInfoProvider.GetInfoById(subscriber.SubscriberType, subscriber.SubscriberRelatedID); script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, HTMLHelper.HTMLEncode(TypeHelper.GetNiceObjectTypeName(subscriber.SubscriberType) + " \"" + HTMLHelper.HTMLEncode(related.Generalized.ObjectDisplayName) + "\"")); // Resolve dynamic field macros (newsletter and issue) if (ih.LoadDynamicFields(null, news, null, issue, true, siteName, null, null, null)) { subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject, news, issue); } // Create resolved subject script = string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(subject))); } } } else { // Resolve dynamic field macros ({%FirstName%}, {%LastName%}, {%Email%}) in subject if (ih.LoadDynamicFields(null, news, null, issue, true, siteName, null, null, null)) { subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject, news, issue); } // Generate void javascript script = string.Format( @"var currentSubscriberIndex = 0; var newsletterIssueId ={0}; var guid = new Array(1); var email = new Array(1); var subject = new Array(1); subject[0] = '{1}'; var subscribers = new Array(guid, email); guid[0] = 0; email[0] = '(N/A)';", issue.IssueID, HTMLHelper.HTMLEncode(subject)); } ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "PreviewData", ScriptHelper.GetScript(script)); if (!RequestHelper.IsPostBack()) { ScriptHelper.RegisterStartupScript(this, typeof(string), "LoadPreview" + ClientID, ScriptHelper.GetScript("pageLoad();")); } }
protected void Page_Load(object sender, EventArgs e) { Guid subscriberGuid = QueryHelper.GetGuid("subscriberguid", Guid.Empty); int newsletterIssueId = QueryHelper.GetInteger("issueid", 0); // Get newsletter issue IssueInfo issue = IssueInfoProvider.GetIssueInfo(newsletterIssueId); if (issue == null) { return; } // Get subscriber SubscriberInfo subscriber = SubscriberInfoProvider.GetSubscriberInfo(subscriberGuid, CMSContext.CurrentSiteID); // Get the newsletter NewsletterInfo news = NewsletterInfoProvider.GetNewsletterInfo(issue.IssueNewsletterID); if (news == null) { return; } // Get site default culture string culture = CultureHelper.GetDefaultCulture(CMSContext.CurrentSiteName); // Ensure preview in default site culture // Keep old culture CultureInfo oldUICulture = Thread.CurrentThread.CurrentUICulture; // Set current culture Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture); string htmlPage = String.Empty; try { if (subscriber != null) { // Get subscriber's member (different for user or role subscribers) SortedDictionary <int, SubscriberInfo> subscribers = SubscriberInfoProvider.GetSubscribers(subscriber, 1, 0, news.NewsletterID); foreach (KeyValuePair <int, SubscriberInfo> item in subscribers) { // Get 1st subscriber's member SubscriberInfo sb = item.Value; htmlPage = IssueInfoProvider.GetEmailBody(issue, news, null, sb, true, CMSContext.CurrentSiteName, null, null, null); } } if (string.IsNullOrEmpty(htmlPage)) { htmlPage = IssueInfoProvider.GetEmailBody(issue, news, null, null, true, CMSContext.CurrentSiteName, null, null, null); } } catch (Exception ex) { throw ex; } finally { // Set back to old culture Thread.CurrentThread.CurrentUICulture = oldUICulture; } Response.Clear(); Response.Write(htmlPage); RequestHelper.EndResponse(); }
protected void Page_Load(object sender, EventArgs e) { // Get Issue object IssueInfo issue = (IssueInfo)CMSContext.EditedObject; if ((issue == null) || (issue.IssueSiteID != CMSContext.CurrentSiteID)) { return; } // Get newsletter object NewsletterInfo news = NewsletterInfoProvider.GetNewsletterInfo(issue.IssueNewsletterID); string subject = null; IssueHelper ih = new IssueHelper(); string siteName = CMSContext.CurrentSiteName; InitGUI(); // Get specific number of subscribers subscribed to the newsletter string where = "SubscriberID IN (SELECT SubscriberID FROM Newsletter_SubscriberNewsletter WHERE NewsletterID=" + issue.IssueNewsletterID + " AND (SubscriptionApproved=1 OR SubscriptionApproved IS NULL) AND (SubscriptionEnabled=1 OR SubscriptionEnabled IS NULL))"; DataSet subscribers = SubscriberInfoProvider.GetSubscribers(where, null, MAX_PREVIEW_SUBSCRIBERS, null); string script; if (!DataHelper.DataSourceIsEmpty(subscribers)) { // Limit max subscribers count to number of rows int maxCount = subscribers.Tables[0].Rows.Count; // Generate javascript based on subscribers script = string.Format( @"var currentSubscriberIndex = 0; var newsletterIssueId ={0}; var guid = new Array({1}); var email = new Array({1}); var subject = new Array({1}); var subscribers = new Array(guid, email);", issue.IssueID, maxCount); SubscriberInfo subscriber = null; SubscriberInfo sbMember = null; SortedDictionary <int, SubscriberInfo> subMembers = null; string infoLine = null; for (int i = 0; i < maxCount; i++) { // Get subscriber subscriber = new SubscriberInfo(subscribers.Tables[0].Rows[i]); if (subscriber != null) { // Insert subscriber GUID script = string.Format("{0} guid[{1}] = '{2}'; \n ", script, i, subscriber.SubscriberGUID); // Get subscriber's member (different for user, role or contact group subscribers) subMembers = SubscriberInfoProvider.GetSubscribers(subscriber, 1, 0, issue.IssueNewsletterID); if ((subMembers != null) && (subMembers.Count > 0)) { foreach (KeyValuePair <int, SubscriberInfo> item in subMembers) { // Get 1st subscriber's member sbMember = item.Value; if (sbMember != null) { // Create information line infoLine = ScriptHelper.GetString(sbMember.SubscriberEmail, false); // Add info about subscriber type if (sbMember.SubscriberType.EqualsCSafe(SiteObjectType.USER, true)) { infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.cms_user").ToLowerCSafe()); } else if (sbMember.SubscriberType.EqualsCSafe(SiteObjectType.ROLE, true)) { infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.cms_role").ToLowerCSafe()); } else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACTGROUP, true)) { infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contactgroup").ToLowerCSafe()); } else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACT, true)) { infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contact").ToLowerCSafe()); } script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, infoLine); // Resolve dynamic field macros ({%FirstName%}, {%LastName%}, {%Email%}) if (ih.LoadDynamicFields(sbMember, news, null, issue, true, siteName, null, null, null)) { subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject); } // Create resolved subject script = string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(subject))); } } } else { script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, "(N/A)"); // Resolve dynamic field macros (newsletter and issue) if (ih.LoadDynamicFields(null, news, null, issue, true, siteName, null, null, null)) { subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject); } // Create resolved subject script = string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(subject))); } } } } else { // Resolve dynamic field macros ({%FirstName%}, {%LastName%}, {%Email%}) in subject if (ih.LoadDynamicFields(null, news, null, issue, true, siteName, null, null, null)) { subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject); } // Generate void javascript script = string.Format( @"var currentSubscriberIndex = 0; var newsletterIssueId ={0}; var guid = new Array(1); var email = new Array(1); var subject = new Array(1); subject[0] = '{1}'; var subscribers = new Array(guid, email); guid[0] = 0; email[0] = '(N/A)';", issue.IssueID, subject); } ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "PreviewData", ScriptHelper.GetScript(script)); if (!RequestHelper.IsPostBack()) { ScriptHelper.RegisterStartupScript(this, typeof(string), "LoadPreview" + ClientID, ScriptHelper.GetScript("pageLoad();")); } }