using System;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.Newsletter;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.UIControls;
using CMS.WebAnalytics;
public partial class CMSModules_Newsletters_CMSPages_Unsubscribe : CMSPage
{
#region "Methods"
protected void Page_Load(object sender, EventArgs e)
{
// Get data from query string
Guid subscriberGuid = QueryHelper.GetGuid("subscriberguid", Guid.Empty);
Guid newsletterGuid = QueryHelper.GetGuid("newsletterguid", Guid.Empty);
string subscriptionHash = QueryHelper.GetString("subscriptionhash", string.Empty);
Guid issueGuid = QueryHelper.GetGuid("issueGuid", Guid.Empty);
int issueID = QueryHelper.GetInteger("issueid", 0);
int contactId = QueryHelper.GetInteger("contactid", 0);
bool unsubscribed = false;
string requestTime = QueryHelper.GetString("datetime", string.Empty);
DateTime datetime = DateTimeHelper.ZERO_TIME;
// Get date and time
if (!string.IsNullOrEmpty(requestTime))
{
try
{
datetime = DateTime.ParseExact(requestTime, SecurityHelper.EMAIL_CONFIRMATION_DATETIME_FORMAT, null);
}
catch
{
ShowError(GetString("newsletter.unsubscribefailed"));
return;
}
}
// Get site ID
int siteId = 0;
if (CMSContext.CurrentSite != null)
{
siteId = CMSContext.CurrentSiteID;
}
if ((subscriberGuid != Guid.Empty) && (newsletterGuid != Guid.Empty) && (siteId != 0))
{
SubscriberInfo subscriber = SubscriberInfoProvider.GetSubscriberInfo(subscriberGuid, siteId);
if (subscriber == null)
{
ShowError(GetString("Unsubscribe.SubscriberDoesNotExist"));
return;
}
// Show error message if subscriber type is 'Role'
if (!string.IsNullOrEmpty(subscriber.SubscriberType) && subscriber.SubscriberType.EqualsCSafe(SiteObjectType.ROLE, true))
{
ShowError(GetString("Unsubscribe.CannotUnsubscribeRole"));
return;
}
NewsletterInfo newsletter = NewsletterInfoProvider.GetNewsletterInfo(newsletterGuid, siteId);
if (newsletter == null)
{
ShowError(GetString("Unsubscribe.NewsletterDoesNotExist"));
return;
}
// Check if subscriber with given GUID is subscribed to specified newsletter
if (SubscriberInfoProvider.IsSubscribed(subscriber.SubscriberID, newsletter.NewsletterID))
{
bool isSubscribed = true;
if (string.IsNullOrEmpty(subscriber.SubscriberType) || !subscriber.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACTGROUP, true))
{
// Unsubscribe action
SubscriberInfoProvider.Unsubscribe(subscriber.SubscriberID, newsletter.NewsletterID);
}
else
{
// Check if the contact group member has unsubscription activity for the specified newsletter
isSubscribed = (contactId > 0) && !ModuleCommands.OnlineMarketingIsContactUnsubscribed(contactId, newsletter.NewsletterID, siteId);
}
if (isSubscribed)
{
// Log newsletter unsubscription activity
LogActivity(subscriber, 0, newsletter.NewsletterID, issueID, contactId);
// Display confirmation
ShowInformation(GetString("Unsubscribe.Unsubscribed"));
unsubscribed = true;
}
else
{
// Contact group member is already unsubscribed
ShowError(GetString("Unsubscribe.NotSubscribed"));
}
}
else
{
ShowError(GetString("Unsubscribe.NotSubscribed"));
}
}
// Check if subscription approval hash is supplied
else if (!string.IsNullOrEmpty(subscriptionHash))
{
SubscriberNewsletterInfo sni = SubscriberNewsletterInfoProvider.GetSubscriberNewsletterInfo(subscriptionHash);
// Check if hash is valid
if ((sni != null) && sni.SubscriptionEnabled)
{
SubscriberInfoProvider.ApprovalResult result = SubscriberInfoProvider.Unsubscribe(subscriptionHash, true, CMSContext.CurrentSiteName, datetime);
switch (result)
{
// Approving subscription was successful
case SubscriberInfoProvider.ApprovalResult.Success:
bool isSubscribed = true;
// Get subscriber
SubscriberInfo subscriber = SubscriberInfoProvider.GetSubscriberInfo(sni.SubscriberID);
if ((subscriber != null) && !string.IsNullOrEmpty(subscriber.SubscriberType) && subscriber.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACTGROUP, true))
{
// Check if the contact group member has unsubscription activity for the specified newsletter
isSubscribed = (contactId > 0) && !ModuleCommands.OnlineMarketingIsContactUnsubscribed(contactId, sni.NewsletterID, siteId);
}
if (isSubscribed)
{
// Log newsletter unsubscription activity
LogActivity(subscriber, sni.SubscriberID, sni.NewsletterID, issueID, contactId);
// Display confirmation
ShowInformation(GetString("Unsubscribe.Unsubscribed"));
unsubscribed = true;
}
else
{
// Contact group member is already unsubscribed
ShowError(GetString("Unsubscribe.NotSubscribed"));
}
break;
// Subscription was already approved
case SubscriberInfoProvider.ApprovalResult.Failed:
ShowError(GetString("newsletter.unsubscribefailed"));
break;
case SubscriberInfoProvider.ApprovalResult.TimeExceeded:
ShowError(GetString("newsletter.approval_timeexceeded"));
break;
// Subscription not found
default:
case SubscriberInfoProvider.ApprovalResult.NotFound:
ShowError(GetString("Unsubscribe.NotSubscribed"));
break;
}
}
else
{
ShowError(GetString("Unsubscribe.NotSubscribed"));
}
}
else
{
if (subscriberGuid == Guid.Empty)
{
ShowError(GetString("Unsubscribe.SubscriberDoesNotExist"));
}
if (newsletterGuid == Guid.Empty)
{
ShowError(GetString("Unsubscribe.NewsletterDoesNotExist"));
}
}
// Increase unsubscribed count
if (unsubscribed)
{
// If Issue ID was provided
if (issueID > 0)
{
IssueInfoProvider.Unsubscribe(issueID);
return;
}
// Otherwise try using the Issue GUID
if (issueGuid != Guid.Empty)
{
IssueInfo issue = IssueInfoProvider.GetIssueInfo(issueGuid, siteId);
if (issue == null)
{
return;
}
IssueInfoProvider.Unsubscribe(issue.IssueID);
}
}
}
///
/// Logs activity for unsubscribing.
///
/// Subscriber (optional - can be null if subscriber ID is used)
/// Subscriber ID (optional - can be zero if subscriber object is used)
/// Newsletter ID
/// Issue ID
/// Contact ID is present if the mail is sent to a contact or a contact group
private void LogActivity(SubscriberInfo sb, int subscriberId, int newsletterId, int issueId, int contactId)
{
if (sb == null)
{
sb = SubscriberInfoProvider.GetSubscriberInfo(subscriberId);
}
bool isFromContactGroup = !string.IsNullOrEmpty(sb.SubscriberType) && sb.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACTGROUP, true);
if (contactId <= 0)
{
contactId = ActivityTrackingHelper.GetContactID(sb);
}
if (contactId > 0)
{
NewsletterInfo news = NewsletterInfoProvider.GetNewsletterInfo(newsletterId);
Activity activity = new ActivityNewsletterUnsubscribing(sb, news, CMSContext.ActivityEnvironmentVariables);
if (activity.Data != null)
{
activity.Data.ContactID = contactId;
activity.Data.ItemDetailID = issueId;
activity.Data.Value = isFromContactGroup ? "contactgroup(" + sb.SubscriberRelatedID + ")" : null;
activity.Log();
}
}
}
#endregion
}