Beispiel #1
0
        public void AddSubscribers(List <CampaignUser> users, bool resubscribe = false)
        {
            Subscriber subscriber = new Subscriber(_auth, _listId);
            List <SubscriberDetail> newSubscribers = new List <SubscriberDetail>();

            foreach (var user in users)
            {
                newSubscribers.Add(new SubscriberDetail()
                {
                    Name           = user.Name,
                    EmailAddress   = user.Email,
                    ConsentToTrack = ConsentToTrack.Unchanged,
                    CustomFields   = null
                });
            }
            try
            {
                BulkImportResults results = subscriber.Import(newSubscribers, resubscribe);
                //Console.WriteLine(results.TotalNewSubscribers + " subscribers added");
                //Console.WriteLine(results.TotalExistingSubscribers + " total subscribers in list");
            }
            catch (CreatesendException ex)
            {
                ErrorResult <BulkImportResults> error = (ErrorResult <BulkImportResults>)ex.Data["ErrorResult"];
                //Console.WriteLine(error.Code);
                //Console.WriteLine(error.Message);
                var sd = new StringBuilder(string.Empty);
                if (error.ResultData != null)
                {
                    //handle the returned data
                    BulkImportResults results = error.ResultData;
                    sd.AppendLine("Failed Address");
                    //success details are here as normal
                    //Console.WriteLine(results.TotalNewSubscribers + " subscribers were still added");
                    //but we also have additional failure detail
                    foreach (ImportResult result in results.FailureDetails)
                    {
                        //Console.WriteLine("Failed Address");
                        //Console.WriteLine(result.Message + " - " + result.EmailAddress);
                        sd.AppendLine(result.EmailAddress + " - " + result.Message);
                    }
                }
                throw new ApplicationException(sd.ToString());
            }
            catch (Exception ex)
            {
                // Handle some other failure
                //Console.WriteLine(ex.ToString());
                throw new ApplicationException(ex.ToString());
            }
        }
Beispiel #2
0
        void BatchAdd()
        {
            Subscriber subscriber = new Subscriber(auth, listID);

            List <SubscriberDetail> newSubscribers = new List <SubscriberDetail>();

            SubscriberDetail subscriber1 = new SubscriberDetail("*****@*****.**", "Test Person 1", new List <SubscriberCustomField>());

            subscriber1.CustomFields.Add(new SubscriberCustomField()
            {
                Key = "CustomFieldKey", Value = "Value"
            });
            subscriber1.CustomFields.Add(new SubscriberCustomField()
            {
                Key = "CustomFieldKey2", Value = "Value2"
            });

            newSubscribers.Add(subscriber1);

            SubscriberDetail subscriber2 = new SubscriberDetail("*****@*****.**", "Test Person 2", new List <SubscriberCustomField>());

            subscriber2.CustomFields.Add(new SubscriberCustomField()
            {
                Key = "CustomFieldKey", Value = "Value3"
            });
            subscriber2.CustomFields.Add(new SubscriberCustomField()
            {
                Key = "CustomFieldKey2", Value = "Value4"
            });

            newSubscribers.Add(subscriber2);

            try
            {
                BulkImportResults results = subscriber.Import(newSubscribers, true);
                Console.WriteLine(results.TotalNewSubscribers + " subscribers added");
                Console.WriteLine(results.TotalExistingSubscribers + " total subscribers in list");
            }
            catch (CreatesendException ex)
            {
                ErrorResult <BulkImportResults> error = (ErrorResult <BulkImportResults>)ex.Data["ErrorResult"];

                Console.WriteLine(error.Code);
                Console.WriteLine(error.Message);

                if (error.ResultData != null)
                {
                    //handle the returned data
                    BulkImportResults results = error.ResultData;

                    //success details are here as normal
                    Console.WriteLine(results.TotalNewSubscribers + " subscribers were still added");

                    //but we also have additional failure detail
                    foreach (ImportResult result in results.FailureDetails)
                    {
                        Console.WriteLine("Failed Address");
                        Console.WriteLine(result.Message + " - " + result.EmailAddress);
                    }
                }
            }
            catch (Exception ex)
            {
                // Handle some other failure
                Console.WriteLine(ex.ToString());
            }
        }
        public bool Run()
        {
            trace.Trace("Deserializing bulk sync data.");

            BulkSyncData syncData = config.BulkSyncData != null
                                        ? syncData = JsonConvert.DeserializeObject <BulkSyncData>(config.BulkSyncData)
                                        : new BulkSyncData();

            string primaryEmail = SharedLogic.GetPrimaryEmailField(config.SubscriberEmail);

            QueryExpression viewFilter = GetBulkSyncFilter(config, syncData, primaryEmail);

            var auth = Authenticator.GetAuthentication(config, orgService);
            var sub  = new Subscriber(auth, config.ListId);
            var mdh  = new MetadataHelper(orgService, trace);

            trace.Trace("Beginning the sync process.");

            do
            {
                viewFilter.PageInfo.PageNumber = syncData.PageNumber > 1
                                                    ? syncData.PageNumber
                                                    : 1;

                if (!string.IsNullOrWhiteSpace(syncData.PagingCookie))
                {
                    viewFilter.PageInfo.PagingCookie = syncData.PagingCookie;
                }

                trace.Trace("Processing page number {0}.", viewFilter.PageInfo.PagingCookie);

                // sync batch of 1000 contacts to CM list as subscribers
                EntityCollection contacts = orgService.RetrieveMultiple(viewFilter);

                syncData.PagingCookie = contacts.PagingCookie;
                syncData.PageNumber++;

                IEnumerable <Entity> invalidEmail = contacts.Entities.Where(e => !e.Attributes.Contains(primaryEmail) || string.IsNullOrWhiteSpace(e[primaryEmail].ToString()));
                syncData.NumberInvalidEmails += invalidEmail.Count();

                BulkImportResults importResults = null;

                var subscribers = GenerateSubscribersList(contacts.Entities.Except(invalidEmail), primaryEmail, mdh);
                if (!subscribers.Any())
                {
                    trace.Trace("No subscribers to import from contact page.");
                    continue;
                }

                trace.Trace("Starting subscriber import. {0} subscribers.", subscribers.Count());
                try
                {
                    importResults = sub.Import(subscribers,
                                               false,  // resubscribe
                                               false,  // queueSubscriptionBasedAutoResponders
                                               false); // restartSubscriptionBasedAutoResponders
                }
                catch (CreatesendException ex)
                {
                    trace.Trace("CreatesendException Error on subscriber import: " + ex.Error.Message);
                    trace.Trace("Exception Error on subscriber import: " + ex.Message);

                    syncData.BulkSyncErrors.Add(new BulkSyncError("import", ex.Error.Message, ""));
                    syncData.BulkSyncErrors.Add(new BulkSyncError("import", ex.Message, ""));

                    trace.Trace("CreatesendException error occurred: Subscriber import ended.");
                }

                trace.Trace("Subscriber import ended.");

                if (importResults.FailureDetails.Count > 0)
                {
                    if (syncData.BulkSyncErrors == null)
                    {
                        syncData.BulkSyncErrors = new List <BulkSyncError>();
                    }

                    // log the errors back into bulk sync data
                    foreach (var failure in importResults.FailureDetails)
                    {
                        syncData.BulkSyncErrors.Add(new BulkSyncError(failure.Code, failure.Message, failure.EmailAddress));
                    }
                }

                syncData.NumberSuccesses += importResults.TotalNewSubscribers;

                trace.Trace("Page: {0}", syncData.PageNumber);
                trace.Trace("More Records? {0}", contacts.MoreRecords);

                if (!contacts.MoreRecords)
                {
                    trace.Trace("No more records.");
                    trace.Trace("Sending email.");
                    try
                    {
                        var account      = new Account(auth);
                        var emailPayload = String.Format("{{ \"ToEmail\": \"{0}\", \"SubscriberCount\": \"{1}\", \"ListName\": \"{2}\" }}",
                                                         account.GetPrimaryContact(), syncData.NumberSuccesses, config.ListName);
                        SuccessEmailSender.SendEmail(config.AccessToken, emailPayload);
                    }
                    catch (Exception ex)
                    {
                        trace.Trace(ex.Message);
                        trace.Trace(ex.StackTrace);
                    }

                    trace.Trace("Clearing the sync data.");
                    syncData.PageNumber    = 1;
                    syncData.PagingCookie  = string.Empty;
                    syncData.UpdatedFields = null;

                    syncData.BulkSyncErrors.Clear();
                    syncData.NumberInvalidEmails = 0;
                    break;
                }
            }while (timer.ElapsedMilliseconds <= 90000);

            trace.Trace("Saving bulk data.");
            string bulkData = JsonConvert.SerializeObject(syncData);

            config.BulkSyncData       = bulkData;
            config.BulkSyncInProgress = syncData.PageNumber > 1;
            configService.SaveConfig(config);

            return(syncData.PageNumber <= 1); // if we're done return true
        }