/// <summary>
        /// Upload CSV file to an EM list. This process is not thread safe. Use DMListImport for concurrent uploading.
        /// </summary>
        public void Upload(int listId)
        {
            using (var em = new EMWebServicesClientExtension(Auth.GetToken(), Settings.Default.EndPoint))
            {
                // Upload data into a list
                string fileNameFull = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data\\data.csv");

                // set EM field id order to be identical to CSV file column order
                ArrayOfInt fieldOrder = new ArrayOfInt
                {
                    em.GetField("email").ID,
                    em.GetField("firstname").ID
                };

                em.ListManager.InitializeListImport(em.Token, listId, fieldOrder, false);

                // read and import CSV file
                // a header row is not required in CSV file
                using (var tStream = new StreamReader(fileNameFull))
                {
                    string data = tStream.ReadToEnd();
                    em.ListManager.UploadDataCSV(em.Token, ",", null, data);
                }

                em.ListManager.InsertListData(em.Token);
                em.ListManager.FinalizeListImport(em.Token);
            }
        }
        /// <summary>
        /// Send an email to a recipient. e.g. Welcome email
        /// </summary>
        public void SendAnEmail()
        {
            var token = Auth.GetToken();

            using (var em = new EMWebServicesClientExtension(token, Settings.Default.EndPoint))
            {
                int    primaryKey   = em.GetField("email").ID;
                string value        = "*****@*****.**";
                var    fieldIDs     = new AlterianEMAPIClient.DMListManager.ArrayOfInt();
                bool   isCreateNew  = true;
                int    listID       = 1192;
                int    deploymentID = 2563;

                // Step #1 Looks up an existing recipient record or creates a new one.
                var recipient = em.ListManager.GetRecipientByPK(
                    token,
                    primaryKey,  // EM field id for the PK and it is assumed that the field will contain email address
                    value,       // value of the PK, e.g. [email protected]
                    fieldIDs,    // field ids to retrieve if the recipient already exist
                    isCreateNew, // if true, will create a new record if there is no recipient
                    listID       // list needs to be ready in Email Manager
                    );

                // Step #2 Add recipient data into a list, e.g. First Name, Last Name, if needed.
                List <DMFieldValue> fvList = new List <DMFieldValue>();
                DMFieldValue        email  = new DMFieldValue
                {
                    FieldID = em.GetField("email").ID,  // field id of PK
                    Value   = "*****@*****.**"
                };
                fvList.Add(email);
                DMFieldValue firstName = new DMFieldValue
                {
                    FieldID = em.GetField("firstname").ID, // field id of any. e.g. first name
                    Value   = "John"
                };
                fvList.Add(firstName);

                em.ListManager.AddRecipientRecord(
                    token,
                    listID,
                    false, // set to false, if HTML email is preferred
                    false, // set to false, if the recipient is not un-subscribed
                    fvList.ToArray()
                    );

                // Step #3 Send email to the recipient
                em.SendMessage.AddRecipientToDeployment(
                    token,
                    recipient.RecipientID,
                    deploymentID,   // Deployment ID need to be ready to use in Email Manager.
                    listID
                    );
            }
        }
示例#3
0
        /// <summary>
        /// Unsubscribe a recipient based on primary key
        /// </summary>
        public void Unsubscribe()
        {
            using (var em = new EMWebServicesClientExtension(Auth.GetToken(), Settings.Default.EndPoint))
            {
                int               PKfieldId = em.GetField("email").ID;
                string            PKvalue   = "*****@*****.**";
                DMRecipientRecord recipient = em.ListManager.GetRecipientByPK(em.Token, PKfieldId, PKvalue, new ArrayOfInt(), false, 0);

                em.ListManager.UpdateRecipient(em.Token, 0, recipient.RecipientID, recipient.PrefersText, recipient.RSSOnly, Unsubscribed: true, FieldValues: null);
            }
        }
        private DMVariableMap SetVariableValue(int creativeId, string variableName, string variableValue, string fieldName = "")
        {
            using (var em = new EMWebServicesClientExtension(Auth.GetToken(), Settings.Default.EndPoint))
            {
                DMVariableMap variableMap = new DMVariableMap
                {
                    VariableID = em.GetCreativeVariable(creativeId, variableName).ID,
                    Value      = new DMVariableValue {
                        Value = variableValue
                    },
                    FieldID = 0
                };

                // use field name to map a variable to a Email Manager list field
                if (!string.IsNullOrWhiteSpace(fieldName))
                {
                    variableMap.FieldID = em.GetField(fieldName)?.ID ?? 0;
                }

                return(variableMap);
            }
        }
        /// <summary>
        /// Send emails to multiple recipients with a given deployment setup.
        /// </summary>
        public void SendMultipleEmailsAfterCreatingDeployment()
        {
            using (var em = new EMWebServicesClientExtension(Auth.GetToken(), Settings.Default.EndPoint))
            {
                const string creativeName = "Training_Basic";
                int          creativeId   = em.GetCreative(creativeName).ID;

                // Create Deployment
                const string deployName   = "";
                int          deploymentId = em.SendMessage.CreateDeployment(em.Token, creativeId, deployName);

                // Set Variables
                int recipientListId = 1192;  // This is the list id that contains the recipients to send email to.
                var recipientLists  = new AlterianEMAPIClient.DMSendMessage.ArrayOfInt
                {
                    recipientListId
                };

                DMTemplateValue templateValue = new DMTemplateValue
                {
                    HtmlTemplate = em.GetTemplate(creativeId, "Email 1_HTML").ID
                };

                List <DMVariableMap> variableMaps = new List <DMVariableMap>
                {
                    SetVariableValue(creativeId, "Sender Email", "*****@*****.**"),
                    SetVariableValue(creativeId, "Recipient Email", "", "email"),
                    SetVariableValue(creativeId, "email 2", "", "email")
                };

                em.SendMessage.SetDeploymentVariables(em.Token, deploymentId, templateValue, recipientLists, null, variableMaps.ToArray(), false);

                // Execute Deployment
                const bool sendNow = true;
                em.SendMessage.FinalizeDeployment(em.Token, deploymentId, sendNow);
            }
        }
        public int Create()
        {
            using (var em = new EMWebServicesClientExtension(Auth.GetToken(), Settings.Default.EndPoint))
            {
                // Prepare fields to add to an EM list.
                DMSourceColumn[] sourceColumns = new DMSourceColumn[2];
                sourceColumns[0] = new DMSourceColumn {
                    Name = "email"
                };
                sourceColumns[1] = new DMSourceColumn {
                    Name = "firstname"
                };
                int defaultKey;
                var allColumns = em.ListManager.GetColumnMappingAll(em.Token, ref sourceColumns, out defaultKey);

                // assume that all fields exist in Email Manager
                DMListField[] listFields = new DMListField[2];
                listFields[0] = MapToListField(allColumns.SingleOrDefault(column => column.Name == sourceColumns[0].Name), true);
                listFields[1] = MapToListField(allColumns.SingleOrDefault(column => column.Name == sourceColumns[1].Name), false);

                // Create a list
                int listId = em.ListManager.CreateRecipientList(
                    em.Token,
                    "API Created List " + DateTime.Now.ToString("yyyyMMdd_hhmmss"),
                    "Description Text",
                    309,
                    false,
                    false,
                    ref listFields,
                    null,
                    false
                    );

                return(listId);
            }
        }
        /// <summary>
        /// Query on EM list
        /// </summary>
        public string Query()
        {
            using (var em = new EMWebServicesClientExtension(Auth.GetToken(), Settings.Default.EndPoint))
            {
                DMListCriteria criteria = new DMListCriteria();

                // Set lists to query against. The lists needs to share the same primary key.
                int listID  = 1192;
                var listIds = new ArrayOfInt
                {
                    listID
                };
                // Add more lists as needed
                // listIds.Add(2);
                // listIds.Add(3);
                criteria.IncludeLists = listIds;

                // Set conditions
                var dmFieldCriteriaList = new List <DMFieldCriteria>();

                // e.g. condition for 'subscribed' recipients
                DMFieldCriteria dmFieldCriteria = new DMFieldCriteria
                {
                    QueryType = DMFieldQueryType.DMQT_ENABLED,
                    Parameter = 1,
                    Operator  = DMSQLOperator.DMSQ_EQUAL,
                    Combine   = DMCombine.DMCM_AND
                };
                dmFieldCriteriaList.Add(dmFieldCriteria);

                // e.g. condition for 'created' 7 days ago.
                dmFieldCriteria = new DMFieldCriteria
                {
                    QueryType = DMFieldQueryType.DMQT_MODIFIED,
                    Parameter = 0,
                    Operator  = DMSQLOperator.DMSQ_GREATERTHAN,
                    Combine   = DMCombine.DMCM_NONE,
                    Date1     = DateTime.Now.AddDays(-365 * 10)
                                // dmFieldCriteria.Date2 = DateTime.Today.AddDays(1);  // Not need for now, but will be needed when used with data range option.
                };

                dmFieldCriteriaList.Add(dmFieldCriteria);
                criteria.FieldCriteria = dmFieldCriteriaList.ToArray();

                // Run query
                int countRecipients = em.ListManager.ExecuteListQuery(em.Token, criteria);

                // Set field IDs to download
                var fields = new ArrayOfInt
                {
                    em.GetField("email").ID,
                    em.GetField("firstname").ID
                };

                // Download list
                int startIndex = 0;
                int endIndex   = 999999999;
                int count;
                var result = em.ListManager.GetQueryResultsCSV(em.Token, fields, startIndex, endIndex, false, out count);

                return(result);
            }
        }
        /// <summary>
        /// Export Email Manager response data
        /// </summary>
        public void Export()
        {
            using (var em = new EMWebServicesClientExtension(Auth.GetToken(), Settings.Default.EndPoint))
            {
                //date range
                DateTime startDate = DateTime.Now.AddDays(-30);
                DateTime endDate   = DateTime.Now;

                // define export filters
                List <DMEventExportFilter> filters = new List <DMEventExportFilter>();

                // event id can be found at http://em.help.alterian.com/#Dynamic_Reporting/Actions.htm?Highlight=Actions
                // for example, 1: submitted, 2: Email Open, 54: Any Click, 55: Any Bounce, 56: Any Unsubscribe
                filters.Add(GetFilter("1,2,54,55,56", DMEventExportFilterType.DMEF_INCLUDE_EVENTS));

                // Explicitly specify deployments to include only these deployments in event extraction, if needed
                // filters.Add(GetFilter("2563,2569", DMEventExportFilterType.DMEF_INCLUDE_DEPLOYMENTS));

                // Explicitly specify deployments to exclude in event extraction, if needed.
                filters.Add(GetFilter("100,200", DMEventExportFilterType.DMEF_EXCLUDE_DEPLOYMENTS));

                // define export columns
                var eventColumns = GetEventColumns();

                // create export
                int count;
                int pageSize = 1000; // keep this below 5,000 is the best practice
                var exportId = em.DmPlus.CreateExportByDate(em.Token, pageSize, startDate, endDate, filters.ToArray(), out count);

                // write pages of export to file
                var       pageNumber         = 1;
                const int maxRetryCount      = 5;
                var       retryAttempt       = 0;
                var       fileOutputLocation = $"Export{DateTime.Now:yyyyMMdd_hhmmss}.csv";
                while (true)
                {
                    try
                    {
                        // read response data
                        var exportData = em.DmPlus.ExportEventlogDataByPage(em.Token, exportId, pageNumber, startDate, endDate, filters.ToArray(), eventColumns.ToArray(), DMExportDataFormat.DMDF_CSV, CompressionMethod.CM_GZIP);

                        // write stream to file
                        var gZipStream = new GZipStream(exportData, CompressionMode.Decompress, false);
                        using (var exportReader = new StreamReader(gZipStream))
                        {
                            using (var writer = File.AppendText(fileOutputLocation))
                            {
                                var content = exportReader.ReadToEnd();
                                if (content.Length == 0)
                                {
                                    break;
                                }
                                writer.Write(content);
                            }
                        }

                        pageNumber++;
                    }
                    catch (Exception e)
                    {
                        if (retryAttempt < maxRetryCount)
                        {
                            retryAttempt++;
                            Console.WriteLine("Failed on chunk {0} - retry number {1}, will retry after a pause. Error: {2}", pageNumber, retryAttempt, e);
                            Thread.Sleep(1000 * retryAttempt);
                        }
                        else
                        {
                            Console.WriteLine("Failed on chunk {0}, no more retry attempts. Error: {1}", pageNumber, e);
                            throw;
                        }
                    }
                }

                em.DmPlus.DeleteExport(em.Token, exportId);
            }
        }