/// <summary> /// Sends the message to a person via the specified medium type using the system communication. /// </summary> /// <param name="person">The person.</param> /// <param name="mediumType">Type of the medium.</param> /// <param name="systemCommunication">The system communication.</param> /// <param name="mergeObjects">The merge objects.</param> /// <returns></returns> internal static SendMessageResult SendMessage(Person person, int mediumType, SystemCommunication systemCommunication, Dictionary <string, object> mergeObjects) { var results = new SendMessageResult(); CreateMessageResult createMessageResults; switch (mediumType) { case ( int )CommunicationType.SMS: createMessageResults = CreateSmsMessage(person, mergeObjects, systemCommunication); break; default: createMessageResults = CreateEmailMessage(person, mergeObjects, systemCommunication); break; } if (createMessageResults.Message == null) { results.Warnings.AddRange(createMessageResults.Warnings); return(results); } if (createMessageResults.Message.Send(out var errors)) { results.MessagesSent = 1; } else { results.Errors.AddRange(errors); } return(results); }
/// <summary> /// Sends the message to a group using the system communication. Each person in the group receives the message in their preferred medium. /// A "Recipient" merge object will be added to the merge objects. /// </summary> /// <param name="groupId">The group identifier.</param> /// <param name="systemCommunication">The system communication.</param> /// <param name="mergeObjects">The merge objects.</param> /// <returns></returns> public static SendMessageResult SendMessage(int groupId, SystemCommunication systemCommunication, Dictionary <string, object> mergeObjects) { var results = new SendMessageResult(); using (var rockContext = new RockContext()) { // The group members are the message recipients var groupMemberViews = new GroupMemberService(rockContext) .Queryable() .AsNoTracking() .Where(m => m.GroupId == groupId && m.GroupMemberStatus == GroupMemberStatus.Active && m.Person != null ) .Select(m => new { Person = m.Person, GroupCommunicationPreference = m.CommunicationPreference }) .Distinct() .ToList(); // Send the communication to each recipient in the group foreach (var groupMemberView in groupMemberViews) { var recipient = groupMemberView.Person; mergeObjects["Recipient"] = recipient; var mediumType = Rock.Model.Communication.DetermineMediumEntityTypeId( ( int )CommunicationType.Email, ( int )CommunicationType.SMS, ( int )CommunicationType.PushNotification, groupMemberView.GroupCommunicationPreference, groupMemberView.Person.CommunicationPreference); var result = SendMessage(recipient, mediumType, systemCommunication, mergeObjects); // Add this result to the set of results to return results.Warnings.AddRange(result.Warnings); results.Errors.AddRange(result.Errors); results.MessagesSent += result.MessagesSent; } } return(results); }
/// <summary> /// Sends the asynchronous. /// </summary> /// <returns></returns> public virtual async Task <SendMessageResult> SendAsync() { var sendEmailResult = new SendMessageResult(); try { if (this.Recipients.Any()) { var mediumEntity = EntityTypeCache.Get(MediumEntityTypeId); if (mediumEntity != null) { var medium = MediumContainer.GetComponent(mediumEntity.Name); if (medium != null) { var iAsyncMedium = medium as IAsyncMediumComponent; if (iAsyncMedium == null) { medium.Send(this, out var errorMessages); sendEmailResult.Errors.AddRange(errorMessages); } else { sendEmailResult = await iAsyncMedium.SendAsync(this).ConfigureAwait(false); } return(sendEmailResult); } } sendEmailResult.Errors.Add("Could not find valid Medium"); return(sendEmailResult); } return(sendEmailResult); } catch (Exception ex) { ExceptionLogService.LogException(ex, HttpContext.Current); sendEmailResult.Errors.Add(ex.Message); return(sendEmailResult); } }