public static void ExtractNewsletterUnsubscriptionsFromActivities()
    {
        if (!ModuleEntryManager.IsModuleLoaded(ModuleName.NEWSLETTER))
        {
            return;
        }

        var activitiesQuery = new ObjectQuery(PredefinedObjectType.ACTIVITY)
            .Source(s => s.Join("OM_Contact", "ActivityActiveContactID", "ContactID"))
            .WhereEquals("ActivityType", PredefinedActivityType.NEWSLETTER_UNSUBSCRIBING)
            .WhereNotEmpty("ContactEmail")
            .Columns("ContactEmail", "ActivitySiteID", "ActivityCreated", "ActivityItemID")
            .Distinct();

        var activities = activitiesQuery.Select(row => new
        {
            SiteID = DataHelper.GetIntValue(row, "ActivitySiteID"),
            ContactEmail = DataHelper.GetStringValue(row, "ContactEmail"),
            ActivityCreated = DataHelper.GetDateTimeValue(row, "ActivityCreated"),
            NewsletterID = DataHelper.GetIntValue(row, "ActivityItemID"),
        });

        var existingUnsubscriptionsByNewsletterID = new ObjectQuery(PredefinedObjectType.NEWSLETTERUNSUBSCRIPTION)
            .WhereNotNull("UnsubscriptionNewsletterID")
            .Select(row => new
            {
                Email = DataHelper.GetStringValue(row, "UnsubscriptionEmail"),
                NewsletterID = DataHelper.GetIntValue(row, "UnsubscriptionNewsletterID"),
            })
            .GroupBy(unsubscription => unsubscription.NewsletterID)
            .ToDictionary(group => group.Key, group => group.Select(u => u.Email).ToHashSet(StringComparer.InvariantCultureIgnoreCase));

        foreach (var activity in activities)
        {
            if (existingUnsubscriptionsByNewsletterID.ContainsKey(activity.NewsletterID) && existingUnsubscriptionsByNewsletterID[activity.NewsletterID].Contains(activity.ContactEmail))
            {
                continue;
            }

            if (!ValidationHelper.IsEmail(activity.ContactEmail))
            {
                continue;
            }

            var unsubscriptionInfo = ModuleManager.GetObject(PredefinedObjectType.NEWSLETTERUNSUBSCRIPTION);

            unsubscriptionInfo.SetValue("UnsubscriptionEmail", activity.ContactEmail.ToLowerInvariant());
            unsubscriptionInfo.SetValue("UnsubscriptionNewsletterID", activity.NewsletterID);
            unsubscriptionInfo.SetValue("UnsubscriptionSiteID", activity.SiteID);
            unsubscriptionInfo.SetValue("UnsubscriptionCreated", activity.ActivityCreated);
            unsubscriptionInfo.SetValue("UnsubscriptionGUID", Guid.NewGuid());

            unsubscriptionInfo.Insert();

            if (existingUnsubscriptionsByNewsletterID.ContainsKey(activity.NewsletterID))
            {
                existingUnsubscriptionsByNewsletterID[activity.NewsletterID].Add(activity.ContactEmail);
            }
            else
            {
                existingUnsubscriptionsByNewsletterID[activity.NewsletterID] = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase) { activity.ContactEmail };
            }
        }
    }