示例#1
0
        public virtual async Task <CreateMessageResult> CreateMessageAsync(MessageContext messageContext, bool queue, params object[] modelParts)
        {
            Guard.NotNull(messageContext, nameof(messageContext));

            modelParts ??= Array.Empty <object>();

            // Handle TestMode
            if (messageContext.TestMode && modelParts.Length == 0)
            {
                modelParts = await GetTestModelsAsync(messageContext);
            }

            ValidateMessageContext(messageContext, ref modelParts);

            // Create and assign model.
            var model = messageContext.Model = new TemplateModel();

            // Do not create message if the template does not exist, is not authorized or not active.
            if (messageContext.MessageTemplate == null)
            {
                return(new CreateMessageResult {
                    Model = model, MessageContext = messageContext
                });
            }

            // Add all global template model parts.
            await _modelProvider.AddGlobalModelPartsAsync(messageContext);

            // Add specific template models for passed parts.
            foreach (var part in modelParts)
            {
                if (model != null)
                {
                    await _modelProvider.AddModelPartAsync(part, messageContext);
                }
            }

            // Give implementors the chance to customize the final template model.
            await _eventPublisher.PublishAsync(new MessageModelCreatedEvent(messageContext, model));

            var messageTemplate = messageContext.MessageTemplate;
            var languageId      = messageContext.Language.Id;

            // Render templates
            var to      = RenderEmailAddress(messageTemplate.To, messageContext);
            var replyTo = RenderEmailAddress(messageTemplate.ReplyTo, messageContext, false);
            var bcc     = RenderTemplate(messageTemplate.GetLocalized((x) => x.BccEmailAddresses, languageId), messageContext, false);

            var subject = RenderTemplate(messageTemplate.GetLocalized((x) => x.Subject, languageId), messageContext);

            ((dynamic)model).Email.Subject = subject;

            var body = RenderBodyTemplate(messageContext);

            // CSS inliner
            body = InlineCss(body, model);

            // Model tree
            var modelTree     = _modelProvider.BuildModelTree(model);
            var modelTreeJson = JsonConvert.SerializeObject(modelTree, Formatting.None);

            if (modelTreeJson != messageTemplate.LastModelTree)
            {
                messageContext.MessageTemplate.LastModelTree = modelTreeJson;
                if (!messageTemplate.IsTransientRecord())
                {
                    _db.TryUpdate(messageContext.MessageTemplate);
                    await _db.SaveChangesAsync();
                }
            }

            // Create queued email from template
            var qe = new QueuedEmail
            {
                Priority = 5,
                From     = messageContext.SenderMailAddress ?? messageContext.EmailAccount.ToMailAddress(),
                //To = to.ToString(),
                To             = "",        // TODO: (mh) (core) Uncomment once template engine is available.
                Bcc            = bcc,
                ReplyTo        = replyTo?.ToString(),
                Subject        = subject,
                Body           = body,
                CreatedOnUtc   = DateTime.UtcNow,
                EmailAccountId = messageContext.EmailAccount.Id,
                SendManually   = messageTemplate.SendManually
            };

            // Create and add attachments (if any).
            await CreateAttachmentsAsync(qe, messageContext);

            if (queue)
            {
                // Put to queue.
                await QueueMessageAsync(messageContext, qe);
            }

            return(new CreateMessageResult {
                Email = qe, Model = model, MessageContext = messageContext
            });
        }