Exemple #1
0
        /// <summary>
        /// Send the email
        ///
        /// Looks for templates
        /// `EmailTemplates/{templateName}(.{languageCode}).Subject.txt` and
        /// `EmailTemplates/{templateName}(.{languageCode}).Body.html`
        ///
        /// In addition to `model` also Option section `EmailPlaceholders` is used
        /// in placeholders.
        /// </summary>
        /// <param name="templateName">Name of the template, </param>
        /// <param name="languageCode"></param>
        /// <param name="toEmail"></param>
        /// <param name="toName"></param>
        /// <param name="model">Used as placeholders</param>
        /// <exception cref="IOException">Thrown when the template can't be read</exception>
        /// <returns></returns>
        private async Task Send(string templateName, string languageCode, string toEmail, string toName, IEmailModel model)
        {
            var props = model.GetType().GetProperties();

            var subject         = new StringBuilder("");
            var body            = new StringBuilder("");
            var values          = new Dictionary <string, string>();
            var languageSuffix  = languageCode != "" ? $".{languageCode}" : "";
            var subjectFileName = Path.Combine(_env.ContentRootPath, "EmailTemplates", $"{templateName}{languageSuffix}.Subject.txt");
            var bodyFileName    = Path.Combine(_env.ContentRootPath, "EmailTemplates", $"{templateName}{languageSuffix}.Body.html");

            if (!File.Exists(subjectFileName) || !File.Exists(bodyFileName))
            {
                _logger.LogError($"Email template `{templateName}` does not exist");
                return;
            }

            try
            {
                using (var bodyFile = File.OpenRead(bodyFileName))
                    using (var subjectFile = File.OpenRead(subjectFileName))
                    {
                        subject = new StringBuilder(new StreamReader(subjectFile).ReadToEnd());
                        body    = new StringBuilder(new StreamReader(bodyFile).ReadToEnd());
                    }
            }
            catch (IOException e)
            {
                _logger.LogError($"Email template `{templateName}` could not be accessed", e);
                throw;
            }

            foreach (var p in _emailPlaceholders)
            {
                values.Add(p.Key.ToLower(), p.Value);
            }

            foreach (var p in props)
            {
                values.Add(p.Name.ToLower(), p.GetValue(model) as string);
            }

            foreach (var v in values)
            {
                subject.Replace($"[{v.Key}]", v.Value);
                body.Replace($"[{v.Key}]", v.Value);
            }

            await _emailSender.Send(toEmail, toName, subject.ToString(), body.ToString());
        }
Exemple #2
0
        public static IEnumerable <EmailMessageEntity> CreateEmailMessage(this IEmailModel emailModel)
        {
            if (emailModel.UntypedEntity == null)
            {
                throw new InvalidOperationException("Entity property not set on EmailModel");
            }

            using (IsolationEntity.Override((emailModel.UntypedEntity as Entity)?.TryIsolation()))
            {
                var emailModelEntity = ToEmailModelEntity(emailModel.GetType());
                var template         = GetDefaultTemplate(emailModelEntity, emailModel.UntypedEntity as Entity);

                return(EmailTemplateLogic.CreateEmailMessage(template.ToLite(), model: emailModel));
            }
        }