예제 #1
0
 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);
     }
 }
예제 #2
0
        /// <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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
        /// <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;
        }