private long EmailTypeToSendInBlueId(EmailConstants.EmailTypes emailType)
        {
            string emailTemplateId = "";

            switch (emailType)
            {
            case EmailConstants.EmailTypes.PasswordReset:
                emailTemplateId = emailSettings.SendInBlueSettings.PasswordResetId;
                break;

            case EmailConstants.EmailTypes.WelcomeEmailValidation:
                emailTemplateId = emailSettings.SendInBlueSettings.WelcomeEmailValidationId;
                break;

            case EmailConstants.EmailTypes.PasswordResetUnknownEmail:
                emailTemplateId = emailSettings.SendInBlueSettings.PasswordResetUnknownEmailId;
                break;

            case EmailConstants.EmailTypes.PasswordResetEmailNotValidated:
                emailTemplateId = emailSettings.SendInBlueSettings.PasswordResetEmailNotValidatedId;
                break;

            case EmailConstants.EmailTypes.ChangePasswordEmail:
                emailTemplateId = emailSettings.SendInBlueSettings.ChangePasswordEmailId;
                break;

            case EmailConstants.EmailTypes.CommunityInvitation:
                emailTemplateId = emailSettings.SendInBlueSettings.CommunityInvitationId;
                break;

            case EmailConstants.EmailTypes.CommunityInvitationManager:
                emailTemplateId = emailSettings.SendInBlueSettings.CommunityInvitationManagerId;
                break;

            case EmailConstants.EmailTypes.None:
                throw new SendInBlueException("EmailType None");
            }

            if (emailTemplateId == "")
            {
                throw new SendInBlueException("EmailType Unknown: " + emailType.ToString());
            }

            try
            {
                return(Convert.ToInt64(emailTemplateId));
            }
            catch (Exception e)
            {
                throw new SendInBlueException(string.Format("EmailType {}: Could not convert {} to long. {}",
                                                            emailType, emailTemplateId, e.ToString()));
            }
        }
Example #2
0
        private string EmailTypeToSendgridId(EmailConstants.EmailTypes emailType)
        {
            string emailTemplateId = "";

            switch (emailType)
            {
            case EmailConstants.EmailTypes.PasswordReset:
                emailTemplateId = emailSettings.SendGridSettings.PasswordResetId;
                break;

            case EmailConstants.EmailTypes.WelcomeEmailValidation:
                emailTemplateId = emailSettings.SendGridSettings.WelcomeEmailValidationId;
                break;

            case EmailConstants.EmailTypes.PasswordResetUnknownEmail:
                emailTemplateId = emailSettings.SendGridSettings.PasswordResetUnknownEmailId;
                break;

            case EmailConstants.EmailTypes.PasswordResetEmailNotValidated:
                emailTemplateId = emailSettings.SendGridSettings.PasswordResetEmailNotValidatedId;
                break;

            case EmailConstants.EmailTypes.ChangePasswordEmail:
                emailTemplateId = emailSettings.SendGridSettings.ChangePasswordEmailId;
                break;

            case EmailConstants.EmailTypes.CommunityInvitation:
                emailTemplateId = emailSettings.SendGridSettings.CommunityInvitationId;
                break;

            case EmailConstants.EmailTypes.CommunityInvitationManager:
                emailTemplateId = emailSettings.SendGridSettings.CommunityInvitationManagerId;
                break;

            case EmailConstants.EmailTypes.SignupConfirmation:
                emailTemplateId = emailSettings.SendGridSettings.SignupConfirmationId;
                break;

            case EmailConstants.EmailTypes.None:
                throw new SendgridException("EmailType None");
            }

            if (emailTemplateId == "")
            {
                throw new SendgridException("EmailType Unknown: " + emailType.ToString());
            }

            return(emailTemplateId);
        }
Example #3
0
        public override async Task <string> SendTemplate(EmailConstants.EmailTypes emailType, Dictionary <string, string> emailAttributes)
        {
            Task <string> result = base.SendTemplate(emailType, emailAttributes);

            string templateFile = $"{Path.Combine(this.emailSettings.FileTemplatePath, emailType.ToString())}.html";
            string outputPath   = this.emailSettings.FileOutputPath ?? Path.Combine(Path.GetTempPath(), "morphic-emails");

            Directory.CreateDirectory(outputPath);

            string saveAs = Path.Combine(outputPath, this.emailSettings.FileOverwrite
                ? $"{emailType}-output.html"
                : $"{DateTime.Now:yyyyMMddTHHmmss}.{emailType}-output.html");

            // Some generate some debug information.
            StringBuilder debug = new StringBuilder();

            debug.AppendLine($"\n\n<!-- {emailType} {DateTime.Now:R}")
            .AppendLine($"Template: {Path.GetFileName(templateFile)}")
            .AppendLine($"Output: {Path.GetFileName(saveAs)}")
            .AppendLine()
            .AppendLine($"{string.Join("\n", emailAttributes)}")
            .AppendLine();

            HashSet <string> usedKeys = new HashSet <string>();

            string template;

            try
            {
                template = await File.ReadAllTextAsync(templateFile);
            }
            catch (Exception e)
            {
                // Create a basic template, using the email attributes dictionary.
                StringBuilder templateBuilder = new StringBuilder($"<html><body><pre>Email sent {DateTime.Now:R}\n\n");

                templateBuilder.AppendLine(e.Message).AppendLine();

                emailAttributes.Select(attr => $"{attr.Key}: {{{{ {attr.Key} }}}}\n")
                .ToList()
                .ForEach(s => templateBuilder.AppendLine(s));
                templateBuilder.AppendLine("</pre></body></html>");

                template = templateBuilder.ToString();
            }

            // Matches simple "handlebars" expressions, containing a key-name.
            Regex fillEmail = new Regex(@"\{\{\s*([^}\s]+)\s*}}");

            // Resolve the key-name with the value in the dictionary
            string content = fillEmail.Replace(template, match =>
            {
                string key = match.Groups[1].Value;
                if (emailAttributes.TryGetValue(key, out string?value))
                {
                    usedKeys.Add(key);
                }
                else
                {
                    debug.AppendLine($"Unknown: {key}");
                }

                return(value ?? match.Value);
            });

            debug.AppendLine($"Used: {string.Join(", ", usedKeys)}")
            .AppendLine($"Unused: {string.Join(", ", emailAttributes.Keys.Except(usedKeys))}")
            .AppendLine("-->");

            logger.LogWarning("Debug Email Output {File}", new Uri(saveAs));

            await File.WriteAllTextAsync(saveAs, content + debug, Encoding.UTF8);

            return(await result);
        }