Beispiel #1
0
        public async Task <SendMessageTemplate[]> ListTemplatesAsync()
        {
            var client            = new global::SendGrid.SendGridClient(apiKey);
            var responseTemplates = await client.RequestAsync(global::SendGrid.SendGridClient.Method.GET, urlPath : $"/templates");

            var templateInfo = await responseTemplates.Body.ReadAsStringAsync();

            var     converter = new Newtonsoft.Json.Converters.ExpandoObjectConverter();
            dynamic obj       = Newtonsoft.Json.JsonConvert.DeserializeObject <System.Dynamic.ExpandoObject>(templateInfo, converter);

            return(((List <object>)obj.templates).Select((dynamic tmp) => new SendMessageTemplate()
            {
                externalTemplateId = tmp.id,
                name = tmp.name,
            }).ToArray());
        }
Beispiel #2
0
        public async Task <TResult> SendEmailMessageAsync <TResult>(
            string templateName,
            string toAddress, string toName,
            string fromAddress, string fromName,
            string subject,
            IDictionary <string, string> substitutionsSingle,
            IDictionary <string, IDictionary <string, string>[]> substitutionsMultiple,
            Func <string, TResult> onSuccess,
            Func <TResult> onServiceUnavailable,
            Func <string, TResult> onFailure)
        {
            var message = new SendGridMessage();

            message.From    = new EmailAddress(fromAddress, fromName);
            message.Subject = subject;
            message.SetClickTracking(false, true);
            //message.TemplateId = templateName;

            var emailMute      = false;
            var toAddressEmail = EastFive.Web.Configuration.Settings.GetString(AppSettings.MuteEmailToAddress,
                                                                               (emailMuteString) =>
            {
                if (emailMuteString.IsNullOrWhiteSpace())
                {
                    return(new EmailAddress(toAddress, toName));
                }
                emailMute = true;
                return(new EmailAddress(emailMuteString, $"MUTED[{toAddress}:{toName}]"));
            },
                                                                               (why) => new EmailAddress(toAddress, toName));

            message.AddTo(toAddressEmail);
            // message.SetClickTracking(false, false);

            var bccAddressesAdded = Web.Configuration.Settings.GetString(AppSettings.BccAllAddresses,
                                                                         copyEmail =>
            {
                var bccAddresses = (copyEmail.IsNullOrWhiteSpace() ? "" : copyEmail)
                                   .Split(',')
                                   .Where(s => !String.IsNullOrWhiteSpace(s))
                                   .Select((bccAddress) => new EmailAddress(bccAddress))
                                   .ToList();
                if (bccAddresses.Any())
                {
                    message.AddBccs(bccAddresses);
                }
                return(true);
            },
                                                                         (why) => false);


            var subsitutionsSingleDictionary = substitutionsSingle
                                               .Select(kvp => new KeyValuePair <string, string>($"--{kvp.Key}--", kvp.Value))
                                               .ToDictionary();

            message.AddSubstitutions(subsitutionsSingleDictionary);
            var client = new global::SendGrid.SendGridClient(apiKey);

            var responseTemplates = await client.RequestAsync(global::SendGrid.SendGridClient.Method.GET, urlPath : $"/templates/{templateName}");

            if (responseTemplates.StatusCode == System.Net.HttpStatusCode.NotFound)
            {
                return(onFailure($"The specified template [{templateName}] does not exist."));
            }
            var templateInfo = await responseTemplates.Body.ReadAsStringAsync();

            if (!responseTemplates.StatusCode.IsSuccess())
            {
                return(onFailure($"Failed to aquire template:{templateInfo}"));
            }

            var     converter = new Newtonsoft.Json.Converters.ExpandoObjectConverter();
            dynamic obj       = Newtonsoft.Json.JsonConvert.DeserializeObject <System.Dynamic.ExpandoObject>(templateInfo, converter);
            string  html      = obj.versions[0].html_content;
            var     htmlDoc   = new HtmlAgilityPack.HtmlDocument();

            htmlDoc.LoadHtml(html);
            if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
            {
                return(onFailure($"Template has parse errors:{htmlDoc.ParseErrors.Select(pe => pe.Reason).Join(";")}"));
            }

            var substitutionsMultipleExpanded = substitutionsMultiple
                                                .NullToEmpty()
                                                .SelectMany(
                (substitutionMultiple) =>
            {
                var matchingNodes = htmlDoc.DocumentNode.SelectNodes($"//*[@data-repeat='--{substitutionMultiple.Key}--']");
                if (!matchingNodes.NullToEmpty().Any())
                {
                    return new HtmlAgilityPack.HtmlNode[] { }
                }
                ;

                var substituations = matchingNodes
                                     .Select(
                    matchingNode =>
                {
                    var parentNode = substitutionMultiple.Value
                                     .Where(
                        subValues =>
                    {
                        if (!matchingNode.Attributes.Contains("data-repeat-selector-key"))
                        {
                            return(true);
                        }
                        if (!matchingNode.Attributes.Contains("data-repeat-selector-value"))
                        {
                            return(true);
                        }
                        var key = matchingNode.Attributes["data-repeat-selector-key"].Value;
                        if (!subValues.ContainsKey(key))
                        {
                            return(false);
                        }
                        var value = matchingNode.Attributes["data-repeat-selector-value"].Value;
                        return(subValues[key] == value);
                    })
                                     .Aggregate(matchingNode.ParentNode,
                                                (parentNodeAggr, subValues) =>
                    {
                        var newChildHtml = subValues
                                           .Aggregate(
                            matchingNode.OuterHtml,
                            (subTextAggr, sub) =>
                        {
                            subTextAggr = subTextAggr.Replace($"--{sub.Key}--", sub.Value);
                            return(subTextAggr);
                        });

                        var childNode = HtmlAgilityPack.HtmlNode.CreateNode(newChildHtml);
                        parentNodeAggr.AppendChild(childNode);
                        return(parentNodeAggr);
                    });

                    parentNode.RemoveChild(matchingNode);
                    //return new KeyValuePair<string, string>(matchingNode.OuterHtml, subText);
                    return(matchingNode);
                })
                                     .ToArray();
                return(substituations);
            })
                                                .ToArray();

            // message.AddSubstitutions(substitutionsMultipleExpanded);
            //message.HtmlContent = htmlDoc.DocumentNode.OuterHtml;
            message.PlainTextContent = htmlDoc.DocumentNode.InnerText;

            message.HtmlContent = subsitutionsSingleDictionary.Aggregate(
                htmlDoc.DocumentNode.OuterHtml,
                (outerHtml, substitutionSingle) =>
            {
                return(outerHtml.Replace($"--{substitutionSingle.Key}--", substitutionSingle.Value));
            });

            // Send the email, which returns an awaitable task.
            try
            {
                var response = await client.SendEmailAsync(message);

                var body = await response.Body.ReadAsStringAsync();

                if (!response.StatusCode.IsSuccess())
                {
                    return(onFailure(body));
                }

                var messageIdHeaders = response.Headers
                                       .Where(header => header.Key == "X-Message-Id");
                if (!messageIdHeaders.Any())
                {
                    return(onSuccess(body));
                }

                var messageIds = messageIdHeaders.First().Value;
                if (!messageIds.Any())
                {
                    return(onSuccess(body));
                }

                var messageId = messageIds.First();
                return(onSuccess(messageId));
            }
            catch (Exception ex)
            {
                //var details = new StringBuilder();

                //details.Append("ResponseStatusCode: " + ex.ResponseStatusCode + ".   ");
                //for (int i = 0; i < ex.Errors.Count(); i++)
                //{
                //    details.Append(" -- Error #" + i.ToString() + " : " + ex.Errors[i]);
                //}

                return(onFailure(ex.ToString()));
            }
        }