public virtual async Task <SendEmailResult> SendEmailTemplateAsync <TTemplate>(TTemplate parameters)
            where TTemplate : EmailTemplate
        {
            if (parameters is null)
            {
                throw new ArgumentNullException(nameof(parameters), "Email template parameters are null");
            }

            var emailTemplateType = parameters.GetType();
            var emailTemplate     = EmailTemplateRepo.GetByType(emailTemplateType);

            if (emailTemplate == null)
            {
                new NullReferenceException($"Could not find email template by type {emailTemplateType.FullName}");
            }

            // check if this is a simulation
            if (parameters.Simulate)
            {
                return new SendEmailResult
                       {
                           Status         = "sent",
                           Server         = "Simulation",
                           ServerUsername = "******",
                           EmailAddress   = parameters.RecipientEmailAddress,
                           EmailSubject   = emailTemplate.EmailSubject
                       }
            }
            ;

            // check if this is a distributed email
            var isDistributedEmailList = parameters.RecipientEmailAddress.Contains(";");

            if (isDistributedEmailList)
            {
                var results = await SendDistributionEmailAsync(
                    parameters.RecipientEmailAddress,
                    emailTemplate.TemplateId,
                    parameters,
                    parameters.Test);

                return(results.FirstOrDefault());
            }

            // send email using the provider implementation
            return(await SendEmailAsync(parameters.RecipientEmailAddress, emailTemplate.TemplateId, parameters,
                                        parameters.Test));
        }
예제 #2
0
        public override async Task <SendEmailResult> SendEmailAsync <TModel>(string emailAddress, string templateId,
                                                                             TModel model, bool test)
        {
            // convert the model's public properties to a dictionary
            var mergeParameters = model.GetPropertiesDictionary();

            // prefix subject with environment name
            mergeParameters["Environment"] = SharedOptions.IsProduction() ? "" : $"[{SharedOptions.Environment}] ";

            // get template
            var emailTemplateInfo = EmailTemplateRepo.GetByTemplateId(templateId);
            var htmlContent       = File.ReadAllText(emailTemplateInfo.FilePath);

            // parse html
            var parser   = new HtmlParser();
            var document = parser.ParseDocument(htmlContent);

            // remove the meta data comments from the document
            var templateMetaData = document.Descendents <IComment>().FirstOrDefault();

            if (templateMetaData == null)
            {
                new NullReferenceException(nameof(templateMetaData));
            }

            templateMetaData.Remove();

            var messageSubject = emailTemplateInfo.EmailSubject;
            var messageHtml    = document.ToHtml();
            var messageText    = document.Text();

            // merge the template parameters
            foreach ((string name, object value) in mergeParameters)
            {
                messageSubject = messageSubject.Replace($"(({name}))", value.ToString());
                messageHtml    = messageHtml.Replace($"(({name}))", value.ToString());
            }

            var smtpServer     = string.IsNullOrWhiteSpace(Options.Server) ? Options.Server2 : Options.Server;
            var smtpServerPort = Options.Port <= 0 ? Options.Port2 : Options.Port;
            var smtpUsername   = string.IsNullOrWhiteSpace(Options.Username) ? Options.Username2 : Options.Username;
            var smtpPassword   = string.IsNullOrWhiteSpace(Options.Password) ? Options.Password2 : Options.Password;

            await Email.QuickSendAsync(
                messageSubject,
                Options.SenderEmail,
                Options.SenderName,
                Options.ReplyEmail,
                emailAddress,
                messageHtml,
                smtpServer,
                smtpUsername,
                smtpPassword,
                smtpServerPort,
                test : test);

            return(new SendEmailResult
            {
                Status = "sent",
                Server = $"{smtpServer}:{smtpServerPort}",
                ServerUsername = smtpUsername,
                EmailAddress = emailAddress,
                EmailSubject = messageSubject,
                EmailMessagePlainText = messageText
            });
        }