private void LoadSettings() { subscriptionGuid = WebUtils.ParseGuidFromQueryString("s", subscriptionGuid); if (subscriptionGuid != Guid.Empty) { subscription = subscriptions.Fetch(subscriptionGuid); if ((subscription != null) && (subscription.SiteGuid == siteSettings.SiteGuid)) { subscriptions.Verify(subscription.SubscribeGuid, true, Guid.Empty); if (subscription.UserGuid == Guid.Empty) { SiteUser user = SiteUser.GetByEmail(siteSettings, subscription.EmailAddress); if (user != null) { subscription.UserGuid = user.UserGuid; subscriptions.Save(subscription); } } LetterInfo.UpdateSubscriberCount(subscription.LetterInfoGuid); } else { subscription = null; } } }
private void DoUnsubscribe() { if (subscriptionGuid != Guid.Empty) { LetterSubscriber s = subscriptions.Fetch(subscriptionGuid); if (s == null) { ShowNotFoundMessge(); return; } subscriptions.Delete(s); LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid); lblUnsubscribe.Text = Resource.NewsletterUnsubscribeSuccess; btnUnsubscribeConfirm.Visible = false; lblUnsubscribe.Visible = true; return; } LetterInfo letterInfo = new LetterInfo(letterInfoGuid); if (letterInfo.LetterInfoGuid == Guid.Empty) { ShowNotFoundMessge(); return; } List <LetterSubscriber> userSubscriptions = subscriptions.GetListByUser(siteSettings.SiteGuid, userGuid); bool unsubscribed = false; foreach (LetterSubscriber s in userSubscriptions) { if (s.LetterInfoGuid == letterInfoGuid) { subscriptions.Delete(s); unsubscribed = true; LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid); } } if (unsubscribed) { lblUnsubscribe.Text = string.Format(CultureInfo.InvariantCulture, Resource.NewsletterUnsubscribeSuccessFormatString, letterInfo.Title); btnUnsubscribeConfirm.Visible = false; lblUnsubscribe.Visible = true; } else { ShowNotFoundMessge(); } }
/// <summary> /// people can subscribe to the newsletters without registering on the site. This method is used to attach those existing subscriptions to the user upon registration /// </summary> /// <param name="siteUser"></param> public static void ClaimExistingSubscriptions(SiteUser siteUser) { SubscriberRepository subscriptions = new SubscriberRepository(); List <LetterSubscriber> userSubscriptions = subscriptions.GetListByEmail(siteUser.SiteGuid, siteUser.Email); foreach (LetterSubscriber s in userSubscriptions) { if (s.UserGuid != siteUser.UserGuid) { s.UserGuid = siteUser.UserGuid; subscriptions.Save(s); } if (!s.IsVerified) { subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty); LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid); } } List <LetterSubscriber> memberSubscriptions = subscriptions.GetListByUser(siteUser.SiteGuid, siteUser.UserGuid); RemoveDuplicates(memberSubscriptions); // commented out 2012-11-16 since we now give the user a chance to opt in the registration // then we should not force him in if he chose not to opt in //if (memberSubscriptions.Count == 0) //{ // string ipAddress = SiteUtils.GetIP4Address(); // //user has no previous subscriptions and just registered // // lets give him the site subscriptions that are configured for opting in new users by default // List<LetterInfo> allNewsletters = LetterInfo.GetAll(siteUser.SiteGuid); // foreach (LetterInfo l in allNewsletters) // { // if ((l.ProfileOptIn) && (l.AvailableToRoles.Contains("All Users;"))) // { // LetterSubscriber s = new LetterSubscriber(); // s.SiteGuid = siteUser.SiteGuid; // s.LetterInfoGuid = l.LetterInfoGuid; // s.UserGuid = siteUser.UserGuid; // s.EmailAddress = siteUser.Email; // s.IsVerified = true; // s.UseHtml = true; // s.IpAddress = ipAddress; // subscriptions.Save(s); // } // } //} }
private void RunTask() { // this is where the work gets done // Get a data table of up to 1000 users // who have not opted in but also have not previously // opted out and have valid email accounts and account is not locked DataTable dataTable = GetData(); double completeRatio = .5; if (dataTable.Rows.Count == 0) { completeRatio = 1; //complete ReportStatus(completeRatio); return; } SubscriberRepository repository = new SubscriberRepository(); int count = 0; foreach (DataRow row in dataTable.Rows) { Guid userGuid = new Guid(row["UserGuid"].ToString()); string email = row["email"].ToString(); LetterSubscriber s = new LetterSubscriber(); s.SiteGuid = SiteGuid; s.UserGuid = userGuid; s.EmailAddress = email; s.LetterInfoGuid = LetterInfoGuid; s.UseHtml = true; s.IsVerified = true; repository.Save(s); count += 1; if (count > 20) { ReportStatus(completeRatio); count = 0; } } LetterInfo.UpdateSubscriberCount(LetterInfoGuid); ReportStatus(completeRatio); // repeat until the table comes back with 0 rows RunTask(); }
public static void VerifyExistingSubscriptions(SiteUser siteUser) { SubscriberRepository subscriptions = new SubscriberRepository(); List <LetterSubscriber> userSubscriptions = subscriptions.GetListByUser(siteUser.SiteGuid, siteUser.UserGuid); foreach (LetterSubscriber s in userSubscriptions) { if (!s.IsVerified) { subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty); LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid); } } }
private void DoSubscribe(LetterInfo letter, SiteUser siteUser) { LetterSubscriber s = new LetterSubscriber(); s.SiteGuid = siteSettings.SiteGuid; s.EmailAddress = siteUser.Email; s.UserGuid = siteUser.UserGuid; s.LetterInfoGuid = letter.LetterInfoGuid; s.UseHtml = rbHtmlFormat.Checked; s.IsVerified = (!siteSettings.UseSecureRegistration); s.IpAddress = SiteUtils.GetIP4Address(); subscriptions.Save(s); LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid); }
/// <summary> /// people can subscribe to the newsletters without registering on the site. This method is used to attach those existing subscriptions to the user upon registration /// </summary> /// <param name="siteUser"></param> public static void ClaimExistingSubscriptions(SiteUser siteUser) { SubscriberRepository subscriptions = new SubscriberRepository(); List <LetterSubscriber> userSubscriptions = subscriptions.GetListByEmail(siteUser.SiteGuid, siteUser.Email); foreach (LetterSubscriber s in userSubscriptions) { if (s.UserGuid != siteUser.UserGuid) { s.UserGuid = siteUser.UserGuid; subscriptions.Save(s); } if (!s.IsVerified) { subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty); LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid); } } RemoveDuplicates(userSubscriptions); if (userSubscriptions.Count == 0) { string ipAddress = SiteUtils.GetIP4Address(); //user has no previous subscriptions and just registered // lets give him the site subscriptions that are configured for opting in new users by default List <LetterInfo> allNewsletters = LetterInfo.GetAll(siteUser.SiteGuid); foreach (LetterInfo l in allNewsletters) { if ((l.ProfileOptIn) && (l.AvailableToRoles.Contains("All Users;"))) { LetterSubscriber s = new LetterSubscriber(); s.SiteGuid = siteUser.SiteGuid; s.LetterInfoGuid = l.LetterInfoGuid; s.UserGuid = siteUser.UserGuid; s.EmailAddress = siteUser.Email; s.IsVerified = true; s.UseHtml = true; s.IpAddress = ipAddress; subscriptions.Save(s); } } } }
void grdSubscribers_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e) { string strG = e.CommandArgument.ToString(); switch (e.CommandName) { case "DeleteSubscriber": if (strG.Length == 36) { Guid subscriptionGuid = new Guid(strG); LetterSubscriber s = subscriptions.Fetch(subscriptionGuid); if (s != null) { subscriptions.Delete(s); } LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid); WebUtils.SetupRedirect(this, Request.RawUrl); } break; case "SendVerification": if (strG.Length == 36) { Guid subscriptionGuid = new Guid(strG); LetterSubscriber s = subscriptions.Fetch(subscriptionGuid); LetterInfo letterInfo = new LetterInfo(letterInfoGuid); NewsletterHelper.SendSubscriberVerificationEmail( SiteRoot, s.EmailAddress, s.SubscribeGuid, letterInfo, siteSettings); } WebUtils.SetupRedirect(this, Request.RawUrl); break; } }
public static void RemoveDuplicates(List <LetterSubscriber> userSubscriptions) { SubscriberRepository subscriptions = new SubscriberRepository(); List <LetterSubscriber> cleanSubscriptions = new List <LetterSubscriber>(); List <LetterSubscriber> duplicates = new List <LetterSubscriber>(); foreach (LetterSubscriber s in userSubscriptions) { if (!ContainsSubscription(cleanSubscriptions, s.LetterInfoGuid)) { cleanSubscriptions.Add(s); } else { duplicates.Add(s); } } foreach (LetterSubscriber s in duplicates) { subscriptions.Delete(s, false); LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid); } }
void grdSubscribers_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e) { switch (e.CommandName) { case "DeleteSubscriber": string strG = e.CommandArgument.ToString(); if (strG.Length == 36) { Guid subscriptionGuid = new Guid(strG); LetterSubscriber s = subscriptions.Fetch(subscriptionGuid); if (s != null) { subscriptions.Delete(s); } LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid); WebUtils.SetupRedirect(this, Request.RawUrl); } break; } }
void btnSavePreferences_Click(object sender, EventArgs e) { foreach (LetterInfo availableSubscription in siteAvailableSubscriptions) { string controlID = "chk" + availableSubscription.LetterInfoGuid.ToString(); if (Request.Params.Get(controlID) != null) { if (!IsSubscribed(availableSubscription.LetterInfoGuid)) { //subscribe LetterSubscriber subscriber = new LetterSubscriber(); subscriber.SiteGuid = siteSettings.SiteGuid; subscriber.LetterInfoGuid = availableSubscription.LetterInfoGuid; subscriber.UserGuid = siteUser.UserGuid; subscriber.EmailAddress = siteUser.Email.ToLower(); subscriber.IsVerified = true; subscriber.UseHtml = rbHtmlFormat.Checked; subscriber.IpAddress = SiteUtils.GetIP4Address(); subscriptions.Save(subscriber); LetterInfo.UpdateSubscriberCount(availableSubscription.LetterInfoGuid); } else { // user is subscribed already foreach (LetterSubscriber s in userSubscriptions) { if (s.LetterInfoGuid == availableSubscription.LetterInfoGuid) { if (s.UseHtml != rbHtmlFormat.Checked) { s.UseHtml = rbHtmlFormat.Checked; subscriptions.Save(s); } if (!s.IsVerified) { subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty); LetterInfo.UpdateSubscriberCount(availableSubscription.LetterInfoGuid); } } } } } else { if (IsSubscribed(availableSubscription.LetterInfoGuid)) { // unsubscribe foreach (LetterSubscriber s in userSubscriptions) { if (s.LetterInfoGuid == availableSubscription.LetterInfoGuid) { subscriptions.Delete(s); } } LetterInfo.UpdateSubscriberCount(availableSubscription.LetterInfoGuid); } } } GetSubscriptions(); BindPreferences(); lblUnverifiedWarning.Visible = false; //btnSavePreferences.Text = Resource.NewsletterSavePreferencesButton; System.Threading.Thread.Sleep(1000); UpdatePanel1.Update(); }
private void DoSubscribe(LetterInfo letter, string email) { if (email == "*****@*****.**") { return; } //I've been seeing a lot of this from a bot LetterSubscriber s = subscriptions.Fetch(siteSettings.SiteGuid, letter.LetterInfoGuid, email); bool needToSendVerification = false; if (s == null) { s = new LetterSubscriber(); s.SiteGuid = siteSettings.SiteGuid; s.EmailAddress = email; s.LetterInfoGuid = letter.LetterInfoGuid; if (showFormatOptions) { s.UseHtml = rbHtmlFormat.Checked; } else { s.UseHtml = htmlIsDefault; } if ((currentUser != null) && (string.Equals(currentUser.Email, email, StringComparison.InvariantCultureIgnoreCase))) { s.UserGuid = currentUser.UserGuid; s.IsVerified = true; } else { // user is not authenticated but may still exist // attach userguid but don't flag as verified // because we don't know that the user who submited the form is the account owner SiteUser siteUser = SiteUser.GetByEmail(siteSettings, email); if (siteUser != null) { s.UserGuid = siteUser.UserGuid; } } s.IpAddress = SiteUtils.GetIP4Address(); subscriptions.Save(s); LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid); if (WebConfigSettings.LogNewsletterSubscriptions) { log.Info(s.EmailAddress + " just subscribed to newsletter " + letter.Title); } if (!s.IsVerified) { needToSendVerification = true; } } else { // we found an existing subscription if (!s.IsVerified) { // if the current authenticated user has the same email mark it as verified if ((currentUser != null) && (string.Equals(currentUser.Email, email, StringComparison.InvariantCultureIgnoreCase))) { s.UserGuid = currentUser.UserGuid; if (showFormatOptions) { s.UseHtml = rbHtmlFormat.Checked; } subscriptions.Save(s); subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty); } else if (s.BeginUtc < DateTime.UtcNow.AddDays(-WebConfigSettings.NewsletterReVerifcationAfterDays)) { // if the user never verifed before and its been at least x days go ahead and send another chance to verify needToSendVerification = true; // TODO: maybe we should log this in case some spam script is using the same email over and over // or maybe we should add a verification sent count on subscription } } } //added 2012-05-16 to support intranet scenarios where verification is not required if (!WebConfigSettings.NewsletterRequireVerification) { if (!s.IsVerified) { s.IsVerified = true; subscriptions.Save(s); } needToSendVerification = false; } if (needToSendVerification) { NewsletterHelper.SendSubscriberVerificationEmail( siteRoot, email, s.SubscribeGuid, letter, siteSettings); } }
private void DoSubscribe(LetterInfo letter, string email) { LetterSubscriber s = subscriptions.Fetch(siteSettings.SiteGuid, letter.LetterInfoGuid, email); bool needToSendVerification = false; if (s == null) { s = new LetterSubscriber(); s.SiteGuid = siteSettings.SiteGuid; s.EmailAddress = email; s.LetterInfoGuid = letter.LetterInfoGuid; if (showFormatOptions) { s.UseHtml = rbHtmlFormat.Checked; } else { s.UseHtml = htmlIsDefault; } if ((currentUser != null) && (string.Equals(currentUser.Email, email, StringComparison.InvariantCultureIgnoreCase))) { s.UserGuid = currentUser.UserGuid; s.IsVerified = true; } else { // user is not authenticated but may still exist // attach userguid but don't flag as verified // because we don't know that the user who submited the form is the account owner SiteUser siteUser = SiteUser.GetByEmail(siteSettings, email); if (siteUser != null) { s.UserGuid = siteUser.UserGuid; } } s.IpAddress = SiteUtils.GetIP4Address(); subscriptions.Save(s); LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid); if (!s.IsVerified) { needToSendVerification = true; } } else { // we found an existing subscription if (!s.IsVerified) { // if the current authenticated user has the same email mark it as verified if ((currentUser != null) && (string.Equals(currentUser.Email, email, StringComparison.InvariantCultureIgnoreCase))) { s.UserGuid = currentUser.UserGuid; if (showFormatOptions) { s.UseHtml = rbHtmlFormat.Checked; } subscriptions.Save(s); subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty); } else if (s.BeginUtc < DateTime.UtcNow.AddDays(-WebConfigSettings.NewsletterReVerifcationAfterDays)) { // if the user never verifed before and its been at least x days go ahead and send another chance to verify needToSendVerification = true; // TODO: maybe we should log this in case some spam script is using the same email over and over // or maybe we should add a verification sent count on subscription } } } if (needToSendVerification) { string verificationTemplate = ResourceHelper.GetMessageTemplate(SiteUtils.GetDefaultCulture(), "NewsletterVerificationEmailMessage.config"); string confirmLink = siteRoot + "/eletter/Confirm.aspx?s=" + s.SubscribeGuid.ToString(); string messageBody = verificationTemplate.Replace("{NewsletterName}", letter.Title).Replace("{ConfirmationLink}", confirmLink).Replace("{SiteLink}", siteRoot); string subject = string.Format(CultureInfo.InvariantCulture, Resource.NewsletterVerifySubjectFormat, letter.Title); EmailMessageTask messageTask = new EmailMessageTask(SiteUtils.GetSmtpSettings()); messageTask.SiteGuid = siteSettings.SiteGuid; if (letter.FromAddress.Length > 0) { messageTask.EmailFrom = letter.FromAddress; } else { messageTask.EmailFrom = siteSettings.DefaultEmailFromAddress; } messageTask.EmailTo = email; messageTask.Subject = subject; messageTask.TextBody = messageBody; messageTask.QueueTask(); WebTaskManager.StartOrResumeTasks(); } }