private void AddGlobalProperties(SG.SendGridMessage message, IMessageJobRequest messageJob) { message.From = new SG.EmailAddress(messageJob.SenderEmailAddress, messageJob.SenderName); message.Subject = messageJob.MessageTemplate.Subject; message.PlainTextContent = messageJob.MessageTemplate.PlainTextVersion; message.HtmlContent = messageJob.MessageTemplate.BodyHtml; if (messageJob.CustomMessageHeaders != null && messageJob.CustomMessageHeaders.Count > 0) { message.CustomArgs = new Dictionary <string, string>(messageJob.CustomMessageHeaders); } }
/// <summary> /// Constructs a SendGrid message based on the specified <paramref name="messageJob"/> and <paramref name="subscribers"/>. /// </summary> /// <param name="messageJob">The Sitefinity message job from which to construct a SendGrid message.</param> /// <param name="subscribers">The subscribers for the message.</param> /// <returns>A SendGrid message with configured subscribers, substitutions, subject template etc.</returns> public SG.SendGridMessage ConstructMessage(IMessageJobRequest messageJob, IEnumerable <ISubscriberResponse> subscribers) { //// TODO: raise some events here. There is a high chance someone would like //// to extend the message before or after it has been constructed in the following code. var message = new SG.SendGridMessage(); message.Personalizations = new List <SG.Personalization>(); this.AddGlobalProperties(message, messageJob); // Adding per subscriber information that is needed to build the message template and the subscriber id custom message header. this.AddSubscribersInfo(message, messageJob, subscribers); return(message); }
private IEnumerable <string> GetReplacementTags(IMessageJobRequest messageJob) { // TODO: add the replacement tags from the HTML and plain text messages in a hash set then return the set.AsEnumerable(); // this way all replacement tags will be considered not just those in the HTML message. var text = messageJob.MessageTemplate.BodyHtml; if (text == null) { text = messageJob.MessageTemplate.PlainTextVersion; } var matches = NewsletterTemplatesConstants.PlaceholdersRegex.Matches(text); var replacementTags = new List <string>(matches.Count); foreach (Match match in matches) { replacementTags.Add(match.Value); } return(replacementTags); }
private void AddSubscribersInfo(SG.SendGridMessage message, IMessageJobRequest messageJob, IEnumerable <ISubscriberResponse> subscribers) { var replacementTags = this.GetReplacementTags(messageJob).ToList(); // Filling in the substitutions data structure with per subscriber values via persionalizations. foreach (var subscriber in subscribers) { // TODO: validate subscribers email addresses // TODO: add email + recipient name as TO address. var personalization = new SG.Personalization() { Tos = new List <SG.EmailAddress>() { new SG.EmailAddress(subscriber.Email) }, Substitutions = this.CalculateSubstitutions(replacementTags, subscriber.ToDictionary()) }; message.Personalizations.Add(personalization); } }
/// <summary> /// Sends the message to the given subscribers using the SendGrid service. /// </summary> /// <param name="messageJob">The message info.</param> /// <param name="subscribers">The subscribers.</param> /// <returns>Information about the batch send operation.</returns> public SendResult SendMessage(IMessageJobRequest messageJob, IEnumerable <ISubscriberResponse> subscribers) { Guard.ArgumentNotNull(messageJob, "messageJob"); Guard.ArgumentNotNull(subscribers, "subscribers"); var message = this.ConstructMessage(messageJob, subscribers); var task = this.SendAsync(message); var subscriberResulType = task.Result.Type == SendResultType.Failed ? SendResultType.FailedRecipient : task.Result.Type; foreach (var subscriber in subscribers) { var notifiableSubscriber = subscriber as INotifiable; if (notifiableSubscriber != null) { notifiableSubscriber.Result = subscriberResulType; notifiableSubscriber.IsNotified = true; } } return(task.Result); }
private void AddGlobalProperties(SG.SendGridMessage message, IMessageJobRequest messageJob) { message.From = new MailAddress(messageJob.SenderEmailAddress, messageJob.SenderName); message.Subject = messageJob.MessageTemplate.Subject; message.Text = messageJob.MessageTemplate.PlainTextVersion; message.Html = messageJob.MessageTemplate.BodyHtml; }
private IEnumerable<string> GetReplacementTags(IMessageJobRequest messageJob) { // TODO: add the replacement tags from the HTML and plain text messages in a hash set then return the set.AsEnumerable(); // this way all replacement tags will be considered not just those in the HTML message. var matches = NewsletterTemplatesConstants.PlaceholdersRegex.Matches(messageJob.MessageTemplate.BodyHtml); var replacementTags = new List<string>(matches.Count); foreach (Match match in matches) { replacementTags.Add(match.Value); } return replacementTags; }
private void AddSubscribersInfo(SG.SendGridMessage message, IMessageJobRequest messageJob, IEnumerable<ISubscriberResponse> subscribers) { IEnumerable<string> replacementTags = this.GetReplacementTags(messageJob); // Creating Dictionary<string, List<string>> that will contain the replacement tag like {|Subscriber.Name|} and custom headers // like {|Subscriber.ResolveKey|} as keys. The value will be the list of per subscriber values in the same order as the list of // emails to send to. var substitutions = this.InitializeSubstitutions(replacementTags, messageJob.CustomMessageHeaders); // Filling in the substitutions data structure with per subscriber values. foreach (var subscriber in subscribers) { // TODO: validate subscribers email addresses // TODO: add email + recipient name as TO address. message.AddTo(subscriber.Email); var subscriberPropertiesAsDict = subscriber.ToDictionary(); this.CalculateSubstitutions(substitutions, subscriberPropertiesAsDict); } // Adding the constructed substitutions in the SendGrid message. foreach (var substitutionPair in substitutions) { message.AddSubstitution(substitutionPair.Key, substitutionPair.Value); } }
/// <summary> /// Constructs a SendGrid message based on the specified <paramref name="messageJob"/> and <paramref name="subscribers"/>. /// </summary> /// <param name="messageJob">The Sitefinity message job from which to construct a SendGrid message.</param> /// <param name="subscribers">The subscribers for the message.</param> /// <returns>A SendGrid message with configured subscribers, substitutions, subject template etc.</returns> public SG.SendGridMessage ConstructMessage(IMessageJobRequest messageJob, IEnumerable<ISubscriberResponse> subscribers) { //// TODO: raise some events here. There is a high chance someone would like //// to extend the message before or after it has been constructed in the following code. var message = new SG.SendGridMessage(); this.AddGlobalProperties(message, messageJob); // Adding per subscriber information that is needed to build the message template and the subscriber id custom message header. this.AddSubscribersInfo(message, messageJob, subscribers); // Adding the custom headers of the message job this.AddCustomHeaders(message, messageJob.CustomMessageHeaders); return message; }
/// <summary> /// Sends the message to the given subscribers using the SendGrid service. /// </summary> /// <param name="messageJob">The message info.</param> /// <param name="subscribers">The subscribers.</param> /// <returns>Information about the batch send operation.</returns> public SendResult SendMessage(IMessageJobRequest messageJob, IEnumerable<ISubscriberResponse> subscribers) { Guard.ArgumentNotNull(messageJob, "messageJob"); Guard.ArgumentNotNull(subscribers, "subscribers"); var message = this.ConstructMessage(messageJob, subscribers); var task = this.SendAsync(message); return task.Result; }