/// <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 ); } }
/// <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); } }