This sample code shows how to send a bulk e-mail and monitor its progress.
1: //# Send a Bulk E-mail and Monitor the Job
2: using System;
3: using CrmSdk;
4: using Microsoft.Crm.Sdk.Utility;
5: 6: namespace Microsoft.Crm.Sdk.HowTo.BulkOperation
7: {8: public class SendBulkEmailAndMonitor
9: {10: public SendBulkEmailAndMonitor()
11: { 12: 13: } 14: 15: public static bool Run(string crmServerUrl, string orgName)
16: {17: bool success = false;
18: 19: try
20: {21: // Set up the CRM Service.
22: CrmService service = Microsoft.Crm.Sdk.Utility.CrmServiceUtility.GetCrmService(crmServerUrl, orgName);23: service.PreAuthenticate = true;
24: 25: // Create some contacts to send a bulk e-mail to.
26: // Typically, this would be an existing list of customers, such as a marketing list.
27: object[] contactIds = new object[2];
28: 29: contact emailContact1 = new contact();
30: emailContact1.firstname = "Adam";
31: emailContact1.lastname = "Carter";
32: emailContact1.emailaddress1 = "adam.carter@example.com";
33: 34: // Create the contact.
35: contactIds[0] = service.Create(emailContact1); 36: 37: contact emailContact2 = new contact();
38: emailContact2.firstname = "Adina";
39: emailContact2.lastname = "Hagege";
40: emailContact2.emailaddress1 = "adina.hagege@example.com";
41: 42: // Create the contact.
43: contactIds[1] = service.Create(emailContact2); 44: 45: // Create the bulk mail request.
46: SendBulkMailRequest bulkMailRequest = new SendBulkMailRequest();
47: 48: // Create a query expression for the bulk operation to use to retrieve
49: // the contacts in our e-mail list.
50: ConditionExpression condition = new ConditionExpression();
51: condition.AttributeName = "contactid";
52: condition.Operator = ConditionOperator.In; 53: condition.Values = contactIds; 54: 55: FilterExpression filterExpression = new FilterExpression();
56: filterExpression.Conditions = new ConditionExpression[] { condition };
57: 58: ColumnSet returnColumns = new ColumnSet();
59: returnColumns.Attributes = new string[] { "contactid" };
60: 61: QueryExpression queryRequest = new QueryExpression();
62: queryRequest.ColumnSet = returnColumns; 63: queryRequest.EntityName = EntityName.contact.ToString(); 64: queryRequest.Criteria = filterExpression; 65: 66: // Attach the contact query to the bulk e-mail request.
67: bulkMailRequest.Query = queryRequest; 68: 69: // Get a system user to use as the sender.
70: bulkMailRequest.Sender = GetEmailSenderMoniker(service); 71: 72: // Set the RegardingId to the e-mail sender.
73: bulkMailRequest.RegardingId = bulkMailRequest.Sender.Id; 74: bulkMailRequest.RegardingType = EntityName.systemuser.ToString(); 75: 76: // Use a built-in e-mail template.
77: // NOTE: The e-mail template's 'template type' must match the type of customers
78: // in the e-mail list. Our list contains contacts, so our template must be for contacts.
79: bulkMailRequest.TemplateId = new Guid("07B94C1D-C85F-492F-B120-F0A743C540E6");
80: 81: // Create a tracking ID for the bulk operation to monitor its progress.
82: RequestIdOptionalParameter trackingId = new RequestIdOptionalParameter();
83: trackingId.Value = Guid.NewGuid(); 84: 85: // Attach the tracking ID to the bulk e-mail request.
86: bulkMailRequest.OptionalParameters = new OptionalParameter[] { trackingId };
87: 88: // Execute the async bulk e-mail request.
89: service.Execute(bulkMailRequest); 90: 91: // Now that we have executed the bulk operation, we have to retrieve it using our tracking ID.
92: ColumnSet asyncColumns = new ColumnSet();
93: asyncColumns.Attributes = new string[] { "requestid", "statecode" };
94: 95: QueryByAttribute bulkQuery = new QueryByAttribute();
96: bulkQuery.ColumnSet = asyncColumns; 97: bulkQuery.EntityName = EntityName.asyncoperation.ToString();98: bulkQuery.Attributes = new string[] { "requestid" };
99: bulkQuery.Values = new object[1];
100: bulkQuery.Values[0] = trackingId.Value; 101: 102: // Retrieve the bulk e-mail async operation.
103: BusinessEntityCollection aResponse = service.RetrieveMultiple(bulkQuery); 104: 105: // Monitor the async operation through polling.
106: const int ARBITRARY_MAX_POLLING_TIME = 60;
107: int secondsTicker = ARBITRARY_MAX_POLLING_TIME;
108: 109: asyncoperation createdBulkMailOperation = null;
110: 111: while (secondsTicker > 0)
112: {113: // Make sure that the async operation was retrieved.
114: if (aResponse.BusinessEntities.Length > 0)
115: {116: // Grab the one bulk operation that was created.
117: createdBulkMailOperation = (asyncoperation)aResponse.BusinessEntities[0]; 118: 119: // Check the operation's state.
120: if (createdBulkMailOperation.statecode.Value != AsyncOperationState.Completed)
121: {122: // The operation has not yet completed. Wait a second for the status to change.
123: System.Threading.Thread.Sleep(1000); 124: secondsTicker--; 125: 126: // Retrieve a fresh version the bulk delete operation.
127: aResponse = service.RetrieveMultiple(bulkQuery); 128: }129: else
130: {131: // Stop polling because the operation's state is now completed.
132: secondsTicker = 0; 133: } 134: }135: else
136: {137: // Wait a second for the async operation to become active.
138: System.Threading.Thread.Sleep(1000); 139: secondsTicker--; 140: 141: // Retrieve the entity again.
142: aResponse = service.RetrieveMultiple(bulkQuery); 143: } 144: } 145: 146: // When the bulk e-mail operation has finished, all sent e-mail messages will have a status of "Pending Send" and
147: // will be picked up by your e-mail router. Or, you can then use BackgroundSendEmail to download
148: // all the e-mail messages that were created by using the SendBulkEmail message. See the BackgroundSendEmail sample for an example.
149: 150: #region check success
151: 152: // Validate async operation succeeded.
153: if (createdBulkMailOperation.statecode.Value == AsyncOperationState.Completed)
154: {155: success = true;
156: } 157: 158: #endregion
159: 160: #region Remove Data Required for this Sample.
161: 162: // Delete the sent e-mail messages.
163: ColumnSet sentMailColumns = new ColumnSet();
164: sentMailColumns.Attributes = new string[] { "statuscode" };
165: 166: ConditionExpression statusCondition = new ConditionExpression();
167: statusCondition.AttributeName = "statuscode";
168: statusCondition.Operator = ConditionOperator.Equal;169: statusCondition.Values = new object[] { EmailStatus.PendingSend };
170: 171: // Create the query filter.
172: FilterExpression emailFilter = new FilterExpression();
173: emailFilter.Conditions = new ConditionExpression[] { statusCondition };
174: emailFilter.FilterOperator = LogicalOperator.And; 175: 176: // Query for e-mail activity.
177: QueryExpression emailsQuery = new QueryExpression();
178: emailsQuery.ColumnSet = sentMailColumns; 179: emailsQuery.EntityName = EntityName.email.ToString(); 180: emailsQuery.Criteria = emailFilter; 181: 182: // Retrieve the e-mail activity.
183: BusinessEntityCollection emails = service.RetrieveMultiple(emailsQuery); 184: 185: foreach (email sentMail in emails.BusinessEntities)
186: { 187: service.Delete(EntityName.email.ToString(), sentMail.activityid.Value); 188: } 189: 190: // Delete the contacts created for e-mails.
191: foreach (Guid createdContactId in contactIds)
192: { 193: service.Delete(EntityName.contact.ToString(), createdContactId); 194: } 195: 196: #endregion
197: }198: catch (System.Web.Services.Protocols.SoapException)
199: {200: // Perform error handling here.
201: throw;
202: }203: catch (Exception)
204: {205: throw;
206: } 207: 208: return success;
209: } 210: 211: /// <summary>
212: /// Retrieves a systemuser to use as the sender of an e-mail.
213: /// </summary>
214: /// <param name="service">The CRM service</param>
215: /// <returns>Moniker to use as e-mail sender</returns>
216: public static Moniker GetEmailSenderMoniker(CrmService service)
217: {218: Moniker emailSender = new Moniker();
219: 220: ColumnSet selectClause = new ColumnSet();
221: selectClause.Attributes = new string[] {"fullname"};
222: 223: QueryExpression allSystemUsersQuery = new QueryExpression();
224: allSystemUsersQuery.EntityName = EntityName.systemuser.ToString(); 225: allSystemUsersQuery.ColumnSet = selectClause; 226: 227: // Create the query request.
228: RetrieveMultipleRequest allSystemUsersRequest = new RetrieveMultipleRequest();
229: allSystemUsersRequest.Query = allSystemUsersQuery; 230: 231: // Execute the request.
232: RetrieveMultipleResponse allSystemUsersResponse = (RetrieveMultipleResponse)service.Execute(allSystemUsersRequest); 233: 234: // Grab a system user for the bulk e-mail.
235: if (allSystemUsersResponse.BusinessEntityCollection.BusinessEntities.Length > 0)
236: {237: // For demonstration, grab the first system user.
238: systemuser emailUser = (systemuser)allSystemUsersResponse.BusinessEntityCollection.BusinessEntities[0]; 239: emailSender.Id = emailUser.systemuserid.Value; 240: emailSender.Name = EntityName.systemuser.ToString(); 241: }242: else
243: {244: // If no system user was found, we cannot continue with bulk e-mail.
245: throw (new Exception("No system user found to send e-mail."));
246: } 247: 248: return emailSender;
249: } 250: } 251: }
No comments:
Post a Comment