示例#1
0
        public async Task SendEmailAsync(string to, NotificationEvent @event)
        {
            var templateData = await _repository.GetEmailTemplateAsync(@event.EventName);

            if (templateData == null || !templateData.IsEnabled)
            {
                return;
            }

            var emailSubject = _templateEngine.Execute(templateData.Subject, @event.Parameters);

            string bodyHtml;

            switch (templateData.ContentsType)
            {
            case ContentsType.Markdown:
                var markdown = _templateEngine.Execute(templateData.Contents, @event.Parameters);
                bodyHtml = _markdownParser.ToTrustedHtml(markdown);
                break;

            case ContentsType.Html:
                bodyHtml = _templateEngine.Execute(templateData.Contents, @event.Parameters);
                break;

            default: throw new NotSupportedException($"Contents Type {templateData.ContentsType} is not supported for emails.");
            }

            string emailHtml;

            var layoutData = await _repository.GetLayoutHtmlAsync();

            if (string.IsNullOrWhiteSpace(layoutData))
            {
                emailHtml = bodyHtml;
            }
            else
            {
                var layoutParameters = new Dictionary <string, string>(@event.Parameters)
                {
                    { "body", bodyHtml }
                };

                emailHtml = _templateEngine.Execute(layoutData, layoutParameters);
            }

            var result = new ReadyEmail(
                @event.EventName,
                to,
                templateData.From,
                templateData.Cc,
                templateData.Bcc,
                emailSubject,
                emailHtml);

            await SendEmailSmtpAsync(result);
        }
示例#2
0
        private async Task SendEmailSmtpAsync(ReadyEmail email)
        {
            var smtp = _emailOptions.SmtpServer;

            if (smtp == null || smtp.Accounts.Length == 0)
            {
                return;
            }

            SmtpAccount?account = null;

            if (string.IsNullOrEmpty(email.From))
            {
                account = smtp.Accounts[0];
            }
            else
            {
                foreach (var a in smtp.Accounts)
                {
                    if (string.Equals(a.Address, email.From, StringComparison.OrdinalIgnoreCase))
                    {
                        account = a;
                    }
                }
            }

            if (account == null)
            {
                _logger.LogError("No smtp user configured for address '{address}'", email.From);
                return;
            }

            var from = email.From ?? account.Address ?? account.Username;

            try
            {
                using var client = new SmtpClient();

                var sso = Enum.Parse <SecureSocketOptions>(smtp.Mode);
                await client.ConnectAsync(smtp.Host, smtp.Port, sso);

                var creds = new NetworkCredential(account.Username, account.Password);
                await client.AuthenticateAsync(new SaslMechanismLogin(creds));

                var message = new MimeMessage();

                message.From.Add(InternetAddress.Parse(from));
                message.To.Add(InternetAddress.Parse(email.To));
                message.Cc.AddRange(Array.ConvertAll(email.Cc, InternetAddress.Parse));
                message.Bcc.AddRange(Array.ConvertAll(email.Bcc, InternetAddress.Parse));

                message.Subject = email.Subject;
                message.Body    = new TextPart(TextFormat.Html)
                {
                    Text = email.Html
                };

                await client.SendAsync(message);

                await client.DisconnectAsync(true);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Unable to send email {event} from {from} to {to}",
                                 email.EventName, from, email.To);
            }
        }