public virtual async Task <string> FormatAddressAsync(Address address, bool newLineToBr = false) { Guard.NotNull(address, nameof(address)); var messageContext = new MessageContext { Language = _services.WorkContext.WorkingLanguage, Store = _services.StoreContext.CurrentStore, Model = new TemplateModel() }; await _messageModelProvider.AddModelPartAsync(address, messageContext, "Address"); var model = messageContext.Model["Address"]; var result = FormatAddress(model, address?.Country?.AddressFormat, messageContext.FormatProvider); if (newLineToBr) { result = HtmlUtils.ConvertPlainTextToHtml(result); } return(result); }
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 }); }