Example #1
0
        public virtual CreateMessageResult CreateMessage(MessageContext messageContext, bool queue,
                                                         params object[] modelParts)
        {
            ValidateMessageContext(messageContext, ref modelParts);

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

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

            // Add specific template models for passed parts
            foreach (var part in modelParts)
            {
                _modelProvider.AddModelPart(part, messageContext);
            }

            var messageTemplate = messageContext.MessageTemplate;

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

            var subject = RenderTemplate(messageTemplate.Subject, messageContext);

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

            var body = RenderBodyTemplate(messageContext);

            // CSS inliner
            body = InlineCss(body);

            var mail = new SendMail
            {
                Subject   = subject,
                Body      = body,
                MessageId = "mail",
                ToEmail   = messageContext.EmailAccount.FromAddress
            };

            _sendMailService.SendMailSmtp(mail);

            return(new CreateMessageResult {
                MessageContext = messageContext
            });
        }
        public virtual CreateMessageResult CreateMessage(MessageContext messageContext, bool queue, params object[] modelParts)
        {
            Guard.NotNull(messageContext, nameof(messageContext));

            modelParts = modelParts ?? new object[0];

            // Handle TestMode
            if (messageContext.TestMode && modelParts.Length == 0)
            {
                modelParts = GetTestModels(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
            _modelProvider.AddGlobalModelParts(messageContext);

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

            // Give implementors the chance to customize the final template model
            _services.EventPublisher.Publish(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())
                {
                    _messageTemplateService.UpdateMessageTemplate(messageContext.MessageTemplate);
                }
            }

            // Create queued email from template
            var qe = new QueuedEmail
            {
                Priority       = 5,
                From           = messageContext.SenderEmailAddress ?? messageContext.EmailAccount.ToEmailAddress(),
                To             = to.ToString(),
                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)
            CreateAttachments(qe, messageContext);

            if (queue)
            {
                // Put to queue
                QueueMessage(messageContext, qe);
            }

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