From 9d14c9da017ba7304e5b08d1b7d58e83fe6295cc Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Tue, 2 Jun 2026 11:08:19 +0200 Subject: [PATCH 01/14] Add SendEmailFromTemplate request handler Implements the SendEmailFromTemplate message by validating the request (TemplateId, Target email, RegardingId/RegardingType), setting the regarding object, and delegating to the existing Create and SendEmail handlers so security, plugins and email status transitions are applied consistently. Performs a best-effort template content merge (subject/body) when the 'template' entity is present in metadata; token substitution is not modelled. Guarding on metadata keeps it safe where 'template' was not generated. --- src/XrmMockup365/Core.cs | 1 + .../SendEmailFromTemplateRequestHandler.cs | 71 ++++++++++++++ .../TestSendEmailFromTemplate.cs | 95 +++++++++++++++++++ 3 files changed, 167 insertions(+) create mode 100644 src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs create mode 100644 tests/XrmMockup365Test/TestSendEmailFromTemplate.cs diff --git a/src/XrmMockup365/Core.cs b/src/XrmMockup365/Core.cs index c3f22623..3bd5a387 100644 --- a/src/XrmMockup365/Core.cs +++ b/src/XrmMockup365/Core.cs @@ -452,6 +452,7 @@ private void InitializeDB() new InitializeFileBlocksDownloadRequestHandler(this, db, metadata, security), new DownloadBlockRequestHandler(this, db, metadata, security), new InstantiateTemplateRequestHandler(this, db, metadata, security), + new SendEmailFromTemplateRequestHandler(this, db, metadata, security), new CreateMultipleRequestHandler(this, db, metadata, security), new UpdateMultipleRequestHandler(this, db, metadata, security), new DeleteMultipleRequestHandler(this, db, metadata, security), diff --git a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs new file mode 100644 index 00000000..043e539a --- /dev/null +++ b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs @@ -0,0 +1,71 @@ +using DG.Tools.XrmMockup.Database; +using Microsoft.Crm.Sdk.Messages; +using Microsoft.Xrm.Sdk; +using Microsoft.Xrm.Sdk.Messages; +using System; +using System.ServiceModel; + +namespace DG.Tools.XrmMockup +{ + internal class SendEmailFromTemplateRequestHandler : RequestHandler + { + public SendEmailFromTemplateRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "SendEmailFromTemplate") { } + + internal override OrganizationResponse Execute(OrganizationRequest orgRequest, EntityReference userRef) + { + var request = MakeRequest(orgRequest); + + if (request.TemplateId == Guid.Empty) + throw new FaultException("Template id should be set."); + + if (request.Target == null) + throw new FaultException("Target email is missing."); + + if (request.Target.LogicalName != "email") + throw new FaultException("Target must be an email entity."); + + if (request.RegardingId == Guid.Empty) + throw new FaultException("Regarding id should be set."); + + if (string.IsNullOrEmpty(request.RegardingType)) + throw new FaultException("Regarding type should be set."); + + var email = request.Target; + email["regardingobjectid"] = new EntityReference(request.RegardingType, request.RegardingId); + + // Best-effort template merge: when the 'template' entity is present in metadata + // and the record exists, use its subject/body for fields the caller did not + // supply on the Target email. Token substitution (e.g. {!contact.firstname;}) + // is not modelled - the template content is copied verbatim. Guarding on + // metadata keeps this safe in environments where 'template' was not generated + // (looking up an entity with no metadata throws). + if (metadata.EntityMetadata.ContainsKey("template")) + { + var template = db.GetEntityOrNull(new EntityReference("template", request.TemplateId)); + if (template != null) + { + if (!email.Contains("subject") && template.Contains("subject")) + email["subject"] = template.GetAttributeValue("subject"); + + if (!email.Contains("description") && template.Contains("body")) + email["description"] = template.GetAttributeValue("body"); + } + } + + // Delegate to the existing Create and SendEmail handlers so plugins, security + // and status transitions are applied consistently. + var createResponse = (CreateResponse)core.Execute(new CreateRequest { Target = email }, userRef); + var emailId = createResponse.id; + + core.Execute(new SendEmailRequest { EmailId = emailId, IssueSend = true }, userRef); + + return new SendEmailFromTemplateResponse + { + Results = new ParameterCollection + { + { "Id", emailId } + } + }; + } + } +} diff --git a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs new file mode 100644 index 00000000..cfcc0bf3 --- /dev/null +++ b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs @@ -0,0 +1,95 @@ +using DG.XrmFramework.BusinessDomain.ServiceContext; +using Microsoft.Crm.Sdk.Messages; +using Microsoft.Xrm.Sdk; +using System; +using System.Linq; +using System.ServiceModel; +using Xunit; + +namespace DG.XrmMockupTest +{ + public class TestSendEmailFromTemplate : UnitTestBase + { + public TestSendEmailFromTemplate(XrmMockupFixture fixture) : base(fixture) { } + + private Email BuildEmail(Contact recipient) + { + return new Email + { + From = new ActivityParty[] + { + new ActivityParty { PartyId = crm.AdminUser } + }, + To = new ActivityParty[] + { + new ActivityParty { PartyId = recipient.ToEntityReference() } + }, + Subject = "Test Email From Template", + }; + } + + [Fact] + public void TestSendEmailFromTemplateCreatesAndSendsEmail() + { + var contact = new Contact + { + FirstName = "Test", + EMailAddress1 = "test@test.com" + }; + contact.Id = orgAdminUIService.Create(contact); + + var request = new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = Guid.NewGuid(), + RegardingId = contact.Id, + RegardingType = Contact.EntityLogicalName + }; + + var response = orgAdminUIService.Execute(request) as SendEmailFromTemplateResponse; + + Assert.NotNull(response); + Assert.NotEqual(Guid.Empty, response.Id); + + using (var context = new Xrm(orgAdminUIService)) + { + var email = context.EmailSet.FirstOrDefault(e => e.Id == response.Id); + Assert.NotNull(email); + Assert.Equal(EmailState.Completed, email.StateCode); + Assert.Equal(Email_StatusCode.PendingSend, email.StatusCode); + Assert.Equal(contact.Id, email.RegardingObjectId.Id); + } + } + + [Fact] + public void TestSendEmailFromTemplateThrowsWhenTemplateIdMissing() + { + var contact = new Contact { FirstName = "Test", EMailAddress1 = "test@test.com" }; + contact.Id = orgAdminUIService.Create(contact); + + var request = new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + RegardingId = contact.Id, + RegardingType = Contact.EntityLogicalName + }; + + Assert.Throws(() => orgAdminUIService.Execute(request)); + } + + [Fact] + public void TestSendEmailFromTemplateThrowsWhenRegardingMissing() + { + var contact = new Contact { FirstName = "Test", EMailAddress1 = "test@test.com" }; + contact.Id = orgAdminUIService.Create(contact); + + var request = new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = Guid.NewGuid() + }; + + Assert.Throws(() => orgAdminUIService.Execute(request)); + } + } +} From 4264a3e1770b6874ebdfd0270395fcfd6cab8857 Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Tue, 2 Jun 2026 11:36:54 +0200 Subject: [PATCH 02/14] Render e-mail templates via XSLT in SendEmailFromTemplate A Dataverse template's subject/body are XSLT stylesheets transformed against a document built from the records the e-mail draws from. EmailTemplateRenderer reproduces this: it builds from the regarding record and the sending user and runs the stylesheet with XslCompiledTransform, matching the platform's merge behaviour. Plain-text or non-XSLT content is returned unchanged. The handler now loads the template and renders subject/body into the e-mail before creating and sending it. Tests: - TestEmailTemplateRenderer exercises the renderer with the actual XSLT of the built-in "Thank you for registering" contact template. - An end-to-end SendEmailFromTemplate test creates a real template record and asserts the rendered subject/body on the sent e-mail. This required adding the 'template' entity to the test fixture metadata (TemplateMetadata.xml). --- .../Internal/EmailTemplateRenderer.cs | 124 ++++++++++++++++++ .../SendEmailFromTemplateRequestHandler.cs | 31 +++-- .../Metadata/TemplateMetadata.xml | 1 + .../TestEmailTemplateRenderer.cs | 109 +++++++++++++++ .../TestSendEmailFromTemplate.cs | 61 +++++++++ 5 files changed, 316 insertions(+), 10 deletions(-) create mode 100644 src/XrmMockup365/Internal/EmailTemplateRenderer.cs create mode 100644 tests/XrmMockup365Test/Metadata/TemplateMetadata.xml create mode 100644 tests/XrmMockup365Test/TestEmailTemplateRenderer.cs diff --git a/src/XrmMockup365/Internal/EmailTemplateRenderer.cs b/src/XrmMockup365/Internal/EmailTemplateRenderer.cs new file mode 100644 index 00000000..fb6d032f --- /dev/null +++ b/src/XrmMockup365/Internal/EmailTemplateRenderer.cs @@ -0,0 +1,124 @@ +using Microsoft.Xrm.Sdk; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Xml; +using System.Xml.Xsl; + +namespace DG.Tools.XrmMockup +{ + /// + /// Renders Dynamics e-mail template content. In Dataverse a template's subject and + /// body attributes are XSLT stylesheets (method="text") that transform a + /// <data> document built from the records the e-mail draws from (the regarding + /// record and the sending user). This reproduces that mechanism so the merged text matches + /// what the platform produces. + /// + internal static class EmailTemplateRenderer + { + /// + /// Renders a single template field (subject or body). + /// + /// The raw template attribute value (an XSLT stylesheet in Dataverse). + /// + /// The records available to the template, keyed by logical name. Each becomes a child of + /// <data> (e.g. <contact>, <systemuser>) with one + /// element per populated attribute. + /// + /// + /// The merged text. If the field is not an XSLT stylesheet, or the transform fails, the + /// raw value is returned unchanged so plain-text templates still work. + /// + public static string Render(string templateField, IReadOnlyDictionary entitiesByLogicalName) + { + if (string.IsNullOrWhiteSpace(templateField)) + return templateField; + + // Real Dataverse templates are XSLT. Anything else is treated as literal text. + if (templateField.IndexOf("xsl:stylesheet", StringComparison.OrdinalIgnoreCase) < 0) + return templateField; + + try + { + var transform = new XslCompiledTransform(); + using (var stringReader = new StringReader(templateField)) + using (var xsltReader = XmlReader.Create(stringReader)) + { + // Default XsltSettings: scripts and the document() function are disabled. + transform.Load(xsltReader); + } + + var dataDocument = BuildDataDocument(entitiesByLogicalName); + + using (var writer = new StringWriter(CultureInfo.InvariantCulture)) + { + transform.Transform(dataDocument, null, writer); + return writer.ToString(); + } + } + catch (Exception e) when (e is XmlException || e is XsltException) + { + // Not valid XSLT - fall back to the raw value rather than failing the send. + return templateField; + } + } + + private static XmlDocument BuildDataDocument(IReadOnlyDictionary entitiesByLogicalName) + { + var document = new XmlDocument(); + var dataElement = document.CreateElement("data"); + document.AppendChild(dataElement); + + if (entitiesByLogicalName == null) + return document; + + foreach (var pair in entitiesByLogicalName) + { + if (pair.Value == null || string.IsNullOrEmpty(pair.Key)) + continue; + + var entityElement = document.CreateElement(pair.Key); + dataElement.AppendChild(entityElement); + + foreach (var attribute in pair.Value.Attributes) + { + var text = AttributeToString(attribute.Value); + if (string.IsNullOrEmpty(text)) + continue; + + var attributeElement = document.CreateElement(attribute.Key); + attributeElement.InnerText = text; + entityElement.AppendChild(attributeElement); + } + } + + return document; + } + + private static string AttributeToString(object value) + { + switch (value) + { + case null: + return null; + case string s: + return s; + case EntityReference reference: + return reference.Name; + case OptionSetValue optionSet: + return optionSet.Value.ToString(CultureInfo.InvariantCulture); + case Money money: + return money.Value.ToString(CultureInfo.InvariantCulture); + case bool boolean: + return boolean ? "True" : "False"; + case DateTime dateTime: + return dateTime.ToString(CultureInfo.InvariantCulture); + case IFormattable formattable: + return formattable.ToString(null, CultureInfo.InvariantCulture); + default: + return value.ToString(); + } + } + } +} diff --git a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs index 043e539a..611bcaa0 100644 --- a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs +++ b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs @@ -3,6 +3,7 @@ using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using System; +using System.Collections.Generic; using System.ServiceModel; namespace DG.Tools.XrmMockup @@ -33,22 +34,32 @@ internal override OrganizationResponse Execute(OrganizationRequest orgRequest, E var email = request.Target; email["regardingobjectid"] = new EntityReference(request.RegardingType, request.RegardingId); - // Best-effort template merge: when the 'template' entity is present in metadata - // and the record exists, use its subject/body for fields the caller did not - // supply on the Target email. Token substitution (e.g. {!contact.firstname;}) - // is not modelled - the template content is copied verbatim. Guarding on - // metadata keeps this safe in environments where 'template' was not generated - // (looking up an entity with no metadata throws). + // Merge the template content into the e-mail, mirroring Dataverse: the template's + // subject/body are XSLT stylesheets rendered against the regarding record and the + // sending user. This is guarded on metadata because looking up an entity that was + // not generated throws - in that case the caller-supplied subject/body are used. if (metadata.EntityMetadata.ContainsKey("template")) { var template = db.GetEntityOrNull(new EntityReference("template", request.TemplateId)); if (template != null) { - if (!email.Contains("subject") && template.Contains("subject")) - email["subject"] = template.GetAttributeValue("subject"); + var entities = new Dictionary(); - if (!email.Contains("description") && template.Contains("body")) - email["description"] = template.GetAttributeValue("body"); + var regarding = db.GetEntityOrNull(new EntityReference(request.RegardingType, request.RegardingId)); + if (regarding != null) + entities[request.RegardingType] = regarding; + + var sender = db.GetEntityOrNull(userRef); + if (sender != null) + entities[sender.LogicalName] = sender; + + var subject = EmailTemplateRenderer.Render(template.GetAttributeValue("subject"), entities); + if (!string.IsNullOrEmpty(subject)) + email["subject"] = subject; + + var body = EmailTemplateRenderer.Render(template.GetAttributeValue("body"), entities); + if (!string.IsNullOrEmpty(body)) + email["description"] = body; } } diff --git a/tests/XrmMockup365Test/Metadata/TemplateMetadata.xml b/tests/XrmMockup365Test/Metadata/TemplateMetadata.xml new file mode 100644 index 00000000..cf1f796d --- /dev/null +++ b/tests/XrmMockup365Test/Metadata/TemplateMetadata.xml @@ -0,0 +1 @@ +templateb71c0a4c-b9b6-4e12-a02e-94feba67eade079fce9cd-25b4-4d41-bf22-85670d2f70f2Memofalsefalsefalsefalsecanmodifyadditionalsettingsfalse91900-01-01T00:00:001764cfee-2241-db11-898a-0007e9e17ebdtrueBody text of the email template.10331764cfee-2241-db11-898a-0007e9e17ebdtrueBody text of the email template.10331664cfee-2241-db11-898a-0007e9e17ebdtrueBody10331664cfee-2241-db11-898a-0007e9e17ebdtrueBody1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetruebody1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneBodyMemoType5.0.0.0falseTextAreaAuto1073741823TextAreafalseeb40fb38-f56c-43a2-9e4f-08fc4ae1374cPicklistfalsefalsefalsefalsecanmodifyadditionalsettingsfalse381900-01-01T00:00:004bc15966-4061-4f84-96a5-5323a385d5b2trueFor internal use only.10334bc15966-4061-4f84-96a5-5323a385d5b2trueFor internal use only.103391a2c350-e738-484c-90df-13d406b28602trueComponent State103391a2c350-e738-484c-90df-13d406b28602trueComponent State1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetruecomponentstate1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredComponentStatePicklistType5.0.0.0false0-1faece09f-cefc-11de-8150-00155da18b00faece0a1-cefc-11de-8150-00155da18b00trueThe state of this component.1033faece0a1-cefc-11de-8150-00155da18b00trueThe state of this component.1033faece0a0-cefc-11de-8150-00155da18b00trueComponent State1033faece0a0-cefc-11de-8150-00155da18b00trueComponent State1033falsefalseiscustomizablefalsetruetruecomponentstatePicklist5.0.0.0falsetruefaece0a3-cefc-11de-8150-00155da18b00truePublished1033faece0a3-cefc-11de-8150-00155da18b00truePublished10330falsetruefaece0a5-cefc-11de-8150-00155da18b00trueUnpublished1033faece0a5-cefc-11de-8150-00155da18b00trueUnpublished10331falsetruefaece0a7-cefc-11de-8150-00155da18b00trueDeleted1033faece0a7-cefc-11de-8150-00155da18b00trueDeleted10332falsetrue1f83e0bb-cefd-11de-8150-00155da18b00trueDeleted Unpublished10331f83e0bb-cefd-11de-8150-00155da18b00trueDeleted Unpublished103330306d7cb9-fcd9-4d42-a400-2aa73bdea381Lookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse131900-01-01T00:00:00fae9af0c-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the user who created the email template.1033fae9af0c-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the user who created the email template.1033f9e9af0c-2341-db11-898a-0007e9e17ebdtrueCreated By1033f9e9af0c-2341-db11-898a-0007e9e17ebdtrueCreated By1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruecreatedby1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneCreatedByLookupType5.0.0.0falseNonesystemuserd081bb4a-b92f-4790-9a1a-ef359a53b12bcreatedbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse201900-01-01T00:00:00641d9b1e-2341-db11-898a-0007e9e17ebdtrueName of the user who created the email template.1033641d9b1e-2341-db11-898a-0007e9e17ebdtrueName of the user who created the email template.1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsecreatedbyname2026-05-15T07:09:51.84falsecanmodifyrequirementlevelsettingsNoneCreatedByNameStringType5.0.0.0true0TextAuto100Textfalse0320cdc10493-8106-4e96-943e-63732f539bc6createdbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse351900-01-01T00:00:00844f7b37-2341-db11-898a-0007e9e17ebdtrueYomiName of the user who created the email template.1033844f7b37-2341-db11-898a-0007e9e17ebdtrueYomiName of the user who created the email template.1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsecreatedbyyominame2026-05-15T07:09:54.5900032falsecanmodifyrequirementlevelsettingsNoneCreatedByYomiNameStringType5.0.0.0true0TextAuto100createdbynameTextfalse032052ae0715-5eb5-4f2d-a168-2c5662d7db58DateTimefalsefalsefalsefalsecanmodifyadditionalsettingsfalse151900-01-01T00:00:00e026e7d6-2241-db11-898a-0007e9e17ebdtrueDate and time when the email template was created.1033e026e7d6-2241-db11-898a-0007e9e17ebdtrueDate and time when the email template was created.1033df26e7d6-2241-db11-898a-0007e9e17ebdtrueCreated On1033df26e7d6-2241-db11-898a-0007e9e17ebdtrueCreated On1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruecreatedon1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneCreatedOnDateTimeType5.0.0.0false0DateAndTimeInactive0falsecanmodifybehaviorfalseUserLocal5a0a7aed-dfa0-44bb-98a9-137892bd4b64Lookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse421900-01-01T00:00:00e5054e1c-47a1-49c9-ace2-f8fb0fd46082trueUnique identifier of the delegate user who created the template.1033e5054e1c-47a1-49c9-ace2-f8fb0fd46082trueUnique identifier of the delegate user who created the template.10339eb18cf1-f226-420c-b1aa-de8699755ad7trueCreated By (Delegate)10339eb18cf1-f226-420c-b1aa-de8699755ad7trueCreated By (Delegate)1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruecreatedonbehalfby1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneCreatedOnBehalfByLookupType5.0.0.0falseNonesystemuser0b21e731-bd3f-4b46-b06a-6a89451eb724createdonbehalfbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse441900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsecreatedonbehalfbyname2026-05-15T07:09:52.6200064falsecanmodifyrequirementlevelsettingsNoneCreatedOnBehalfByNameStringType5.0.0.0true0TextAuto100Textfalse0320013aa3f5-81ae-4be8-82b0-e0ec18bded64createdonbehalfbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse451900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsecreatedonbehalfbyyominame2026-05-15T07:09:54.5430016falsecanmodifyrequirementlevelsettingsNoneCreatedOnBehalfByYomiNameStringType5.0.0.0true0TextAuto100createdonbehalfbynameTextfalse0320db3dce49-6363-4130-9617-4eaec35cf968Memofalsefalsefalsefalsecanmodifyadditionalsettingsfalse111900-01-01T00:00:00f51dd7e8-2241-db11-898a-0007e9e17ebdtrueDescription of the email template.1033f51dd7e8-2241-db11-898a-0007e9e17ebdtrueDescription of the email template.1033f41dd7e8-2241-db11-898a-0007e9e17ebdtrueDescription1033f41dd7e8-2241-db11-898a-0007e9e17ebdtrueDescription1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsefalsetruetruetruedescription1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneDescriptionMemoType5.0.0.0falseTextAuto2000Textfalseaecaf2b0-2d87-475a-b79f-780180a641a9entityimageidVirtualfalsefalsefalsetruecanmodifyadditionalsettingsfalse100062026-05-15T11:47:35.02300169672d2e2-f6cd-4c69-95eb-59a7f6e4e545falseShows the default image for the record.10339672d2e2-f6cd-4c69-95eb-59a7f6e4e545falseShows the default image for the record.103329278ef8-c857-4d1a-bdd3-6aa424f3b46afalseDefault Image103329278ef8-c857-4d1a-bdd3-6aa424f3b46afalseDefault Image1033templatetruecanmodifyauditsettingsfalsefalsetrueiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsefalsefalsefalsetrueisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetrueentityimage2026-05-15T11:47:35.0230016falsecanmodifyrequirementlevelsettingsNoneEntityImageImageType6.0.0.0truefalsetrue144102401440cf9348a-810c-4dda-8e8e-dd6370b7cc55entityimageidBigIntfalsefalsefalsefalsecanmodifyadditionalsettingsfalse100052026-05-15T11:47:35.0070016templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueentityimage_timestamp2026-05-15T11:47:35.0070016falsecanmodifyrequirementlevelsettingsNoneEntityImage_TimestampBigIntType6.0.0.0true9223372036854775807-922337203685477580873432d91-0418-4e0f-b5b6-1d6eb0902f7centityimageidStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse100042026-05-15T11:47:34.9769984templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueentityimage_url2026-05-15T11:47:34.9769984falsecanmodifyrequirementlevelsettingsNoneEntityImage_URLStringType6.0.0.0true0UrlDisabled200Urlfalse0400ff9785d6-38f2-44e6-879c-268e576307c7Uniqueidentifierfalsefalsefalsefalsecanmodifyadditionalsettingsfalse100032026-05-15T11:47:34.96templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueentityimageid2026-05-15T11:47:34.96falsecanmodifyrequirementlevelsettingsNoneEntityImageIdUniqueidentifierType6.0.0.0false66579e47-a3d5-46ff-837a-42eb6ada5a93Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse311900-01-01T00:00:00b051c19b-998c-4a98-a376-68ed18cd3cd2trueFor internal use only.1033b051c19b-998c-4a98-a376-68ed18cd3cd2trueFor internal use only.1033e64bf18c-0efa-4699-84fb-0fc5b604b5b9trueGeneration Type Code1033e64bf18c-0efa-4699-84fb-0fc5b604b5b9trueGeneration Type Code1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruefalsetruegenerationtypecode1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneGenerationTypeCodeIntegerType5.0.0.0false0None21474836470018460bd9-edf0-4569-afda-295beb33c54cIntegerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse331900-01-01T00:00:008fcc9305-da95-40e1-b2c7-bee1c744f5e9trueUnique identifier of the data import or data migration that created this record.10338fcc9305-da95-40e1-b2c7-bee1c744f5e9trueUnique identifier of the data import or data migration that created this record.10332a4e2f19-926c-4fa9-9c54-5a88b05d8fcftrueImport Sequence Number10332a4e2f19-926c-4fa9-9c54-5a88b05d8fcftrueImport Sequence Number1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsefalsetruefalsetrueimportsequencenumber1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneImportSequenceNumberIntegerType5.0.0.0false0None2147483647-214748364802edff88a-365e-4356-b2e8-43f357726d8cStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse541900-01-01T00:00:00309a3bef-56fb-439a-89d8-629e356a1ce7trueVersion in which the form is introduced.1033309a3bef-56fb-439a-89d8-629e356a1ce7trueVersion in which the form is introduced.10338f611973-b29a-4e31-92a2-11c7490d3b17trueIntroduced Version10338f611973-b29a-4e31-92a2-11c7490d3b17trueIntroduced Version1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruefalsetrueintroducedversion1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneIntroducedVersionStringType6.0.0.0false0VersionNumberAuto48VersionNumberfalse096370865d2-b62f-4154-a5a1-4e0d6c8f7ff8ManagedPropertyfalsefalsefalsefalsecanmodifyadditionalsettingsfalse521900-01-01T00:00:004c46c780-c44a-4fbe-852e-74b361f7ecd7trueInformation that specifies whether this component can be customized.10334c46c780-c44a-4fbe-852e-74b361f7ecd7trueInformation that specifies whether this component can be customized.1033bc14ca4b-8d45-44a7-8c7d-5e11d10d8fb3trueCustomizable1033bc14ca4b-8d45-44a7-8c7d-5e11d10d8fb3trueCustomizable1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetrueiscustomizable1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredIsCustomizableManagedPropertyType5.0.0.0falseiscustomizableanddeletable0Boolean9388702d-5f84-4cd5-8f00-b399429a15f7Booleanfalsefalsefalsefalsecanmodifyadditionalsettingsfalse511900-01-01T00:00:003cd2b49b-1704-4d71-8da2-4d3620ca3250trueIndicates whether the solution component is part of a managed solution.10333cd2b49b-1704-4d71-8da2-4d3620ca3250trueIndicates whether the solution component is part of a managed solution.10332a19ef4d-5a11-4749-9386-8f281126a77dtrueIs Managed10332a19ef4d-5a11-4749-9386-8f281126a77dtrueIs Managed1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueismanaged1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredIsManagedBooleanType5.0.0.0false0false9d04e035-5408-4c1d-a5aa-20445a02f691b41954a2-f3a5-47e9-ae13-ceb49de4465btrueInformation about whether the current component is managed.1033b41954a2-f3a5-47e9-ae13-ceb49de4465btrueInformation about whether the current component is managed.103345a188b1-91a8-4019-b582-cebda8081064trueIs Component Managed103345a188b1-91a8-4019-b582-cebda8081064trueIs Component Managed1033falsefalseiscustomizablefalsetruetrueismanagedBoolean5.0.0.0falsetrue443c7078-b7cb-47e7-8547-08dfa82950d0trueUnmanaged1033443c7078-b7cb-47e7-8547-08dfa82950d0trueUnmanaged10330falsetrueec886b5b-7e97-4c62-b30c-bf295639d540trueManaged1033ec886b5b-7e97-4c62-b30c-bf295639d540trueManaged1033108748c5d2-3c6f-46e1-bc9b-e422580e9222ismanagedVirtualfalsefalsefalsefalsecanmodifyadditionalsettingsfalse531900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseismanagedname1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneIsManagedNameVirtualType5.0.0.0truebd6cc13d-c4f6-4d08-b344-eff79adce1b7Booleanfalsefalsefalsefalsecanmodifyadditionalsettingsfalse41900-01-01T00:00:00becde1dc-2241-db11-898a-0007e9e17ebdtrueInformation about whether the template is personal or is available to all users.1033becde1dc-2241-db11-898a-0007e9e17ebdtrueInformation about whether the template is personal or is available to all users.1033bdcde1dc-2241-db11-898a-0007e9e17ebdtrueViewable By1033bdcde1dc-2241-db11-898a-0007e9e17ebdtrueViewable By1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsetruetruetruetrueispersonal1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneIsPersonalBooleanType5.0.0.0false0true692312cf-56a6-4e49-b23e-9102ff0f67ca2c800910-9d68-43da-a9be-89be5d0e076ctrueInformation about whether the template is personal or is available to all users.10332c800910-9d68-43da-a9be-89be5d0e076ctrueInformation about whether the template is personal or is available to all users.1033e1f336db-1848-48b0-8f61-7cad82130b34trueViewable By1033e1f336db-1848-48b0-8f61-7cad82130b34trueViewable By1033falsefalseiscustomizabletruefalsetruetemplate_ispersonalBoolean5.0.0.0falsetruec0cde1dc-2241-db11-898a-0007e9e17ebdtrueOrganization1033c0cde1dc-2241-db11-898a-0007e9e17ebdtrueOrganization10330falsetruec2cde1dc-2241-db11-898a-0007e9e17ebdtrueIndividual1033c2cde1dc-2241-db11-898a-0007e9e17ebdtrueIndividual1033100402f0d0-9dba-4af5-9587-9b7804f24285ispersonalVirtualfalsefalsefalsefalsecanmodifyadditionalsettingsfalse281900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseispersonalname1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneIsPersonalNameVirtualType5.0.0.0truece62e4df-044d-4caf-afca-31a42b8eb898Booleanfalsefalsefalsefalsecanmodifyadditionalsettingstrue571900-01-01T00:00:0034af6216-41cf-4336-9a7e-264f8f75f285trueIndicates if a template is recommended by Dynamics 365.103334af6216-41cf-4336-9a7e-264f8f75f285trueIndicates if a template is recommended by Dynamics 365.103375fcdf03-cc45-4f96-85ca-5f5c06745165trueRecommended103375fcdf03-cc45-4f96-85ca-5f5c06745165trueRecommended1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsetruecanmodifysearchsettingstruefalsetruetruetruefalsetrueisrecommended1900-01-01T00:00:00truecanmodifyrequirementlevelsettingsNoneIsRecommendedBooleanType8.2.0.0false0false566c3f11-fd9e-4fe5-8535-f81d07cb0b9ed2ec89bb-142c-4c03-bde1-8640bfa6c185trueShows if this template is recommended or not1033d2ec89bb-142c-4c03-bde1-8640bfa6c185trueShows if this template is recommended or not1033da2d5600-b73b-4bf4-96e3-1cffca697255trueRecommended1033da2d5600-b73b-4bf4-96e3-1cffca697255trueRecommended1033falsefalseiscustomizablefalsefalsetruetemplate_isrecommendedBoolean8.2.0.0falsetrue09409285-2d68-49f1-959c-e2d873f07fdatrueNo103309409285-2d68-49f1-959c-e2d873f07fdatrueNo10330falsetrue1802c1b4-80f4-4408-a536-c08efb4baf0btrueYes10331802c1b4-80f4-4408-a536-c08efb4baf0btrueYes103310bda7101f-2d74-4bab-8201-650cca2e1bc3isrecommendedVirtualfalsefalsefalsefalsecanmodifyadditionalsettingstrue581900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseisrecommendedname1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneIsRecommendedNameVirtualType8.2.0.0trueba5e9a47-c78f-40b4-bc1b-1008326192a6Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse321900-01-01T00:00:00b99b1dc7-8e1e-4e1e-9b30-fc9e89322679trueLanguage of the email template.1033b99b1dc7-8e1e-4e1e-9b30-fc9e89322679trueLanguage of the email template.1033ae90bff0-065c-41f9-bc67-f316d9702a19trueLanguage1033ae90bff0-065c-41f9-bc67-f316d9702a19trueLanguage1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruetruetruetruetruetruelanguagecode1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsApplicationRequiredLanguageCodeIntegerType5.0.0.0false0Language2147483647001e90a39b-bda4-4ad2-b708-74ebcbcae348Stringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse71900-01-01T00:00:006740b506-2341-db11-898a-0007e9e17ebdtrueMIME type of the email template.10336740b506-2341-db11-898a-0007e9e17ebdtrueMIME type of the email template.10336640b506-2341-db11-898a-0007e9e17ebdtrueMime Type10336640b506-2341-db11-898a-0007e9e17ebdtrueMime Type1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetruemimetype1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneMimeTypeStringType5.0.0.0false0TextAuto256Textfalse051253b62ff6-eb39-4c51-bc6c-63cff9bd3bb9Lookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse161900-01-01T00:00:009b64cfee-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the user who last modified the template.10339b64cfee-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the user who last modified the template.10339a64cfee-2241-db11-898a-0007e9e17ebdtrueModified By10339a64cfee-2241-db11-898a-0007e9e17ebdtrueModified By1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruemodifiedby1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneModifiedByLookupType5.0.0.0falseNonesystemuserb58aae8b-25f3-4cf2-b724-1ee3e355949bmodifiedbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse221900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsemodifiedbyname2026-05-15T07:09:53.3699968falsecanmodifyrequirementlevelsettingsNoneModifiedByNameStringType5.0.0.0true0TextAuto100Textfalse0320f4645b25-ef5a-44c9-a347-34c01a8ae477modifiedbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse341900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsemodifiedbyyominame2026-05-15T07:09:54.8530048falsecanmodifyrequirementlevelsettingsNoneModifiedByYomiNameStringType5.0.0.0true0TextAuto100modifiedbynameTextfalse0320a51d5ce5-d73b-49ca-aeef-a0ee4536d2d2DateTimefalsefalsefalsefalsecanmodifyadditionalsettingsfalse171900-01-01T00:00:002640b506-2341-db11-898a-0007e9e17ebdtrueDate and time when the email template was last modified.10332640b506-2341-db11-898a-0007e9e17ebdtrueDate and time when the email template was last modified.10332540b506-2341-db11-898a-0007e9e17ebdtrueModified On10332540b506-2341-db11-898a-0007e9e17ebdtrueModified On1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruemodifiedon1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneModifiedOnDateTimeType5.0.0.0false0DateAndTimeInactive0falsecanmodifybehaviorfalseUserLocal2650518e-c42e-46d7-93ab-e8b2d4d10878Lookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse461900-01-01T00:00:0088b366f8-3717-4822-b29d-db05dd46efbctrueUnique identifier of the delegate user who last modified the template.103388b366f8-3717-4822-b29d-db05dd46efbctrueUnique identifier of the delegate user who last modified the template.10334a8a8e56-dbbd-4d19-88f0-eacd62cf24cetrueModified By (Delegate)10334a8a8e56-dbbd-4d19-88f0-eacd62cf24cetrueModified By (Delegate)1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruemodifiedonbehalfby1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneModifiedOnBehalfByLookupType5.0.0.0falseNonesystemuser5edeb9b9-5fa4-40d7-bcb6-840485702594modifiedonbehalfbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse481900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsemodifiedonbehalfbyname2026-05-15T07:09:52.7129984falsecanmodifyrequirementlevelsettingsNoneModifiedOnBehalfByNameStringType5.0.0.0true0TextAuto100Textfalse0320fd623a4d-004c-4b78-82ea-a82aadb2aa65modifiedonbehalfbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse491900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsemodifiedonbehalfbyyominame2026-05-15T07:09:54.7430016falsecanmodifyrequirementlevelsettingsNoneModifiedOnBehalfByYomiNameStringType5.0.0.0true0TextAuto100modifiedonbehalfbynameTextfalse032056b0f9b5-1482-46d8-9a80-72d55b7742e8Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse551900-01-01T00:00:0092b43f6b-b037-4db6-8157-02b6418be326trueFor internal use only. Shows the number of times emails that use this template have been opened.103392b43f6b-b037-4db6-8157-02b6418be326trueFor internal use only. Shows the number of times emails that use this template have been opened.1033ecb78564-c1e7-408e-be5b-a0b85703f13etrueOpen Count1033ecb78564-c1e7-408e-be5b-a0b85703f13etrueOpen Count1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetrueopencount1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneOpenCountIntegerType8.2.0.0false0None214748364700ea7970f2-1ac9-484a-b4d4-dced0a298f80Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse591900-01-01T00:00:00445517b3-d409-4788-9ed5-60af9d105428trueShows the open rate of this template. This is based on number of opens on followed emails that use this template.1033445517b3-d409-4788-9ed5-60af9d105428trueShows the open rate of this template. This is based on number of opens on followed emails that use this template.103386347fa3-64ac-4629-945e-88bce8f6070ctrueOpen Rate103386347fa3-64ac-4629-945e-88bce8f6070ctrueOpen Rate1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsetruetruetruefalsetrueopenrate1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneOpenRateIntegerType8.2.0.0false0None2147483647003fe1ef40-198d-4f89-81e4-c12aa4ea0720DateTimefalsefalsefalsefalsecanmodifyadditionalsettingsfalse371900-01-01T00:00:007b59ff51-01c5-42cf-949c-6a41d36f4fadtrueFor internal use only.10337b59ff51-01c5-42cf-949c-6a41d36f4fadtrueFor internal use only.1033cf4c1a13-ad1d-4c46-8b38-592926acebf8trueRecord Overwrite Time1033cf4c1a13-ad1d-4c46-8b38-592926acebf8trueRecord Overwrite Time1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueoverwritetime1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredOverwriteTimeDateTimeType5.0.0.0false0DateOnlyInactive0falsecanmodifybehaviorfalseUserLocal7aa12efe-ad5b-46dd-b155-750a5095564fOwnerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse241900-01-01T00:00:004ed8dee2-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the user or team who owns the template for the email activity.10334ed8dee2-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the user or team who owns the template for the email activity.10334dd8dee2-2241-db11-898a-0007e9e17ebdtrueOwner10334dd8dee2-2241-db11-898a-0007e9e17ebdtrueOwner1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsetruetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsetruetruetruetrueownerid1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredOwnerIdOwnerType5.0.0.0falseNonesystemuserteamd9a30cad-6c8b-4dad-89f6-82ba310879a0owneridStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse251900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseowneridname1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredOwnerIdNameStringType5.0.0.0true0TextAuto100Textfalse03201a7a02c6-64df-4cbd-88b3-9059ca3c65d1owneridEntityNamefalsefalsefalsefalsecanmodifyadditionalsettingsfalse271900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruefalseowneridtype1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredOwnerIdTypeEntityNameType5.0.0.0falsetrue6e55575d-5e3d-4908-9270-cda6d57332d3owneridStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse361900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseowneridyominame1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredOwnerIdYomiNameStringType5.0.0.0true0TextAuto100owneridnameTextfalse03204f946828-9978-4ea4-a37f-46db1aaa772bLookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse31900-01-01T00:00:00f9e8af0c-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the business unit that owns the template.1033f9e8af0c-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the business unit that owns the template.1033f8e8af0c-2341-db11-898a-0007e9e17ebdtrueOwning Business Unit1033f8e8af0c-2341-db11-898a-0007e9e17ebdtrueOwning Business Unit1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsetruetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsetruetruetruefalsetrueowningbusinessunit1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneOwningBusinessUnitLookupType5.0.0.0falseNonebusinessunit21ba76d9-58e4-4451-a17f-e808155eb9f4owningbusinessunitStringfalsefalsefalsetruecanmodifyadditionalsettingstrue100002026-05-15T07:22:29.5469952templatetruecanmodifyauditsettingstruefalsetrueiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsefalsefalsefalsetrueisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsetruecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseowningbusinessunitname2026-05-15T07:22:29.5469952truecanmodifyrequirementlevelsettingsNoneOwningBusinessUnitNameStringType5.0.0.0true0TextAuto160Textfalse03203c708216-9ffd-480b-a84b-78d6cd56a583Lookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse501900-01-01T00:00:004f1d9b1e-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the team who owns the template.10334f1d9b1e-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the team who owns the template.1033364cfbe8-ba39-43f1-9ea0-1fd0d8fe543atrueOwning Team1033364cfbe8-ba39-43f1-9ea0-1fd0d8fe543atrueOwning Team1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueowningteam1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneOwningTeamLookupType5.0.0.0trueNoneteamc8a1139a-b6d6-4f50-a136-d9fc8b0e460aLookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse121900-01-01T00:00:00421d9b1e-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the user who owns the template.1033421d9b1e-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the user who owns the template.1033808bb9e1-4dcb-4652-a9b5-f4682127f409trueOwning User1033808bb9e1-4dcb-4652-a9b5-f4682127f409trueOwning User1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueowninguser1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneOwningUserLookupType5.0.0.0trueNonesystemuser281a44a6-e592-46e2-b88e-a51aa9fde9f6Memofalsefalsefalsefalsecanmodifyadditionalsettingsfalse141900-01-01T00:00:0008e8af0c-2341-db11-898a-0007e9e17ebdtrueXML data for the body of the email template.103308e8af0c-2341-db11-898a-0007e9e17ebdtrueXML data for the body of the email template.103307e8af0c-2341-db11-898a-0007e9e17ebdtruePresentation XML103307e8af0c-2341-db11-898a-0007e9e17ebdtruePresentation XML1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetruepresentationxml1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNonePresentationXmlMemoType5.0.0.0falseTextAreaAuto1073741823TextAreafalse6db9efc5-ca95-478e-af0a-c7f181917fe8Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse561900-01-01T00:00:002d6ad07a-1069-494b-b35b-8078bda15c1dtrueFor internal use only. Shows the number of times emails that use this template have received replies.10332d6ad07a-1069-494b-b35b-8078bda15c1dtrueFor internal use only. Shows the number of times emails that use this template have received replies.103367fa504d-a9b8-4019-8ca7-b7f09e0010c4trueReply Count103367fa504d-a9b8-4019-8ca7-b7f09e0010c4trueReply Count1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruereplycount1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneReplyCountIntegerType8.2.0.0false0None2147483647008ea17bab-e6b9-40a0-821b-3c163c8404c1Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse601900-01-01T00:00:001e62ae6e-4c6d-44e8-baf1-74cafbccac77trueShows the reply rate for this template. This is based on number of replies received on followed emails that use this template.10331e62ae6e-4c6d-44e8-baf1-74cafbccac77trueShows the reply rate for this template. This is based on number of replies received on followed emails that use this template.1033381d62de-55a0-4da0-89b9-983ce4e03bectrueReply Rate1033381d62de-55a0-4da0-89b9-983ce4e03bectrueReply Rate1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruereplyrate1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneReplyRateIntegerType8.2.0.0false0None21474836470096523be8-ae07-43d0-96bd-e5616956e0aeMemofalsefalsefalsefalsecanmodifyadditionalsettingsfalse100012026-05-15T11:47:34.33300483e257413-2dfa-40af-8948-c11223b561a1trueSafe html of email template.10333e257413-2dfa-40af-8948-c11223b561a1trueSafe html of email template.103343de2f2a-81ae-4d36-bc25-4c3141f35f05trueSafe HTML of email template103343de2f2a-81ae-4d36-bc25-4c3141f35f05trueSafe HTML of email template1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruetruefalsetruetruetruesafehtml2026-05-15T11:47:34.3330048falsecanmodifyrequirementlevelsettingsNoneSafeHtmlMemoType9.0.0.0falseTextAreaAuto1073741823TextAreafalsedfe5b70f-2c12-46ff-9f54-4439b3c04494Uniqueidentifierfalsefalsefalsefalsecanmodifyadditionalsettingsfalse391900-01-01T00:00:00e493d368-c2bd-49b4-a770-821ec99623bftrueUnique identifier of the associated solution.1033e493d368-c2bd-49b4-a770-821ec99623bftrueUnique identifier of the associated solution.103386c4c5ca-344c-43d5-b0ae-2a886f0e4ba4trueSolution103386c4c5ca-344c-43d5-b0ae-2a886f0e4ba4trueSolution1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetruesolutionid1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredSolutionIdUniqueidentifierType5.0.0.0falsefd357f5c-54c2-4f64-92b2-c1729dd97fdfMemofalsefalsefalsefalsecanmodifyadditionalsettingsfalse21900-01-01T00:00:00d4cde1dc-2241-db11-898a-0007e9e17ebdtrueSubject associated with the email template.1033d4cde1dc-2241-db11-898a-0007e9e17ebdtrueSubject associated with the email template.1033d3cde1dc-2241-db11-898a-0007e9e17ebdtrueSubject1033d3cde1dc-2241-db11-898a-0007e9e17ebdtrueSubject1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetruesubject2026-05-15T11:47:34.8329984falsecanmodifyrequirementlevelsettingsApplicationRequiredSubjectMemoType5.0.0.0falseTextAuto5000Textfalsedb69d772-8a60-4718-89f6-32190d1919dfMemofalsefalsefalsefalsecanmodifyadditionalsettingsfalse301900-01-01T00:00:008454c2fa-2241-db11-898a-0007e9e17ebdtrueXML data for the subject of the email template.10338454c2fa-2241-db11-898a-0007e9e17ebdtrueXML data for the subject of the email template.10338354c2fa-2241-db11-898a-0007e9e17ebdtrueSubject XML10338354c2fa-2241-db11-898a-0007e9e17ebdtrueSubject XML1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetruesubjectpresentationxml1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneSubjectPresentationXmlMemoType5.0.0.0falseTextAreaAuto1073741823TextAreafalsefbb526b1-60dc-4a81-93f0-0f528072c81dMemofalsefalsefalsefalsecanmodifyadditionalsettingsfalse100022026-05-15T11:47:34.3670016446c2253-8898-41c9-a66b-db8c7400a341trueSafe html of email template subject.1033446c2253-8898-41c9-a66b-db8c7400a341trueSafe html of email template subject.10332b4656e2-e1fa-4a54-be9c-5b1f69ed8e0ftrueSafe HTML of email template subject10332b4656e2-e1fa-4a54-be9c-5b1f69ed8e0ftrueSafe HTML of email template subject1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruetruefalsetruetruetruesubjectsafehtml2026-05-15T11:47:34.3670016falsecanmodifyrequirementlevelsettingsNoneSubjectSafeHtmlMemoType9.0.0.0falseTextAreaAuto1073741823TextAreafalseaa6fc6fa-e20a-4ba5-99aa-4eefcd922598Uniqueidentifierfalsefalsefalsefalsecanmodifyadditionalsettingsfalse401900-01-01T00:00:0067307349-acbd-4112-968f-b10e4aa08774trueFor internal use only.103367307349-acbd-4112-968f-b10e4aa08774trueFor internal use only.1033b4549769-e02d-489e-8ed9-6423165d0125trueSolution1033b4549769-e02d-489e-8ed9-6423165d0125trueSolution1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsefalsefalsefalsesupportingsolutionid1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneSupportingSolutionIdUniqueidentifierType5.0.0.0falsecf2042c2-fd1f-4932-9569-b18411a11cacUniqueidentifierfalsefalsefalsefalsecanmodifyadditionalsettingsfalse11900-01-01T00:00:000853c2fa-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the template.10330853c2fa-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the template.10330753c2fa-2241-db11-898a-0007e9e17ebdtrueEmail Template10330753c2fa-2241-db11-898a-0007e9e17ebdtrueEmail Template1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsetruetruecanmodifyglobalfiltersettingsfalsetruetruefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsefalsetruefalsetruetemplateid1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredTemplateIdUniqueidentifierType5.0.0.0false16355f79-7183-4f85-a905-d60e25b6cd5dUniqueidentifierfalsefalsefalsefalsecanmodifyadditionalsettingsfalse411900-01-01T00:00:00af5cf60d-207a-4bcd-855b-488a84a47615trueFor internal use only.1033af5cf60d-207a-4bcd-855b-488a84a47615trueFor internal use only.1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetruetemplateidunique1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredTemplateIdUniqueUniqueidentifierType5.0.0.0falsecd1d90b9-e1b8-49c8-b8f4-106ccdd88051EntityNamefalsefalsefalsefalsecanmodifyadditionalsettingsfalse81900-01-01T00:00:000754c2fa-2241-db11-898a-0007e9e17ebdtrueType of email template.10330754c2fa-2241-db11-898a-0007e9e17ebdtrueType of email template.10330654c2fa-2241-db11-898a-0007e9e17ebdtrueTemplate Type10330654c2fa-2241-db11-898a-0007e9e17ebdtrueTemplate Type1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsetruetruetruetruetemplatetypecode2026-05-15T11:47:34.4130048falsecanmodifyrequirementlevelsettingsSystemRequiredTemplateTypeCodeEntityNameType5.0.0.0false-12be068b7-04d3-45bf-b24b-f268fd56156d40d4c6e3-d814-46dd-b0de-89540069b604trueType of email template.103340d4c6e3-d814-46dd-b0de-89540069b604trueType of email template.10334439956c-fe1e-449e-8991-c14e012b4ca4trueTemplate Type10334439956c-fe1e-449e-8991-c14e012b4ca4trueTemplate Type1033falsefalseiscustomizabletruefalsetruetemplate_templatetypecodePicklist5.0.0.0falsetrue0f54c2fa-2241-db11-898a-0007e9e17ebdtrueAccount10330f54c2fa-2241-db11-898a-0007e9e17ebdtrueAccount1033account1falsetrue1154c2fa-2241-db11-898a-0007e9e17ebdtrueContact10331154c2fa-2241-db11-898a-0007e9e17ebdtrueContact1033contact2falsetrue2154c2fa-2241-db11-898a-0007e9e17ebdtrueSystem Job10332154c2fa-2241-db11-898a-0007e9e17ebdtrueSystem Job1033asyncoperation4700falsetrue0954c2fa-2241-db11-898a-0007e9e17ebdtrueUser10330954c2fa-2241-db11-898a-0007e9e17ebdtrueUser1033systemuser8true8daa3583-0741-40a1-ad16-15bcbe82db77templatetypecodeVirtualfalsefalsefalsefalsecanmodifyadditionalsettingsfalse291900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsetemplatetypecodename1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneTemplateTypeCodeNameVirtualType5.0.0.0truebac1c51a-8e29-45a3-8cea-e81c2368872fStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse101900-01-01T00:00:00e8d7a218-2341-db11-898a-0007e9e17ebdtrueTitle of the template.1033e8d7a218-2341-db11-898a-0007e9e17ebdtrueTitle of the template.1033e7d7a218-2341-db11-898a-0007e9e17ebdtrueTitle1033e7d7a218-2341-db11-898a-0007e9e17ebdtrueTitle1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsetruefalseisrenameablefalsefalsetruetruefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsetruetruetruetruetitle1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsApplicationRequiredTitleStringType5.0.0.0false0TextAuto200Textfalse04000787149a-40b4-45e9-ac33-cc59923cf027Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse611900-01-01T00:00:0024d31f47-0d64-43dd-aa24-663d381ba775trueShows the number of sent emails that use this template.103324d31f47-0d64-43dd-aa24-663d381ba775trueShows the number of sent emails that use this template.1033b5b5aa19-6c36-4cd1-acad-383cc1923c9etrueSent email count1033b5b5aa19-6c36-4cd1-acad-383cc1923c9etrueSent email count1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetrueusedcount1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneUsedCountIntegerType8.2.0.0false0None2147483647000b00c500-0d91-4edf-a9a4-3817d43d86c5BigIntfalsefalsefalsefalsecanmodifyadditionalsettingsfalse181900-01-01T00:00:007996c2d8-ca66-441b-9583-42de92544e40trueVersion number of the template.10337996c2d8-ca66-441b-9583-42de92544e40trueVersion number of the template.1033eef1b083-63ef-4ae9-8850-ae64b729baeetrueVersion Number1033eef1b083-63ef-4ae9-8850-ae64b729baeetrueVersion Number1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueversionnumber1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneVersionNumberBigIntType5.0.0.0false9223372036854775807-9223372036854775808falsefalsefalsefalsecanbeincustomentityassociationfalsefalsecanbeinmanytomanyfalsefalsecanbeprimaryentityinrelationshipfalsefalsecanberelatedentityinrelationshipfalsetruetruecanchangetrackingbeenabledtruefalsecancreateattributesfalsefalsecancreatechartsfalsefalsecancreateformsfalsefalsecancreateviewstruefalsecanenablesynctoexternalsearchindexfalsetruecanmodifyadditionalsettingstruetruefalseLocal1900-01-01T00:00:00false0ddd01b9-2241-db11-898a-0007e9e17ebdtrueTemplate for an email message that contains the standard attributes of an email message.10330ddd01b9-2241-db11-898a-0007e9e17ebdtrueTemplate for an email message that contains the standard attributes of an email message.10330fdd01b9-2241-db11-898a-0007e9e17ebdtrueEmail Templates10330fdd01b9-2241-db11-898a-0007e9e17ebdtrueEmail Templates10330edd01b9-2241-db11-898a-0007e9e17ebdtrueEmail Template10330edd01b9-2241-db11-898a-0007e9e17ebdtrueEmail Template1033falsefalsefalsefalsefalsefalsefalsefalsefalsetruecanmodifyauditsettingsfalsetruefalsefalsefalsecanmodifyconnectionsettingsfalsefalsefalseiscustomizabletruefalsefalsefalsecanmodifyduplicatedetectionsettingsfalsefalsefalsefalsefalsefalsefalsefalsefalsecanmodifymailmergesettingsfalsetruefalseismappablefalsefalsefalsefalsecanmodifymobileclientreadonlyfalsetruefalseisrenameabletruefalsefalsefalsetruefalsetruefalsecanmodifyqueuesettingsfalsefalsecanmodifymobilevisibilityfalsefalsecanmodifymobileclientvisibilitytruetemplate975c286e-54a5-430d-b05d-e2ed66804dfffalsefalseiscustomizablefalsetruetruesystem_user_email_templatesNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsesystemuseridsystemusersystem_user_email_templatesowningusertemplateowninguser072f8fb8b-5f25-4854-86eb-5100b27c4e26falsefalseiscustomizablefalsetruetruelk_templatebase_modifiedbyNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsesystemuseridsystemuserlk_templatebase_modifiedbymodifiedbytemplatemodifiedby0b6928293-c433-4da5-8f25-208338bcaac4falsefalseiscustomizablefalsetruetruelk_templatebase_createdbyNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsesystemuseridsystemuserlk_templatebase_createdbycreatedbytemplatecreatedby05a19faa3-db82-4f65-8511-c0cf68e351bafalsefalseiscustomizablefalsetruefalseowner_templatesNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeRestrictNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalseowneridownerowner_templatesowneridtemplateownerid0c25f5eaf-8f92-4ec9-8ed1-65f310fffdc2falsefalseiscustomizablefalsetruetruelk_templatebase_createdonbehalfbyNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsesystemuseridsystemuserlk_templatebase_createdonbehalfbycreatedonbehalfbytemplatecreatedonbehalfby0347d35b2-b0ff-45d0-a4f8-6e0687ee5b40falsefalseiscustomizablefalsetruetrueteam_email_templatesNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalseteamidteamteam_email_templatesowningteamtemplateowningteam066715cda-65c4-4c44-95f4-e68ecb284369falsefalseiscustomizablefalsetruetruelk_templatebase_modifiedonbehalfbyNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsesystemuseridsystemuserlk_templatebase_modifiedonbehalfbymodifiedonbehalfbytemplatemodifiedonbehalfby00eb5a9db-5350-f111-bec6-e4fb1ef8f465falsefalseiscustomizablefalsetruefalseImageDescriptor_TemplateNone6.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalseimagedescriptoridimagedescriptorImageDescriptor_Templateentityimageidtemplateentityimageid_imagedescriptor0bccaeff8-a650-4a59-9b5a-3ec33438b3cefalsefalseiscustomizablefalsetruefalsebusiness_unit_templatesNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsebusinessunitidbusinessunitbusiness_unit_templatesowningbusinessunittemplateowningbusinessunit02026-05-15T16:03:49.2099968201044042f12-485e-4e9a-aaff-588f692f186efalsefalseiscustomizablefalsetruetrueTemplate_AsyncOperationsNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateTemplate_AsyncOperationsregardingobjectidasyncoperationregardingobjectid_template010958037-4bc9-4153-85a7-8d3bdb661f6ffalsefalseiscustomizablefalsetruetrueTemplate_ProcessSessionsNone5.0.0.0OneToManyRelationshipUseCollectionNameDetails110truefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateTemplate_ProcessSessionsregardingobjectidprocesssessionregardingobjectid_template0a9835154-a72e-47f2-b9f9-d929fb0a00a0falsefalseiscustomizabletruetruetrueTemplate_SyncErrorsAppend8.1.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeCascadeCascadeCascadeCascadeCascadeCascadeNoCascadefalsefalsetemplateidtemplateTemplate_SyncErrorsregardingobjectidsyncerrorregardingobjectid_template_syncerror1dcda8e64-c0fe-4d2d-8a8a-e32d365fa90dfalsefalseiscustomizablefalsetruefalseTemplate_OrganizationNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeRemoveLinkNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateTemplate_Organizationacknowledgementtemplateidorganizationacknowledgementtemplateid09beff8aa-f008-4a46-8846-59649bbe5460falsefalseiscustomizablefalsetruefalseTemplate_BulkDeleteFailuresNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateTemplate_BulkDeleteFailuresregardingobjectidbulkdeletefailureregardingobjectid_template0760df4d9-e26a-4d72-a1f5-e8da979e61c6falsefalseiscustomizabletruetruetrueEmail_EmailTemplateParentChild8.2.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeRemoveLinkNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateEmail_EmailTemplatetemplateidemailtemplateid28ff49bdd-71a3-470b-a986-043cea152ceafalsefalseiscustomizablefalsetruetrueemailtemplate_convertruleAppend6.1.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeRestrictNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateemailtemplate_convertruleresponsetemplateidconvertruleresponsetemplateid14c37f9e8-f9b4-4c94-a4a1-8690ae249c69falsefalseiscustomizablefalsetruetruetemplate_activity_mime_attachmentsNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplatetemplate_activity_mime_attachmentsobjectidactivitymimeattachmentobjectid_template094b415f9-da73-4fee-b50a-c1035c08799ffalsefalseiscustomizablefalsetruefalseuserentityinstancedata_templateNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateuserentityinstancedata_templateobjectiduserentityinstancedataobjectid_template08UserOwnedtemplateidtitletruetruefalsetruetruefalsefalseprvCreateEmailTemplate921dac3c-3dc0-4f66-83c1-f4e6ea427a45CreatetruetruefalsetruetruefalsefalseprvReadEmailTemplate6c619dca-e165-4baa-ba16-ef6f820a0e01ReadtruetruefalsetruetruefalsefalseprvWriteEmailTemplatef2cc25b1-bfcc-4f7c-a6c3-9a5fc386391aWritetruetruefalsetruetruefalsefalseprvDeleteEmailTemplateffe4299b-7978-4b50-a724-2317db0d3949DeletetruetruefalsetruetruefalsefalseprvAssignEmailTemplate17b31e5e-bc94-4967-b83f-c7049eb483daAssigntruetruefalsetruetruefalsefalseprvShareEmailTemplatedf6a99af-703c-47cb-80c6-74eb519ad453SharetruetruefalsetruetruefalsefalseprvAppendEmailTemplate57444774-b24c-4684-a514-dfcab252c331AppendtruetruefalsetruetruefalsefalseprvAppendToEmailTemplatec7057b81-25b8-4940-9ced-eed842b712a5AppendTofalsefalsefalsetruefalsefalsefalseprvCreateOrgEmailTemplates01750f14-3320-49cc-a7d1-52502cdcd16dNoneFilteredTemplateTemplatefalseStandardfalse5.0.0.0entityimagefalsecanchangehierarchicalrelationshipfalsefalseTemplatestruetemplates0templatesfalsetruecanmodifymobileclientofflinefalsefalsefalsefalsefalse \ No newline at end of file diff --git a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs new file mode 100644 index 00000000..24b576e5 --- /dev/null +++ b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs @@ -0,0 +1,109 @@ +using DG.Tools.XrmMockup; +using Microsoft.Xrm.Sdk; +using System.Collections.Generic; +using Xunit; + +namespace DG.XrmMockupTest +{ + /// + /// Unit tests for the XSLT-based template rendering used by SendEmailFromTemplate. The + /// stylesheets below are the actual subject/body of the built-in "Thank you for registering + /// with us" contact template in Dataverse. + /// + public class TestEmailTemplateRenderer + { + private const string RealSubjectXslt = + "" + + "" + + ""; + + private const string RealBodyXslt = + "" + + "" + + "Dear ]]>" + + "Valued Customer" + + "

Name: ]]>" + + "Street Address: ]]>No Address Provided" + + "E-mail Address: ]]>" + + "]]>"; + + [Fact] + public void RendersStaticSubject() + { + var entities = new Dictionary + { + ["contact"] = new Entity("contact") + }; + + var result = EmailTemplateRenderer.Render(RealSubjectXslt, entities); + + Assert.Equal("Thank you for registering with us", result); + } + + [Fact] + public void RendersBodyWithRegardingAndSenderValues() + { + var contact = new Entity("contact") + { + ["salutation"] = "Mr", + ["lastname"] = "Smith", + ["address1_line1"] = "123 Main St", + ["emailaddress1"] = "smith@test.com" + }; + var user = new Entity("systemuser") + { + ["fullname"] = "Admin User" + }; + + var entities = new Dictionary + { + ["contact"] = contact, + ["systemuser"] = user + }; + + var result = EmailTemplateRenderer.Render(RealBodyXslt, entities); + + // Values are merged from the regarding contact and the sending systemuser. + // (Standard XSLT whitespace-stripping removes whitespace-only stylesheet text + // nodes, so the salutation/lastname render as "MrSmith" rather than "Mr Smith"; + // that conformant nuance is not asserted here.) + Assert.Contains("Dear Mr", result); + Assert.Contains("Smith", result); + Assert.Contains("Name: Admin User", result); + Assert.Contains("Street Address: 123 Main St", result); + Assert.Contains("E-mail Address: smith@test.com", result); + } + + [Fact] + public void UsesXsltDefaultsWhenAttributesMissing() + { + // contact has neither lastname nor address1_line1 -> the defaults apply. + var entities = new Dictionary + { + ["contact"] = new Entity("contact") { ["salutation"] = "Ms" } + }; + + var result = EmailTemplateRenderer.Render(RealBodyXslt, entities); + + Assert.Contains("Dear Ms", result); + Assert.Contains("Valued Customer", result); + Assert.Contains("Street Address: No Address Provided", result); + } + + [Fact] + public void ReturnsPlainTextTemplatesUnchanged() + { + var entities = new Dictionary(); + + var result = EmailTemplateRenderer.Render("Just plain text", entities); + + Assert.Equal("Just plain text", result); + } + + [Fact] + public void ReturnsNullForNullInput() + { + Assert.Null(EmailTemplateRenderer.Render(null, new Dictionary())); + } + } +} diff --git a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs index cfcc0bf3..bde2d7e3 100644 --- a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs +++ b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs @@ -1,6 +1,7 @@ using DG.XrmFramework.BusinessDomain.ServiceContext; using Microsoft.Crm.Sdk.Messages; using Microsoft.Xrm.Sdk; +using Microsoft.Xrm.Sdk.Query; using System; using System.Linq; using System.ServiceModel; @@ -61,6 +62,66 @@ public void TestSendEmailFromTemplateCreatesAndSendsEmail() } } + // The subject/body below are XSLT stylesheets in the same shape Dataverse stores them in. + private const string SubjectXslt = + "" + + "" + + ""; + + private const string BodyXslt = + "" + + "" + + "Dear ]]>Valued Customer" + + "" + + "]]>"; + + [Fact] + public void TestSendEmailFromTemplateRendersTemplateContent() + { + // No early-bound type is generated for the template entity, so it is created late-bound. + var template = new Entity("template") + { + ["title"] = "Registration", + ["templatetypecode"] = "contact", + ["subject"] = SubjectXslt, + ["body"] = BodyXslt, + ["ispersonal"] = false, + ["languagecode"] = 1033 + }; + template.Id = orgAdminService.Create(template); + + var contact = new Contact + { + FirstName = "Test", + LastName = "Smith", + EMailAddress1 = "smith@test.com" + }; + contact.Id = orgAdminUIService.Create(contact); + + var request = new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = template.Id, + RegardingId = contact.Id, + RegardingType = Contact.EntityLogicalName + }; + + var response = orgAdminUIService.Execute(request) as SendEmailFromTemplateResponse; + Assert.NotNull(response); + Assert.NotEqual(Guid.Empty, response.Id); + + var email = orgAdminService + .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("subject", "description", "statecode")) + .ToEntity(); + + // Subject and body were rendered from the template, overriding the caller's subject. + Assert.Equal("Thank you for registering with us", email.Subject); + Assert.Contains("Dear", email.Description); + Assert.Contains("Smith", email.Description); + Assert.Contains("smith@test.com", email.Description); + Assert.Equal(EmailState.Completed, email.StateCode); + } + [Fact] public void TestSendEmailFromTemplateThrowsWhenTemplateIdMissing() { From 6777bfa5f7b52578eb80947aa499928f96cc281c Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Tue, 2 Jun 2026 12:27:49 +0200 Subject: [PATCH 03/14] Add early-bound Template type; verify rendering against live org - Add a generated-style early-bound Template proxy type so template records can be created strongly-typed in tests (XrmContext generates from a fixed reference org that lacks 'template', so this is added by hand following the same pattern). - Use it in the end-to-end SendEmailFromTemplate test. - Strengthen the renderer test to assert the exact "Dear MrSmith" output, verified against a live SendEmailFromTemplate call: real Dataverse strips the whitespace-only stylesheet node identically. - Document the two cosmetic decorations the platform adds that the mock intentionally does not reproduce (HTML body envelope, subject tracking token). --- .../SendEmailFromTemplateRequestHandler.cs | 6 + .../TestPluginAssembly365/Context/Template.cs | 111 ++++++++++++++++++ .../TestEmailTemplateRenderer.cs | 9 +- .../TestSendEmailFromTemplate.cs | 15 ++- 4 files changed, 128 insertions(+), 13 deletions(-) create mode 100644 tests/TestPluginAssembly365/Context/Template.cs diff --git a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs index 611bcaa0..4a195c66 100644 --- a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs +++ b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs @@ -38,6 +38,12 @@ internal override OrganizationResponse Execute(OrganizationRequest orgRequest, E // subject/body are XSLT stylesheets rendered against the regarding record and the // sending user. This is guarded on metadata because looking up an entity that was // not generated throws - in that case the caller-supplied subject/body are used. + // + // Verified against a live org: the merged values (and XSLT whitespace handling) match + // the platform. Two cosmetic decorations the platform adds are intentionally NOT + // reproduced, as they are environment/version specific: it wraps the rendered body in + // an envelope, and appends an e-mail tracking token to the + // subject (e.g. "...with us CRM:0100002"). if (metadata.EntityMetadata.ContainsKey("template")) { var template = db.GetEntityOrNull(new EntityReference("template", request.TemplateId)); diff --git a/tests/TestPluginAssembly365/Context/Template.cs b/tests/TestPluginAssembly365/Context/Template.cs new file mode 100644 index 00000000..204e74f6 --- /dev/null +++ b/tests/TestPluginAssembly365/Context/Template.cs @@ -0,0 +1,111 @@ +using DG.XrmContext; +using Microsoft.Xrm.Sdk; +using Microsoft.Xrm.Sdk.Client; +using System; +using System.Runtime.Serialization; + +// NOTE: This early-bound type is hand-written rather than emitted by XrmContext. The generated +// XrmContext.cs is produced from a fixed reference org (Env.lab4) that does not include the +// 'template' entity, so this minimal proxy type was added to support SendEmailFromTemplate tests. +// It follows the same generated style (ExtendedEntity, AttributeLogicalName) so it behaves like a +// generated proxy type under XrmMockup's EnableProxyTypes. Extend with more attributes as needed. + +namespace DG.XrmFramework.BusinessDomain.ServiceContext +{ + [EntityLogicalName("template")] + [DataContract()] + public partial class Template : ExtendedEntity + { + public const string EntityLogicalName = "template"; + + public const int EntityTypeCode = 2010; + + public Template() : base(EntityLogicalName) { } + + public Template(Guid Id) : base(EntityLogicalName, Id) { } + + [AttributeLogicalName("templateid")] + public override Guid Id + { + get { return base.Id; } + set { SetId("templateid", value); } + } + + [AttributeLogicalName("templateid")] + public Guid? TemplateId + { + get { return GetAttributeValue("templateid"); } + set { SetId("templateid", value); } + } + + ///

+ /// Title of the e-mail template. (Primary name attribute.) + /// + [AttributeLogicalName("title")] + public string Title + { + get { return GetAttributeValue("title"); } + set { SetAttributeValue("title", value); } + } + + /// + /// Subject line of the template. Stored as an XSLT stylesheet in Dataverse. + /// + [AttributeLogicalName("subject")] + public string Subject + { + get { return GetAttributeValue("subject"); } + set { SetAttributeValue("subject", value); } + } + + /// + /// Body of the template. Stored as an XSLT stylesheet in Dataverse. + /// + [AttributeLogicalName("body")] + public string Body + { + get { return GetAttributeValue("body"); } + set { SetAttributeValue("body", value); } + } + + /// + /// Description of the template. + /// + [AttributeLogicalName("description")] + public string Description + { + get { return GetAttributeValue("description"); } + set { SetAttributeValue("description", value); } + } + + /// + /// Logical name of the entity the template applies to (EntityName attribute). + /// + [AttributeLogicalName("templatetypecode")] + public string TemplateTypeCode + { + get { return GetAttributeValue("templatetypecode"); } + set { SetAttributeValue("templatetypecode", value); } + } + + /// + /// Whether the template is a personal template (true) or an organization template (false). + /// + [AttributeLogicalName("ispersonal")] + public bool? IsPersonal + { + get { return GetAttributeValue("ispersonal"); } + set { SetAttributeValue("ispersonal", value); } + } + + /// + /// Language of the template (LCID). + /// + [AttributeLogicalName("languagecode")] + public int? LanguageCode + { + get { return GetAttributeValue("languagecode"); } + set { SetAttributeValue("languagecode", value); } + } + } +} diff --git a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs index 24b576e5..a7215897 100644 --- a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs +++ b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs @@ -64,11 +64,10 @@ public void RendersBodyWithRegardingAndSenderValues() var result = EmailTemplateRenderer.Render(RealBodyXslt, entities); // Values are merged from the regarding contact and the sending systemuser. - // (Standard XSLT whitespace-stripping removes whitespace-only stylesheet text - // nodes, so the salutation/lastname render as "MrSmith" rather than "Mr Smith"; - // that conformant nuance is not asserted here.) - Assert.Contains("Dear Mr", result); - Assert.Contains("Smith", result); + // The "MrSmith" concatenation (no space) is verified against real Dataverse output: + // SendEmailFromTemplate against a live org renders this same template as "Dear MrSmith ," + // because XSLT strips the whitespace-only stylesheet text node between the two values. + Assert.Contains("Dear MrSmith", result); Assert.Contains("Name: Admin User", result); Assert.Contains("Street Address: 123 Main St", result); Assert.Contains("E-mail Address: smith@test.com", result); diff --git a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs index bde2d7e3..d2e6d3c7 100644 --- a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs +++ b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs @@ -78,15 +78,14 @@ public void TestSendEmailFromTemplateCreatesAndSendsEmail() [Fact] public void TestSendEmailFromTemplateRendersTemplateContent() { - // No early-bound type is generated for the template entity, so it is created late-bound. - var template = new Entity("template") + var template = new Template { - ["title"] = "Registration", - ["templatetypecode"] = "contact", - ["subject"] = SubjectXslt, - ["body"] = BodyXslt, - ["ispersonal"] = false, - ["languagecode"] = 1033 + Title = "Registration", + TemplateTypeCode = "contact", + Subject = SubjectXslt, + Body = BodyXslt, + IsPersonal = false, + LanguageCode = 1033 }; template.Id = orgAdminService.Create(template); From c01f4a5ce9a57511292563b56cd03937d8148138 Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Tue, 2 Jun 2026 12:55:17 +0200 Subject: [PATCH 04/14] Replace hand-written Template type with one generated from the org The early-bound Template type is now generated by Delegate XrmContext v3.0.1 directly from the live org (https://orgd3a12bfa.crm4.dynamics.com), scoped to the 'template' entity, rather than hand-written. v3.0.1 was required because the bundled XrmContext v1.8 only supports WS-Trust, which the OAuth/MFA org rejects. Adjusted to the existing XrmContext.cs style: dropped the v3 cosmetic [DisplayName]/[MaxLength]/[Range] annotations and their System.ComponentModel* usings (net462 has no DataAnnotations reference and the existing context omits them), and the unused Template_TemplateTypeCode enum (templatetypecode is an EntityName string). Attribute data is unchanged; full suite passes on net462 and net8.0. --- .../TestPluginAssembly365/Context/Template.cs | 542 ++++++++++++++++-- 1 file changed, 484 insertions(+), 58 deletions(-) diff --git a/tests/TestPluginAssembly365/Context/Template.cs b/tests/TestPluginAssembly365/Context/Template.cs index 204e74f6..fc10599e 100644 --- a/tests/TestPluginAssembly365/Context/Template.cs +++ b/tests/TestPluginAssembly365/Context/Template.cs @@ -1,111 +1,537 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by Delegate XrmContext v3.0.1. +// +// Generated from the live org https://orgd3a12bfa.crm4.dynamics.com scoped to the +// 'template' entity. The main XrmContext.cs is generated from a different reference org +// that does not contain 'template', so this type is generated separately and kept here. +// +// Adjusted to match the existing XrmContext.cs style (which predates v3): the cosmetic +// [DisplayName]/[MaxLength]/[Range] annotations and their System.ComponentModel* usings were +// removed (net462 does not reference DataAnnotations and the existing context omits them), +// and the unused standalone Template_TemplateTypeCode option-set enum was dropped because +// 'templatetypecode' is an EntityName (string). The attribute data is otherwise unchanged. +// The 'componentstate' enum referenced below is defined in XrmContext.cs. +// +//------------------------------------------------------------------------------ + using DG.XrmContext; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Client; using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Linq.Expressions; using System.Runtime.Serialization; -// NOTE: This early-bound type is hand-written rather than emitted by XrmContext. The generated -// XrmContext.cs is produced from a fixed reference org (Env.lab4) that does not include the -// 'template' entity, so this minimal proxy type was added to support SendEmailFromTemplate tests. -// It follows the same generated style (ExtendedEntity, AttributeLogicalName) so it behaves like a -// generated proxy type under XrmMockup's EnableProxyTypes. Extend with more attributes as needed. -namespace DG.XrmFramework.BusinessDomain.ServiceContext -{ +namespace DG.XrmFramework.BusinessDomain.ServiceContext { + + + /// + /// Template for an email message that contains the standard attributes of an email message. + /// Display Name: Email Template + /// [EntityLogicalName("template")] + [DebuggerDisplay("{DebuggerDisplay,nq}")] [DataContract()] - public partial class Template : ExtendedEntity - { + public partial class Template : ExtendedEntity { + public const string EntityLogicalName = "template"; public const int EntityTypeCode = 2010; - public Template() : base(EntityLogicalName) { } + public Template() : + base(EntityLogicalName) { + } + + public Template(Guid Id) : + base(EntityLogicalName, Id) { + } - public Template(Guid Id) : base(EntityLogicalName, Id) { } + private string DebuggerDisplay { + get { + return GetDebuggerDisplay("title"); + } + } [AttributeLogicalName("templateid")] - public override Guid Id - { - get { return base.Id; } - set { SetId("templateid", value); } + public override Guid Id { + get { + return base.Id; + } + set { + SetId("templateid", value); + } } + /// + /// Unique identifier of the template. + /// [AttributeLogicalName("templateid")] - public Guid? TemplateId - { - get { return GetAttributeValue("templateid"); } - set { SetId("templateid", value); } + public Guid? TemplateId { + get { + return GetAttributeValue("templateid"); + } + set { + SetId("templateid", value); + } } /// - /// Title of the e-mail template. (Primary name attribute.) + /// Body text of the email template. /// - [AttributeLogicalName("title")] - public string Title - { - get { return GetAttributeValue("title"); } - set { SetAttributeValue("title", value); } + [AttributeLogicalName("body")] + public string Body { + get { + return GetAttributeValue("body"); + } + set { + SetAttributeValue("body", value); + } } /// - /// Subject line of the template. Stored as an XSLT stylesheet in Dataverse. + /// For internal use only. /// - [AttributeLogicalName("subject")] - public string Subject - { - get { return GetAttributeValue("subject"); } - set { SetAttributeValue("subject", value); } + [AttributeLogicalName("componentstate")] + public componentstate? ComponentState { + get { + return GetOptionSetValue("componentstate"); + } } /// - /// Body of the template. Stored as an XSLT stylesheet in Dataverse. + /// Unique identifier of the user who created the email template. /// - [AttributeLogicalName("body")] - public string Body - { - get { return GetAttributeValue("body"); } - set { SetAttributeValue("body", value); } + [AttributeLogicalName("createdby")] + public EntityReference CreatedBy { + get { + return GetAttributeValue("createdby"); + } + } + + /// + /// Date and time when the email template was created. + /// + [AttributeLogicalName("createdon")] + public DateTime? CreatedOn { + get { + return GetAttributeValue("createdon"); + } + } + + /// + /// Unique identifier of the delegate user who created the template. + /// + [AttributeLogicalName("createdonbehalfby")] + public EntityReference CreatedOnBehalfBy { + get { + return GetAttributeValue("createdonbehalfby"); + } } /// - /// Description of the template. + /// Description of the email template. /// [AttributeLogicalName("description")] - public string Description - { - get { return GetAttributeValue("description"); } - set { SetAttributeValue("description", value); } + public string Description { + get { + return GetAttributeValue("description"); + } + set { + SetAttributeValue("description", value); + } + } + + [AttributeLogicalName("entityimageid")] + public Guid? EntityImageId { + get { + return GetAttributeValue("entityimageid"); + } } /// - /// Logical name of the entity the template applies to (EntityName attribute). + /// For internal use only. /// - [AttributeLogicalName("templatetypecode")] - public string TemplateTypeCode - { - get { return GetAttributeValue("templatetypecode"); } - set { SetAttributeValue("templatetypecode", value); } + [AttributeLogicalName("generationtypecode")] + public int? GenerationTypeCode { + get { + return GetAttributeValue("generationtypecode"); + } + set { + SetAttributeValue("generationtypecode", value); + } + } + + /// + /// Unique identifier of the data import or data migration that created this record. + /// + [AttributeLogicalName("importsequencenumber")] + public int? ImportSequenceNumber { + get { + return GetAttributeValue("importsequencenumber"); + } + set { + SetAttributeValue("importsequencenumber", value); + } + } + + /// + /// Version in which the form is introduced. + /// + [AttributeLogicalName("introducedversion")] + public string IntroducedVersion { + get { + return GetAttributeValue("introducedversion"); + } + set { + SetAttributeValue("introducedversion", value); + } + } + + /// + /// Information that specifies whether this component can be customized. + /// + [AttributeLogicalName("iscustomizable")] + public BooleanManagedProperty IsCustomizable { + get { + return GetAttributeValue("iscustomizable"); + } + set { + SetAttributeValue("iscustomizable", value); + } + } + + /// + /// Indicates whether the solution component is part of a managed solution. + /// + [AttributeLogicalName("ismanaged")] + public bool? IsManaged { + get { + return GetAttributeValue("ismanaged"); + } } /// - /// Whether the template is a personal template (true) or an organization template (false). + /// Information about whether the template is personal or is available to all users. /// [AttributeLogicalName("ispersonal")] - public bool? IsPersonal - { - get { return GetAttributeValue("ispersonal"); } - set { SetAttributeValue("ispersonal", value); } + public bool? IsPersonal { + get { + return GetAttributeValue("ispersonal"); + } + set { + SetAttributeValue("ispersonal", value); + } + } + + /// + /// Indicates if a template is recommended by Dynamics 365. + /// + [AttributeLogicalName("isrecommended")] + public bool? IsRecommended { + get { + return GetAttributeValue("isrecommended"); + } } /// - /// Language of the template (LCID). + /// Language of the email template. /// [AttributeLogicalName("languagecode")] - public int? LanguageCode - { - get { return GetAttributeValue("languagecode"); } - set { SetAttributeValue("languagecode", value); } + public int? LanguageCode { + get { + return GetAttributeValue("languagecode"); + } + set { + SetAttributeValue("languagecode", value); + } + } + + /// + /// MIME type of the email template. + /// + [AttributeLogicalName("mimetype")] + public string MimeType { + get { + return GetAttributeValue("mimetype"); + } + set { + SetAttributeValue("mimetype", value); + } + } + + /// + /// Unique identifier of the user who last modified the template. + /// + [AttributeLogicalName("modifiedby")] + public EntityReference ModifiedBy { + get { + return GetAttributeValue("modifiedby"); + } + } + + /// + /// Date and time when the email template was last modified. + /// + [AttributeLogicalName("modifiedon")] + public DateTime? ModifiedOn { + get { + return GetAttributeValue("modifiedon"); + } + } + + /// + /// Unique identifier of the delegate user who last modified the template. + /// + [AttributeLogicalName("modifiedonbehalfby")] + public EntityReference ModifiedOnBehalfBy { + get { + return GetAttributeValue("modifiedonbehalfby"); + } + } + + /// + /// For internal use only. Shows the number of times emails that use this template have been opened. + /// + [AttributeLogicalName("opencount")] + public int? OpenCount { + get { + return GetAttributeValue("opencount"); + } + } + + /// + /// Shows the open rate of this template. This is based on number of opens on followed emails that use this template. + /// + [AttributeLogicalName("openrate")] + public int? OpenRate { + get { + return GetAttributeValue("openrate"); + } + } + + /// + /// For internal use only. + /// + [AttributeLogicalName("overwritetime")] + public DateTime? OverwriteTime { + get { + return GetAttributeValue("overwritetime"); + } + } + + /// + /// Unique identifier of the user or team who owns the template for the email activity. + /// + [AttributeLogicalName("ownerid")] + public EntityReference OwnerId { + get { + return GetAttributeValue("ownerid"); + } + set { + SetAttributeValue("ownerid", value); + } + } + + /// + /// Unique identifier of the business unit that owns the template. + /// + [AttributeLogicalName("owningbusinessunit")] + public EntityReference OwningBusinessUnit { + get { + return GetAttributeValue("owningbusinessunit"); + } + } + + /// + /// Unique identifier of the team who owns the template. + /// + [AttributeLogicalName("owningteam")] + public EntityReference OwningTeam { + get { + return GetAttributeValue("owningteam"); + } + } + + /// + /// Unique identifier of the user who owns the template. + /// + [AttributeLogicalName("owninguser")] + public EntityReference OwningUser { + get { + return GetAttributeValue("owninguser"); + } + } + + /// + /// XML data for the body of the email template. + /// + [AttributeLogicalName("presentationxml")] + public string PresentationXml { + get { + return GetAttributeValue("presentationxml"); + } + set { + SetAttributeValue("presentationxml", value); + } + } + + /// + /// Title of the template. + /// + [AttributeLogicalName("title")] + public string PrimaryNameField { + get { + return GetAttributeValue("title"); + } + set { + SetAttributeValue("title", value); + } + } + + /// + /// For internal use only. Shows the number of times emails that use this template have received replies. + /// + [AttributeLogicalName("replycount")] + public int? ReplyCount { + get { + return GetAttributeValue("replycount"); + } + } + + /// + /// Shows the reply rate for this template. This is based on number of replies received on followed emails that use this template. + /// + [AttributeLogicalName("replyrate")] + public int? ReplyRate { + get { + return GetAttributeValue("replyrate"); + } + } + + /// + /// Safe html of email template. + /// + [AttributeLogicalName("safehtml")] + public string SafeHtml { + get { + return GetAttributeValue("safehtml"); + } + set { + SetAttributeValue("safehtml", value); + } + } + + /// + /// Unique identifier of the associated solution. + /// + [AttributeLogicalName("solutionid")] + public Guid? SolutionId { + get { + return GetAttributeValue("solutionid"); + } + } + + /// + /// Subject associated with the email template. + /// + [AttributeLogicalName("subject")] + public string Subject { + get { + return GetAttributeValue("subject"); + } + set { + SetAttributeValue("subject", value); + } + } + + /// + /// XML data for the subject of the email template. + /// + [AttributeLogicalName("subjectpresentationxml")] + public string SubjectPresentationXml { + get { + return GetAttributeValue("subjectpresentationxml"); + } + set { + SetAttributeValue("subjectpresentationxml", value); + } + } + + /// + /// Safe html of email template subject. + /// + [AttributeLogicalName("subjectsafehtml")] + public string SubjectSafeHtml { + get { + return GetAttributeValue("subjectsafehtml"); + } + set { + SetAttributeValue("subjectsafehtml", value); + } + } + + /// + /// For internal use only. + /// + [AttributeLogicalName("templateidunique")] + public Guid? TemplateIdUnique { + get { + return GetAttributeValue("templateidunique"); + } + } + + /// + /// Type of email template. + /// + [AttributeLogicalName("templatetypecode")] + public string TemplateTypeCode { + get { + return GetAttributeValue("templatetypecode"); + } + set { + SetAttributeValue("templatetypecode", value); + } + } + + /// + /// Title of the template. + /// + [AttributeLogicalName("title")] + public string Title { + get { + return GetAttributeValue("title"); + } + set { + SetAttributeValue("title", value); + } + } + + /// + /// Shows the number of sent emails that use this template. + /// + [AttributeLogicalName("usedcount")] + public int? UsedCount { + get { + return GetAttributeValue("usedcount"); + } + } + + /// + /// Version number of the template. + /// + [AttributeLogicalName("versionnumber")] + public long? VersionNumber { + get { + return GetAttributeValue("versionnumber"); + } + } + + public static Template Retrieve(IOrganizationService service, Guid id, params Expression>[] attrs) { + return service.Retrieve(id, attrs); } } } From 0414f1e7c4c946fa6b6860898af62c18f1e8e7cf Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Tue, 2 Jun 2026 13:02:29 +0200 Subject: [PATCH 05/14] Pretty-print TemplateMetadata.xml Format the extracted single-entity metadata file with indentation and the same UTF-8 BOM + XML declaration as the main Metadata.xml, instead of one long line. No content change; full suite still passes on net462 and net8.0. --- .../Metadata/TemplateMetadata.xml | 9075 ++++++++++++++++- 1 file changed, 9074 insertions(+), 1 deletion(-) diff --git a/tests/XrmMockup365Test/Metadata/TemplateMetadata.xml b/tests/XrmMockup365Test/Metadata/TemplateMetadata.xml index cf1f796d..328ade39 100644 --- a/tests/XrmMockup365Test/Metadata/TemplateMetadata.xml +++ b/tests/XrmMockup365Test/Metadata/TemplateMetadata.xml @@ -1 +1,9074 @@ -templateb71c0a4c-b9b6-4e12-a02e-94feba67eade079fce9cd-25b4-4d41-bf22-85670d2f70f2Memofalsefalsefalsefalsecanmodifyadditionalsettingsfalse91900-01-01T00:00:001764cfee-2241-db11-898a-0007e9e17ebdtrueBody text of the email template.10331764cfee-2241-db11-898a-0007e9e17ebdtrueBody text of the email template.10331664cfee-2241-db11-898a-0007e9e17ebdtrueBody10331664cfee-2241-db11-898a-0007e9e17ebdtrueBody1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetruebody1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneBodyMemoType5.0.0.0falseTextAreaAuto1073741823TextAreafalseeb40fb38-f56c-43a2-9e4f-08fc4ae1374cPicklistfalsefalsefalsefalsecanmodifyadditionalsettingsfalse381900-01-01T00:00:004bc15966-4061-4f84-96a5-5323a385d5b2trueFor internal use only.10334bc15966-4061-4f84-96a5-5323a385d5b2trueFor internal use only.103391a2c350-e738-484c-90df-13d406b28602trueComponent State103391a2c350-e738-484c-90df-13d406b28602trueComponent State1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetruecomponentstate1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredComponentStatePicklistType5.0.0.0false0-1faece09f-cefc-11de-8150-00155da18b00faece0a1-cefc-11de-8150-00155da18b00trueThe state of this component.1033faece0a1-cefc-11de-8150-00155da18b00trueThe state of this component.1033faece0a0-cefc-11de-8150-00155da18b00trueComponent State1033faece0a0-cefc-11de-8150-00155da18b00trueComponent State1033falsefalseiscustomizablefalsetruetruecomponentstatePicklist5.0.0.0falsetruefaece0a3-cefc-11de-8150-00155da18b00truePublished1033faece0a3-cefc-11de-8150-00155da18b00truePublished10330falsetruefaece0a5-cefc-11de-8150-00155da18b00trueUnpublished1033faece0a5-cefc-11de-8150-00155da18b00trueUnpublished10331falsetruefaece0a7-cefc-11de-8150-00155da18b00trueDeleted1033faece0a7-cefc-11de-8150-00155da18b00trueDeleted10332falsetrue1f83e0bb-cefd-11de-8150-00155da18b00trueDeleted Unpublished10331f83e0bb-cefd-11de-8150-00155da18b00trueDeleted Unpublished103330306d7cb9-fcd9-4d42-a400-2aa73bdea381Lookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse131900-01-01T00:00:00fae9af0c-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the user who created the email template.1033fae9af0c-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the user who created the email template.1033f9e9af0c-2341-db11-898a-0007e9e17ebdtrueCreated By1033f9e9af0c-2341-db11-898a-0007e9e17ebdtrueCreated By1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruecreatedby1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneCreatedByLookupType5.0.0.0falseNonesystemuserd081bb4a-b92f-4790-9a1a-ef359a53b12bcreatedbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse201900-01-01T00:00:00641d9b1e-2341-db11-898a-0007e9e17ebdtrueName of the user who created the email template.1033641d9b1e-2341-db11-898a-0007e9e17ebdtrueName of the user who created the email template.1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsecreatedbyname2026-05-15T07:09:51.84falsecanmodifyrequirementlevelsettingsNoneCreatedByNameStringType5.0.0.0true0TextAuto100Textfalse0320cdc10493-8106-4e96-943e-63732f539bc6createdbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse351900-01-01T00:00:00844f7b37-2341-db11-898a-0007e9e17ebdtrueYomiName of the user who created the email template.1033844f7b37-2341-db11-898a-0007e9e17ebdtrueYomiName of the user who created the email template.1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsecreatedbyyominame2026-05-15T07:09:54.5900032falsecanmodifyrequirementlevelsettingsNoneCreatedByYomiNameStringType5.0.0.0true0TextAuto100createdbynameTextfalse032052ae0715-5eb5-4f2d-a168-2c5662d7db58DateTimefalsefalsefalsefalsecanmodifyadditionalsettingsfalse151900-01-01T00:00:00e026e7d6-2241-db11-898a-0007e9e17ebdtrueDate and time when the email template was created.1033e026e7d6-2241-db11-898a-0007e9e17ebdtrueDate and time when the email template was created.1033df26e7d6-2241-db11-898a-0007e9e17ebdtrueCreated On1033df26e7d6-2241-db11-898a-0007e9e17ebdtrueCreated On1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruecreatedon1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneCreatedOnDateTimeType5.0.0.0false0DateAndTimeInactive0falsecanmodifybehaviorfalseUserLocal5a0a7aed-dfa0-44bb-98a9-137892bd4b64Lookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse421900-01-01T00:00:00e5054e1c-47a1-49c9-ace2-f8fb0fd46082trueUnique identifier of the delegate user who created the template.1033e5054e1c-47a1-49c9-ace2-f8fb0fd46082trueUnique identifier of the delegate user who created the template.10339eb18cf1-f226-420c-b1aa-de8699755ad7trueCreated By (Delegate)10339eb18cf1-f226-420c-b1aa-de8699755ad7trueCreated By (Delegate)1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruecreatedonbehalfby1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneCreatedOnBehalfByLookupType5.0.0.0falseNonesystemuser0b21e731-bd3f-4b46-b06a-6a89451eb724createdonbehalfbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse441900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsecreatedonbehalfbyname2026-05-15T07:09:52.6200064falsecanmodifyrequirementlevelsettingsNoneCreatedOnBehalfByNameStringType5.0.0.0true0TextAuto100Textfalse0320013aa3f5-81ae-4be8-82b0-e0ec18bded64createdonbehalfbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse451900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsecreatedonbehalfbyyominame2026-05-15T07:09:54.5430016falsecanmodifyrequirementlevelsettingsNoneCreatedOnBehalfByYomiNameStringType5.0.0.0true0TextAuto100createdonbehalfbynameTextfalse0320db3dce49-6363-4130-9617-4eaec35cf968Memofalsefalsefalsefalsecanmodifyadditionalsettingsfalse111900-01-01T00:00:00f51dd7e8-2241-db11-898a-0007e9e17ebdtrueDescription of the email template.1033f51dd7e8-2241-db11-898a-0007e9e17ebdtrueDescription of the email template.1033f41dd7e8-2241-db11-898a-0007e9e17ebdtrueDescription1033f41dd7e8-2241-db11-898a-0007e9e17ebdtrueDescription1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsefalsetruetruetruedescription1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneDescriptionMemoType5.0.0.0falseTextAuto2000Textfalseaecaf2b0-2d87-475a-b79f-780180a641a9entityimageidVirtualfalsefalsefalsetruecanmodifyadditionalsettingsfalse100062026-05-15T11:47:35.02300169672d2e2-f6cd-4c69-95eb-59a7f6e4e545falseShows the default image for the record.10339672d2e2-f6cd-4c69-95eb-59a7f6e4e545falseShows the default image for the record.103329278ef8-c857-4d1a-bdd3-6aa424f3b46afalseDefault Image103329278ef8-c857-4d1a-bdd3-6aa424f3b46afalseDefault Image1033templatetruecanmodifyauditsettingsfalsefalsetrueiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsefalsefalsefalsetrueisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetrueentityimage2026-05-15T11:47:35.0230016falsecanmodifyrequirementlevelsettingsNoneEntityImageImageType6.0.0.0truefalsetrue144102401440cf9348a-810c-4dda-8e8e-dd6370b7cc55entityimageidBigIntfalsefalsefalsefalsecanmodifyadditionalsettingsfalse100052026-05-15T11:47:35.0070016templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueentityimage_timestamp2026-05-15T11:47:35.0070016falsecanmodifyrequirementlevelsettingsNoneEntityImage_TimestampBigIntType6.0.0.0true9223372036854775807-922337203685477580873432d91-0418-4e0f-b5b6-1d6eb0902f7centityimageidStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse100042026-05-15T11:47:34.9769984templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueentityimage_url2026-05-15T11:47:34.9769984falsecanmodifyrequirementlevelsettingsNoneEntityImage_URLStringType6.0.0.0true0UrlDisabled200Urlfalse0400ff9785d6-38f2-44e6-879c-268e576307c7Uniqueidentifierfalsefalsefalsefalsecanmodifyadditionalsettingsfalse100032026-05-15T11:47:34.96templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueentityimageid2026-05-15T11:47:34.96falsecanmodifyrequirementlevelsettingsNoneEntityImageIdUniqueidentifierType6.0.0.0false66579e47-a3d5-46ff-837a-42eb6ada5a93Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse311900-01-01T00:00:00b051c19b-998c-4a98-a376-68ed18cd3cd2trueFor internal use only.1033b051c19b-998c-4a98-a376-68ed18cd3cd2trueFor internal use only.1033e64bf18c-0efa-4699-84fb-0fc5b604b5b9trueGeneration Type Code1033e64bf18c-0efa-4699-84fb-0fc5b604b5b9trueGeneration Type Code1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruefalsetruegenerationtypecode1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneGenerationTypeCodeIntegerType5.0.0.0false0None21474836470018460bd9-edf0-4569-afda-295beb33c54cIntegerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse331900-01-01T00:00:008fcc9305-da95-40e1-b2c7-bee1c744f5e9trueUnique identifier of the data import or data migration that created this record.10338fcc9305-da95-40e1-b2c7-bee1c744f5e9trueUnique identifier of the data import or data migration that created this record.10332a4e2f19-926c-4fa9-9c54-5a88b05d8fcftrueImport Sequence Number10332a4e2f19-926c-4fa9-9c54-5a88b05d8fcftrueImport Sequence Number1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsefalsetruefalsetrueimportsequencenumber1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneImportSequenceNumberIntegerType5.0.0.0false0None2147483647-214748364802edff88a-365e-4356-b2e8-43f357726d8cStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse541900-01-01T00:00:00309a3bef-56fb-439a-89d8-629e356a1ce7trueVersion in which the form is introduced.1033309a3bef-56fb-439a-89d8-629e356a1ce7trueVersion in which the form is introduced.10338f611973-b29a-4e31-92a2-11c7490d3b17trueIntroduced Version10338f611973-b29a-4e31-92a2-11c7490d3b17trueIntroduced Version1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruefalsetrueintroducedversion1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneIntroducedVersionStringType6.0.0.0false0VersionNumberAuto48VersionNumberfalse096370865d2-b62f-4154-a5a1-4e0d6c8f7ff8ManagedPropertyfalsefalsefalsefalsecanmodifyadditionalsettingsfalse521900-01-01T00:00:004c46c780-c44a-4fbe-852e-74b361f7ecd7trueInformation that specifies whether this component can be customized.10334c46c780-c44a-4fbe-852e-74b361f7ecd7trueInformation that specifies whether this component can be customized.1033bc14ca4b-8d45-44a7-8c7d-5e11d10d8fb3trueCustomizable1033bc14ca4b-8d45-44a7-8c7d-5e11d10d8fb3trueCustomizable1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetrueiscustomizable1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredIsCustomizableManagedPropertyType5.0.0.0falseiscustomizableanddeletable0Boolean9388702d-5f84-4cd5-8f00-b399429a15f7Booleanfalsefalsefalsefalsecanmodifyadditionalsettingsfalse511900-01-01T00:00:003cd2b49b-1704-4d71-8da2-4d3620ca3250trueIndicates whether the solution component is part of a managed solution.10333cd2b49b-1704-4d71-8da2-4d3620ca3250trueIndicates whether the solution component is part of a managed solution.10332a19ef4d-5a11-4749-9386-8f281126a77dtrueIs Managed10332a19ef4d-5a11-4749-9386-8f281126a77dtrueIs Managed1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueismanaged1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredIsManagedBooleanType5.0.0.0false0false9d04e035-5408-4c1d-a5aa-20445a02f691b41954a2-f3a5-47e9-ae13-ceb49de4465btrueInformation about whether the current component is managed.1033b41954a2-f3a5-47e9-ae13-ceb49de4465btrueInformation about whether the current component is managed.103345a188b1-91a8-4019-b582-cebda8081064trueIs Component Managed103345a188b1-91a8-4019-b582-cebda8081064trueIs Component Managed1033falsefalseiscustomizablefalsetruetrueismanagedBoolean5.0.0.0falsetrue443c7078-b7cb-47e7-8547-08dfa82950d0trueUnmanaged1033443c7078-b7cb-47e7-8547-08dfa82950d0trueUnmanaged10330falsetrueec886b5b-7e97-4c62-b30c-bf295639d540trueManaged1033ec886b5b-7e97-4c62-b30c-bf295639d540trueManaged1033108748c5d2-3c6f-46e1-bc9b-e422580e9222ismanagedVirtualfalsefalsefalsefalsecanmodifyadditionalsettingsfalse531900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseismanagedname1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneIsManagedNameVirtualType5.0.0.0truebd6cc13d-c4f6-4d08-b344-eff79adce1b7Booleanfalsefalsefalsefalsecanmodifyadditionalsettingsfalse41900-01-01T00:00:00becde1dc-2241-db11-898a-0007e9e17ebdtrueInformation about whether the template is personal or is available to all users.1033becde1dc-2241-db11-898a-0007e9e17ebdtrueInformation about whether the template is personal or is available to all users.1033bdcde1dc-2241-db11-898a-0007e9e17ebdtrueViewable By1033bdcde1dc-2241-db11-898a-0007e9e17ebdtrueViewable By1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsetruetruetruetrueispersonal1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneIsPersonalBooleanType5.0.0.0false0true692312cf-56a6-4e49-b23e-9102ff0f67ca2c800910-9d68-43da-a9be-89be5d0e076ctrueInformation about whether the template is personal or is available to all users.10332c800910-9d68-43da-a9be-89be5d0e076ctrueInformation about whether the template is personal or is available to all users.1033e1f336db-1848-48b0-8f61-7cad82130b34trueViewable By1033e1f336db-1848-48b0-8f61-7cad82130b34trueViewable By1033falsefalseiscustomizabletruefalsetruetemplate_ispersonalBoolean5.0.0.0falsetruec0cde1dc-2241-db11-898a-0007e9e17ebdtrueOrganization1033c0cde1dc-2241-db11-898a-0007e9e17ebdtrueOrganization10330falsetruec2cde1dc-2241-db11-898a-0007e9e17ebdtrueIndividual1033c2cde1dc-2241-db11-898a-0007e9e17ebdtrueIndividual1033100402f0d0-9dba-4af5-9587-9b7804f24285ispersonalVirtualfalsefalsefalsefalsecanmodifyadditionalsettingsfalse281900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseispersonalname1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneIsPersonalNameVirtualType5.0.0.0truece62e4df-044d-4caf-afca-31a42b8eb898Booleanfalsefalsefalsefalsecanmodifyadditionalsettingstrue571900-01-01T00:00:0034af6216-41cf-4336-9a7e-264f8f75f285trueIndicates if a template is recommended by Dynamics 365.103334af6216-41cf-4336-9a7e-264f8f75f285trueIndicates if a template is recommended by Dynamics 365.103375fcdf03-cc45-4f96-85ca-5f5c06745165trueRecommended103375fcdf03-cc45-4f96-85ca-5f5c06745165trueRecommended1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsetruecanmodifysearchsettingstruefalsetruetruetruefalsetrueisrecommended1900-01-01T00:00:00truecanmodifyrequirementlevelsettingsNoneIsRecommendedBooleanType8.2.0.0false0false566c3f11-fd9e-4fe5-8535-f81d07cb0b9ed2ec89bb-142c-4c03-bde1-8640bfa6c185trueShows if this template is recommended or not1033d2ec89bb-142c-4c03-bde1-8640bfa6c185trueShows if this template is recommended or not1033da2d5600-b73b-4bf4-96e3-1cffca697255trueRecommended1033da2d5600-b73b-4bf4-96e3-1cffca697255trueRecommended1033falsefalseiscustomizablefalsefalsetruetemplate_isrecommendedBoolean8.2.0.0falsetrue09409285-2d68-49f1-959c-e2d873f07fdatrueNo103309409285-2d68-49f1-959c-e2d873f07fdatrueNo10330falsetrue1802c1b4-80f4-4408-a536-c08efb4baf0btrueYes10331802c1b4-80f4-4408-a536-c08efb4baf0btrueYes103310bda7101f-2d74-4bab-8201-650cca2e1bc3isrecommendedVirtualfalsefalsefalsefalsecanmodifyadditionalsettingstrue581900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseisrecommendedname1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneIsRecommendedNameVirtualType8.2.0.0trueba5e9a47-c78f-40b4-bc1b-1008326192a6Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse321900-01-01T00:00:00b99b1dc7-8e1e-4e1e-9b30-fc9e89322679trueLanguage of the email template.1033b99b1dc7-8e1e-4e1e-9b30-fc9e89322679trueLanguage of the email template.1033ae90bff0-065c-41f9-bc67-f316d9702a19trueLanguage1033ae90bff0-065c-41f9-bc67-f316d9702a19trueLanguage1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruetruetruetruetruetruelanguagecode1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsApplicationRequiredLanguageCodeIntegerType5.0.0.0false0Language2147483647001e90a39b-bda4-4ad2-b708-74ebcbcae348Stringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse71900-01-01T00:00:006740b506-2341-db11-898a-0007e9e17ebdtrueMIME type of the email template.10336740b506-2341-db11-898a-0007e9e17ebdtrueMIME type of the email template.10336640b506-2341-db11-898a-0007e9e17ebdtrueMime Type10336640b506-2341-db11-898a-0007e9e17ebdtrueMime Type1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetruemimetype1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneMimeTypeStringType5.0.0.0false0TextAuto256Textfalse051253b62ff6-eb39-4c51-bc6c-63cff9bd3bb9Lookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse161900-01-01T00:00:009b64cfee-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the user who last modified the template.10339b64cfee-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the user who last modified the template.10339a64cfee-2241-db11-898a-0007e9e17ebdtrueModified By10339a64cfee-2241-db11-898a-0007e9e17ebdtrueModified By1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruemodifiedby1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneModifiedByLookupType5.0.0.0falseNonesystemuserb58aae8b-25f3-4cf2-b724-1ee3e355949bmodifiedbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse221900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsemodifiedbyname2026-05-15T07:09:53.3699968falsecanmodifyrequirementlevelsettingsNoneModifiedByNameStringType5.0.0.0true0TextAuto100Textfalse0320f4645b25-ef5a-44c9-a347-34c01a8ae477modifiedbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse341900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsemodifiedbyyominame2026-05-15T07:09:54.8530048falsecanmodifyrequirementlevelsettingsNoneModifiedByYomiNameStringType5.0.0.0true0TextAuto100modifiedbynameTextfalse0320a51d5ce5-d73b-49ca-aeef-a0ee4536d2d2DateTimefalsefalsefalsefalsecanmodifyadditionalsettingsfalse171900-01-01T00:00:002640b506-2341-db11-898a-0007e9e17ebdtrueDate and time when the email template was last modified.10332640b506-2341-db11-898a-0007e9e17ebdtrueDate and time when the email template was last modified.10332540b506-2341-db11-898a-0007e9e17ebdtrueModified On10332540b506-2341-db11-898a-0007e9e17ebdtrueModified On1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruemodifiedon1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneModifiedOnDateTimeType5.0.0.0false0DateAndTimeInactive0falsecanmodifybehaviorfalseUserLocal2650518e-c42e-46d7-93ab-e8b2d4d10878Lookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse461900-01-01T00:00:0088b366f8-3717-4822-b29d-db05dd46efbctrueUnique identifier of the delegate user who last modified the template.103388b366f8-3717-4822-b29d-db05dd46efbctrueUnique identifier of the delegate user who last modified the template.10334a8a8e56-dbbd-4d19-88f0-eacd62cf24cetrueModified By (Delegate)10334a8a8e56-dbbd-4d19-88f0-eacd62cf24cetrueModified By (Delegate)1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruemodifiedonbehalfby1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneModifiedOnBehalfByLookupType5.0.0.0falseNonesystemuser5edeb9b9-5fa4-40d7-bcb6-840485702594modifiedonbehalfbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse481900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsemodifiedonbehalfbyname2026-05-15T07:09:52.7129984falsecanmodifyrequirementlevelsettingsNoneModifiedOnBehalfByNameStringType5.0.0.0true0TextAuto100Textfalse0320fd623a4d-004c-4b78-82ea-a82aadb2aa65modifiedonbehalfbyStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse491900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsemodifiedonbehalfbyyominame2026-05-15T07:09:54.7430016falsecanmodifyrequirementlevelsettingsNoneModifiedOnBehalfByYomiNameStringType5.0.0.0true0TextAuto100modifiedonbehalfbynameTextfalse032056b0f9b5-1482-46d8-9a80-72d55b7742e8Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse551900-01-01T00:00:0092b43f6b-b037-4db6-8157-02b6418be326trueFor internal use only. Shows the number of times emails that use this template have been opened.103392b43f6b-b037-4db6-8157-02b6418be326trueFor internal use only. Shows the number of times emails that use this template have been opened.1033ecb78564-c1e7-408e-be5b-a0b85703f13etrueOpen Count1033ecb78564-c1e7-408e-be5b-a0b85703f13etrueOpen Count1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetrueopencount1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneOpenCountIntegerType8.2.0.0false0None214748364700ea7970f2-1ac9-484a-b4d4-dced0a298f80Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse591900-01-01T00:00:00445517b3-d409-4788-9ed5-60af9d105428trueShows the open rate of this template. This is based on number of opens on followed emails that use this template.1033445517b3-d409-4788-9ed5-60af9d105428trueShows the open rate of this template. This is based on number of opens on followed emails that use this template.103386347fa3-64ac-4629-945e-88bce8f6070ctrueOpen Rate103386347fa3-64ac-4629-945e-88bce8f6070ctrueOpen Rate1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsetruetruetruefalsetrueopenrate1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneOpenRateIntegerType8.2.0.0false0None2147483647003fe1ef40-198d-4f89-81e4-c12aa4ea0720DateTimefalsefalsefalsefalsecanmodifyadditionalsettingsfalse371900-01-01T00:00:007b59ff51-01c5-42cf-949c-6a41d36f4fadtrueFor internal use only.10337b59ff51-01c5-42cf-949c-6a41d36f4fadtrueFor internal use only.1033cf4c1a13-ad1d-4c46-8b38-592926acebf8trueRecord Overwrite Time1033cf4c1a13-ad1d-4c46-8b38-592926acebf8trueRecord Overwrite Time1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueoverwritetime1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredOverwriteTimeDateTimeType5.0.0.0false0DateOnlyInactive0falsecanmodifybehaviorfalseUserLocal7aa12efe-ad5b-46dd-b155-750a5095564fOwnerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse241900-01-01T00:00:004ed8dee2-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the user or team who owns the template for the email activity.10334ed8dee2-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the user or team who owns the template for the email activity.10334dd8dee2-2241-db11-898a-0007e9e17ebdtrueOwner10334dd8dee2-2241-db11-898a-0007e9e17ebdtrueOwner1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsetruetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsetruetruetruetrueownerid1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredOwnerIdOwnerType5.0.0.0falseNonesystemuserteamd9a30cad-6c8b-4dad-89f6-82ba310879a0owneridStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse251900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseowneridname1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredOwnerIdNameStringType5.0.0.0true0TextAuto100Textfalse03201a7a02c6-64df-4cbd-88b3-9059ca3c65d1owneridEntityNamefalsefalsefalsefalsecanmodifyadditionalsettingsfalse271900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruefalseowneridtype1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredOwnerIdTypeEntityNameType5.0.0.0falsetrue6e55575d-5e3d-4908-9270-cda6d57332d3owneridStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse361900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseowneridyominame1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredOwnerIdYomiNameStringType5.0.0.0true0TextAuto100owneridnameTextfalse03204f946828-9978-4ea4-a37f-46db1aaa772bLookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse31900-01-01T00:00:00f9e8af0c-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the business unit that owns the template.1033f9e8af0c-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the business unit that owns the template.1033f8e8af0c-2341-db11-898a-0007e9e17ebdtrueOwning Business Unit1033f8e8af0c-2341-db11-898a-0007e9e17ebdtrueOwning Business Unit1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsetruetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsetruetruetruefalsetrueowningbusinessunit1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneOwningBusinessUnitLookupType5.0.0.0falseNonebusinessunit21ba76d9-58e4-4451-a17f-e808155eb9f4owningbusinessunitStringfalsefalsefalsetruecanmodifyadditionalsettingstrue100002026-05-15T07:22:29.5469952templatetruecanmodifyauditsettingstruefalsetrueiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsefalsefalsefalsetrueisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsetruecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalseowningbusinessunitname2026-05-15T07:22:29.5469952truecanmodifyrequirementlevelsettingsNoneOwningBusinessUnitNameStringType5.0.0.0true0TextAuto160Textfalse03203c708216-9ffd-480b-a84b-78d6cd56a583Lookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse501900-01-01T00:00:004f1d9b1e-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the team who owns the template.10334f1d9b1e-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the team who owns the template.1033364cfbe8-ba39-43f1-9ea0-1fd0d8fe543atrueOwning Team1033364cfbe8-ba39-43f1-9ea0-1fd0d8fe543atrueOwning Team1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueowningteam1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneOwningTeamLookupType5.0.0.0trueNoneteamc8a1139a-b6d6-4f50-a136-d9fc8b0e460aLookupfalsefalsefalsefalsecanmodifyadditionalsettingsfalse121900-01-01T00:00:00421d9b1e-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the user who owns the template.1033421d9b1e-2341-db11-898a-0007e9e17ebdtrueUnique identifier of the user who owns the template.1033808bb9e1-4dcb-4652-a9b5-f4682127f409trueOwning User1033808bb9e1-4dcb-4652-a9b5-f4682127f409trueOwning User1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueowninguser1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneOwningUserLookupType5.0.0.0trueNonesystemuser281a44a6-e592-46e2-b88e-a51aa9fde9f6Memofalsefalsefalsefalsecanmodifyadditionalsettingsfalse141900-01-01T00:00:0008e8af0c-2341-db11-898a-0007e9e17ebdtrueXML data for the body of the email template.103308e8af0c-2341-db11-898a-0007e9e17ebdtrueXML data for the body of the email template.103307e8af0c-2341-db11-898a-0007e9e17ebdtruePresentation XML103307e8af0c-2341-db11-898a-0007e9e17ebdtruePresentation XML1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetruepresentationxml1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNonePresentationXmlMemoType5.0.0.0falseTextAreaAuto1073741823TextAreafalse6db9efc5-ca95-478e-af0a-c7f181917fe8Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse561900-01-01T00:00:002d6ad07a-1069-494b-b35b-8078bda15c1dtrueFor internal use only. Shows the number of times emails that use this template have received replies.10332d6ad07a-1069-494b-b35b-8078bda15c1dtrueFor internal use only. Shows the number of times emails that use this template have received replies.103367fa504d-a9b8-4019-8ca7-b7f09e0010c4trueReply Count103367fa504d-a9b8-4019-8ca7-b7f09e0010c4trueReply Count1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruereplycount1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneReplyCountIntegerType8.2.0.0false0None2147483647008ea17bab-e6b9-40a0-821b-3c163c8404c1Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse601900-01-01T00:00:001e62ae6e-4c6d-44e8-baf1-74cafbccac77trueShows the reply rate for this template. This is based on number of replies received on followed emails that use this template.10331e62ae6e-4c6d-44e8-baf1-74cafbccac77trueShows the reply rate for this template. This is based on number of replies received on followed emails that use this template.1033381d62de-55a0-4da0-89b9-983ce4e03bectrueReply Rate1033381d62de-55a0-4da0-89b9-983ce4e03bectrueReply Rate1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetruereplyrate1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneReplyRateIntegerType8.2.0.0false0None21474836470096523be8-ae07-43d0-96bd-e5616956e0aeMemofalsefalsefalsefalsecanmodifyadditionalsettingsfalse100012026-05-15T11:47:34.33300483e257413-2dfa-40af-8948-c11223b561a1trueSafe html of email template.10333e257413-2dfa-40af-8948-c11223b561a1trueSafe html of email template.103343de2f2a-81ae-4d36-bc25-4c3141f35f05trueSafe HTML of email template103343de2f2a-81ae-4d36-bc25-4c3141f35f05trueSafe HTML of email template1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruetruefalsetruetruetruesafehtml2026-05-15T11:47:34.3330048falsecanmodifyrequirementlevelsettingsNoneSafeHtmlMemoType9.0.0.0falseTextAreaAuto1073741823TextAreafalsedfe5b70f-2c12-46ff-9f54-4439b3c04494Uniqueidentifierfalsefalsefalsefalsecanmodifyadditionalsettingsfalse391900-01-01T00:00:00e493d368-c2bd-49b4-a770-821ec99623bftrueUnique identifier of the associated solution.1033e493d368-c2bd-49b4-a770-821ec99623bftrueUnique identifier of the associated solution.103386c4c5ca-344c-43d5-b0ae-2a886f0e4ba4trueSolution103386c4c5ca-344c-43d5-b0ae-2a886f0e4ba4trueSolution1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetruesolutionid1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredSolutionIdUniqueidentifierType5.0.0.0falsefd357f5c-54c2-4f64-92b2-c1729dd97fdfMemofalsefalsefalsefalsecanmodifyadditionalsettingsfalse21900-01-01T00:00:00d4cde1dc-2241-db11-898a-0007e9e17ebdtrueSubject associated with the email template.1033d4cde1dc-2241-db11-898a-0007e9e17ebdtrueSubject associated with the email template.1033d3cde1dc-2241-db11-898a-0007e9e17ebdtrueSubject1033d3cde1dc-2241-db11-898a-0007e9e17ebdtrueSubject1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetruesubject2026-05-15T11:47:34.8329984falsecanmodifyrequirementlevelsettingsApplicationRequiredSubjectMemoType5.0.0.0falseTextAuto5000Textfalsedb69d772-8a60-4718-89f6-32190d1919dfMemofalsefalsefalsefalsecanmodifyadditionalsettingsfalse301900-01-01T00:00:008454c2fa-2241-db11-898a-0007e9e17ebdtrueXML data for the subject of the email template.10338454c2fa-2241-db11-898a-0007e9e17ebdtrueXML data for the subject of the email template.10338354c2fa-2241-db11-898a-0007e9e17ebdtrueSubject XML10338354c2fa-2241-db11-898a-0007e9e17ebdtrueSubject XML1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruefalsefalsetruetruetruesubjectpresentationxml1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneSubjectPresentationXmlMemoType5.0.0.0falseTextAreaAuto1073741823TextAreafalsefbb526b1-60dc-4a81-93f0-0f528072c81dMemofalsefalsefalsefalsecanmodifyadditionalsettingsfalse100022026-05-15T11:47:34.3670016446c2253-8898-41c9-a66b-db8c7400a341trueSafe html of email template subject.1033446c2253-8898-41c9-a66b-db8c7400a341trueSafe html of email template subject.10332b4656e2-e1fa-4a54-be9c-5b1f69ed8e0ftrueSafe HTML of email template subject10332b4656e2-e1fa-4a54-be9c-5b1f69ed8e0ftrueSafe HTML of email template subject1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsetruetruefalsetruetruetruesubjectsafehtml2026-05-15T11:47:34.3670016falsecanmodifyrequirementlevelsettingsNoneSubjectSafeHtmlMemoType9.0.0.0falseTextAreaAuto1073741823TextAreafalseaa6fc6fa-e20a-4ba5-99aa-4eefcd922598Uniqueidentifierfalsefalsefalsefalsecanmodifyadditionalsettingsfalse401900-01-01T00:00:0067307349-acbd-4112-968f-b10e4aa08774trueFor internal use only.103367307349-acbd-4112-968f-b10e4aa08774trueFor internal use only.1033b4549769-e02d-489e-8ed9-6423165d0125trueSolution1033b4549769-e02d-489e-8ed9-6423165d0125trueSolution1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsefalsefalsefalsesupportingsolutionid1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneSupportingSolutionIdUniqueidentifierType5.0.0.0falsecf2042c2-fd1f-4932-9569-b18411a11cacUniqueidentifierfalsefalsefalsefalsecanmodifyadditionalsettingsfalse11900-01-01T00:00:000853c2fa-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the template.10330853c2fa-2241-db11-898a-0007e9e17ebdtrueUnique identifier of the template.10330753c2fa-2241-db11-898a-0007e9e17ebdtrueEmail Template10330753c2fa-2241-db11-898a-0007e9e17ebdtrueEmail Template1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsetruetruecanmodifyglobalfiltersettingsfalsetruetruefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsefalsetruefalsetruetemplateid1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredTemplateIdUniqueidentifierType5.0.0.0false16355f79-7183-4f85-a905-d60e25b6cd5dUniqueidentifierfalsefalsefalsefalsecanmodifyadditionalsettingsfalse411900-01-01T00:00:00af5cf60d-207a-4bcd-855b-488a84a47615trueFor internal use only.1033af5cf60d-207a-4bcd-855b-488a84a47615trueFor internal use only.1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetruetemplateidunique1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsSystemRequiredTemplateIdUniqueUniqueidentifierType5.0.0.0falsecd1d90b9-e1b8-49c8-b8f4-106ccdd88051EntityNamefalsefalsefalsefalsecanmodifyadditionalsettingsfalse81900-01-01T00:00:000754c2fa-2241-db11-898a-0007e9e17ebdtrueType of email template.10330754c2fa-2241-db11-898a-0007e9e17ebdtrueType of email template.10330654c2fa-2241-db11-898a-0007e9e17ebdtrueTemplate Type10330654c2fa-2241-db11-898a-0007e9e17ebdtrueTemplate Type1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsetruetruetruetruetemplatetypecode2026-05-15T11:47:34.4130048falsecanmodifyrequirementlevelsettingsSystemRequiredTemplateTypeCodeEntityNameType5.0.0.0false-12be068b7-04d3-45bf-b24b-f268fd56156d40d4c6e3-d814-46dd-b0de-89540069b604trueType of email template.103340d4c6e3-d814-46dd-b0de-89540069b604trueType of email template.10334439956c-fe1e-449e-8991-c14e012b4ca4trueTemplate Type10334439956c-fe1e-449e-8991-c14e012b4ca4trueTemplate Type1033falsefalseiscustomizabletruefalsetruetemplate_templatetypecodePicklist5.0.0.0falsetrue0f54c2fa-2241-db11-898a-0007e9e17ebdtrueAccount10330f54c2fa-2241-db11-898a-0007e9e17ebdtrueAccount1033account1falsetrue1154c2fa-2241-db11-898a-0007e9e17ebdtrueContact10331154c2fa-2241-db11-898a-0007e9e17ebdtrueContact1033contact2falsetrue2154c2fa-2241-db11-898a-0007e9e17ebdtrueSystem Job10332154c2fa-2241-db11-898a-0007e9e17ebdtrueSystem Job1033asyncoperation4700falsetrue0954c2fa-2241-db11-898a-0007e9e17ebdtrueUser10330954c2fa-2241-db11-898a-0007e9e17ebdtrueUser1033systemuser8true8daa3583-0741-40a1-ad16-15bcbe82db77templatetypecodeVirtualfalsefalsefalsefalsecanmodifyadditionalsettingsfalse291900-01-01T00:00:00templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsefalsetemplatetypecodename1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneTemplateTypeCodeNameVirtualType5.0.0.0truebac1c51a-8e29-45a3-8cea-e81c2368872fStringfalsefalsefalsefalsecanmodifyadditionalsettingsfalse101900-01-01T00:00:00e8d7a218-2341-db11-898a-0007e9e17ebdtrueTitle of the template.1033e8d7a218-2341-db11-898a-0007e9e17ebdtrueTitle of the template.1033e7d7a218-2341-db11-898a-0007e9e17ebdtrueTitle1033e7d7a218-2341-db11-898a-0007e9e17ebdtrueTitle1033templatetruecanmodifyauditsettingstruefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsetruefalseisrenameablefalsefalsetruetruefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruetruefalsetruetruetruetruetitle1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsApplicationRequiredTitleStringType5.0.0.0false0TextAuto200Textfalse04000787149a-40b4-45e9-ac33-cc59923cf027Integerfalsefalsefalsefalsecanmodifyadditionalsettingsfalse611900-01-01T00:00:0024d31f47-0d64-43dd-aa24-663d381ba775trueShows the number of sent emails that use this template.103324d31f47-0d64-43dd-aa24-663d381ba775trueShows the number of sent emails that use this template.1033b5b5aa19-6c36-4cd1-acad-383cc1923c9etrueSent email count1033b5b5aa19-6c36-4cd1-acad-383cc1923c9etrueSent email count1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizabletruefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameabletruefalsefalsefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingstruefalsefalsetruetruefalsetrueusedcount1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneUsedCountIntegerType8.2.0.0false0None2147483647000b00c500-0d91-4edf-a9a4-3817d43d86c5BigIntfalsefalsefalsefalsecanmodifyadditionalsettingsfalse181900-01-01T00:00:007996c2d8-ca66-441b-9583-42de92544e40trueVersion number of the template.10337996c2d8-ca66-441b-9583-42de92544e40trueVersion number of the template.1033eef1b083-63ef-4ae9-8850-ae64b729baeetrueVersion Number1033eef1b083-63ef-4ae9-8850-ae64b729baeetrueVersion Number1033templatefalsecanmodifyauditsettingsfalsefalsefalseiscustomizablefalsefalsefalsetruecanmodifyglobalfiltersettingsfalsetruefalsefalsefalseisrenameablefalsefalsetruefalsefalsetruecanmodifyissortablesettingsfalsefalsecanmodifysearchsettingsfalsefalsefalsefalsetruefalsetrueversionnumber1900-01-01T00:00:00falsecanmodifyrequirementlevelsettingsNoneVersionNumberBigIntType5.0.0.0false9223372036854775807-9223372036854775808falsefalsefalsefalsecanbeincustomentityassociationfalsefalsecanbeinmanytomanyfalsefalsecanbeprimaryentityinrelationshipfalsefalsecanberelatedentityinrelationshipfalsetruetruecanchangetrackingbeenabledtruefalsecancreateattributesfalsefalsecancreatechartsfalsefalsecancreateformsfalsefalsecancreateviewstruefalsecanenablesynctoexternalsearchindexfalsetruecanmodifyadditionalsettingstruetruefalseLocal1900-01-01T00:00:00false0ddd01b9-2241-db11-898a-0007e9e17ebdtrueTemplate for an email message that contains the standard attributes of an email message.10330ddd01b9-2241-db11-898a-0007e9e17ebdtrueTemplate for an email message that contains the standard attributes of an email message.10330fdd01b9-2241-db11-898a-0007e9e17ebdtrueEmail Templates10330fdd01b9-2241-db11-898a-0007e9e17ebdtrueEmail Templates10330edd01b9-2241-db11-898a-0007e9e17ebdtrueEmail Template10330edd01b9-2241-db11-898a-0007e9e17ebdtrueEmail Template1033falsefalsefalsefalsefalsefalsefalsefalsefalsetruecanmodifyauditsettingsfalsetruefalsefalsefalsecanmodifyconnectionsettingsfalsefalsefalseiscustomizabletruefalsefalsefalsecanmodifyduplicatedetectionsettingsfalsefalsefalsefalsefalsefalsefalsefalsefalsecanmodifymailmergesettingsfalsetruefalseismappablefalsefalsefalsefalsecanmodifymobileclientreadonlyfalsetruefalseisrenameabletruefalsefalsefalsetruefalsetruefalsecanmodifyqueuesettingsfalsefalsecanmodifymobilevisibilityfalsefalsecanmodifymobileclientvisibilitytruetemplate975c286e-54a5-430d-b05d-e2ed66804dfffalsefalseiscustomizablefalsetruetruesystem_user_email_templatesNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsesystemuseridsystemusersystem_user_email_templatesowningusertemplateowninguser072f8fb8b-5f25-4854-86eb-5100b27c4e26falsefalseiscustomizablefalsetruetruelk_templatebase_modifiedbyNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsesystemuseridsystemuserlk_templatebase_modifiedbymodifiedbytemplatemodifiedby0b6928293-c433-4da5-8f25-208338bcaac4falsefalseiscustomizablefalsetruetruelk_templatebase_createdbyNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsesystemuseridsystemuserlk_templatebase_createdbycreatedbytemplatecreatedby05a19faa3-db82-4f65-8511-c0cf68e351bafalsefalseiscustomizablefalsetruefalseowner_templatesNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeRestrictNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalseowneridownerowner_templatesowneridtemplateownerid0c25f5eaf-8f92-4ec9-8ed1-65f310fffdc2falsefalseiscustomizablefalsetruetruelk_templatebase_createdonbehalfbyNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsesystemuseridsystemuserlk_templatebase_createdonbehalfbycreatedonbehalfbytemplatecreatedonbehalfby0347d35b2-b0ff-45d0-a4f8-6e0687ee5b40falsefalseiscustomizablefalsetruetrueteam_email_templatesNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalseteamidteamteam_email_templatesowningteamtemplateowningteam066715cda-65c4-4c44-95f4-e68ecb284369falsefalseiscustomizablefalsetruetruelk_templatebase_modifiedonbehalfbyNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsesystemuseridsystemuserlk_templatebase_modifiedonbehalfbymodifiedonbehalfbytemplatemodifiedonbehalfby00eb5a9db-5350-f111-bec6-e4fb1ef8f465falsefalseiscustomizablefalsetruefalseImageDescriptor_TemplateNone6.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalseimagedescriptoridimagedescriptorImageDescriptor_Templateentityimageidtemplateentityimageid_imagedescriptor0bccaeff8-a650-4a59-9b5a-3ec33438b3cefalsefalseiscustomizablefalsetruefalsebusiness_unit_templatesNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsebusinessunitidbusinessunitbusiness_unit_templatesowningbusinessunittemplateowningbusinessunit02026-05-15T16:03:49.2099968201044042f12-485e-4e9a-aaff-588f692f186efalsefalseiscustomizablefalsetruetrueTemplate_AsyncOperationsNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateTemplate_AsyncOperationsregardingobjectidasyncoperationregardingobjectid_template010958037-4bc9-4153-85a7-8d3bdb661f6ffalsefalseiscustomizablefalsetruetrueTemplate_ProcessSessionsNone5.0.0.0OneToManyRelationshipUseCollectionNameDetails110truefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateTemplate_ProcessSessionsregardingobjectidprocesssessionregardingobjectid_template0a9835154-a72e-47f2-b9f9-d929fb0a00a0falsefalseiscustomizabletruetruetrueTemplate_SyncErrorsAppend8.1.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeCascadeCascadeCascadeCascadeCascadeCascadeNoCascadefalsefalsetemplateidtemplateTemplate_SyncErrorsregardingobjectidsyncerrorregardingobjectid_template_syncerror1dcda8e64-c0fe-4d2d-8a8a-e32d365fa90dfalsefalseiscustomizablefalsetruefalseTemplate_OrganizationNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeRemoveLinkNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateTemplate_Organizationacknowledgementtemplateidorganizationacknowledgementtemplateid09beff8aa-f008-4a46-8846-59649bbe5460falsefalseiscustomizablefalsetruefalseTemplate_BulkDeleteFailuresNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateTemplate_BulkDeleteFailuresregardingobjectidbulkdeletefailureregardingobjectid_template0760df4d9-e26a-4d72-a1f5-e8da979e61c6falsefalseiscustomizabletruetruetrueEmail_EmailTemplateParentChild8.2.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeRemoveLinkNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateEmail_EmailTemplatetemplateidemailtemplateid28ff49bdd-71a3-470b-a986-043cea152ceafalsefalseiscustomizablefalsetruetrueemailtemplate_convertruleAppend6.1.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeRestrictNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateemailtemplate_convertruleresponsetemplateidconvertruleresponsetemplateid14c37f9e8-f9b4-4c94-a4a1-8690ae249c69falsefalseiscustomizablefalsetruetruetemplate_activity_mime_attachmentsNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplatetemplate_activity_mime_attachmentsobjectidactivitymimeattachmentobjectid_template094b415f9-da73-4fee-b50a-c1035c08799ffalsefalseiscustomizablefalsetruefalseuserentityinstancedata_templateNone5.0.0.0OneToManyRelationshipDoNotDisplayDetailstruefalse00000000-0000-0000-0000-000000000000NoCascadeNoCascadeCascadeNoCascadeNoCascadeNoCascadeNoCascadeNoCascadefalsefalsetemplateidtemplateuserentityinstancedata_templateobjectiduserentityinstancedataobjectid_template08UserOwnedtemplateidtitletruetruefalsetruetruefalsefalseprvCreateEmailTemplate921dac3c-3dc0-4f66-83c1-f4e6ea427a45CreatetruetruefalsetruetruefalsefalseprvReadEmailTemplate6c619dca-e165-4baa-ba16-ef6f820a0e01ReadtruetruefalsetruetruefalsefalseprvWriteEmailTemplatef2cc25b1-bfcc-4f7c-a6c3-9a5fc386391aWritetruetruefalsetruetruefalsefalseprvDeleteEmailTemplateffe4299b-7978-4b50-a724-2317db0d3949DeletetruetruefalsetruetruefalsefalseprvAssignEmailTemplate17b31e5e-bc94-4967-b83f-c7049eb483daAssigntruetruefalsetruetruefalsefalseprvShareEmailTemplatedf6a99af-703c-47cb-80c6-74eb519ad453SharetruetruefalsetruetruefalsefalseprvAppendEmailTemplate57444774-b24c-4684-a514-dfcab252c331AppendtruetruefalsetruetruefalsefalseprvAppendToEmailTemplatec7057b81-25b8-4940-9ced-eed842b712a5AppendTofalsefalsefalsetruefalsefalsefalseprvCreateOrgEmailTemplates01750f14-3320-49cc-a7d1-52502cdcd16dNoneFilteredTemplateTemplatefalseStandardfalse5.0.0.0entityimagefalsecanchangehierarchicalrelationshipfalsefalseTemplatestruetemplates0templatesfalsetruecanmodifymobileclientofflinefalsefalsefalsefalsefalse \ No newline at end of file + + + + + + + + template + + b71c0a4c-b9b6-4e12-a02e-94feba67eade + + 0 + + + 79fce9cd-25b4-4d41-bf22-85670d2f70f2 + + + Memo + false + false + false + + false + canmodifyadditionalsettings + false + + 9 + 1900-01-01T00:00:00 + + + + + 1764cfee-2241-db11-898a-0007e9e17ebd + + true + Body text of the email template. + 1033 + + + + 1764cfee-2241-db11-898a-0007e9e17ebd + + true + Body text of the email template. + 1033 + + + + + + 1664cfee-2241-db11-898a-0007e9e17ebd + + true + Body + 1033 + + + + 1664cfee-2241-db11-898a-0007e9e17ebd + + true + Body + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + false + false + true + true + true + + body + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + Body + + + MemoType + + 5.0.0.0 + false + + + TextArea + Auto + 1073741823 + + TextArea + + false + + + eb40fb38-f56c-43a2-9e4f-08fc4ae1374c + + + Picklist + false + false + false + + false + canmodifyadditionalsettings + false + + 38 + 1900-01-01T00:00:00 + + + + + 4bc15966-4061-4f84-96a5-5323a385d5b2 + + true + For internal use only. + 1033 + + + + 4bc15966-4061-4f84-96a5-5323a385d5b2 + + true + For internal use only. + 1033 + + + + + + 91a2c350-e738-484c-90df-13d406b28602 + + true + Component State + 1033 + + + + 91a2c350-e738-484c-90df-13d406b28602 + + true + Component State + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + true + + componentstate + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + SystemRequired + + ComponentState + + + PicklistType + + 5.0.0.0 + false + 0 + + -1 + + faece09f-cefc-11de-8150-00155da18b00 + + + + + faece0a1-cefc-11de-8150-00155da18b00 + + true + The state of this component. + 1033 + + + + faece0a1-cefc-11de-8150-00155da18b00 + + true + The state of this component. + 1033 + + + + + + faece0a0-cefc-11de-8150-00155da18b00 + + true + Component State + 1033 + + + + faece0a0-cefc-11de-8150-00155da18b00 + + true + Component State + 1033 + + + + false + + false + iscustomizable + false + + true + true + componentstate + Picklist + 5.0.0.0 + + + + + + + + + + + false + true + + + + faece0a3-cefc-11de-8150-00155da18b00 + + true + Published + 1033 + + + + faece0a3-cefc-11de-8150-00155da18b00 + + true + Published + 1033 + + + + 0 + + + + + + + + + + + + false + true + + + + faece0a5-cefc-11de-8150-00155da18b00 + + true + Unpublished + 1033 + + + + faece0a5-cefc-11de-8150-00155da18b00 + + true + Unpublished + 1033 + + + + 1 + + + + + + + + + + + + false + true + + + + faece0a7-cefc-11de-8150-00155da18b00 + + true + Deleted + 1033 + + + + faece0a7-cefc-11de-8150-00155da18b00 + + true + Deleted + 1033 + + + + 2 + + + + + + + + + + + + false + true + + + + 1f83e0bb-cefd-11de-8150-00155da18b00 + + true + Deleted Unpublished + 1033 + + + + 1f83e0bb-cefd-11de-8150-00155da18b00 + + true + Deleted Unpublished + 1033 + + + + 3 + + + + + + + + 0 + + + + + 306d7cb9-fcd9-4d42-a400-2aa73bdea381 + + + Lookup + false + false + false + + false + canmodifyadditionalsettings + false + + 13 + 1900-01-01T00:00:00 + + + + + fae9af0c-2341-db11-898a-0007e9e17ebd + + true + Unique identifier of the user who created the email template. + 1033 + + + + fae9af0c-2341-db11-898a-0007e9e17ebd + + true + Unique identifier of the user who created the email template. + 1033 + + + + + + f9e9af0c-2341-db11-898a-0007e9e17ebd + + true + Created By + 1033 + + + + f9e9af0c-2341-db11-898a-0007e9e17ebd + + true + Created By + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + false + true + true + false + true + + createdby + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + CreatedBy + + + LookupType + + 5.0.0.0 + false + + + None + + systemuser + + + + d081bb4a-b92f-4790-9a1a-ef359a53b12b + + createdby + String + false + false + false + + false + canmodifyadditionalsettings + false + + 20 + 1900-01-01T00:00:00 + + + + + 641d9b1e-2341-db11-898a-0007e9e17ebd + + true + Name of the user who created the email template. + 1033 + + + + 641d9b1e-2341-db11-898a-0007e9e17ebd + + true + Name of the user who created the email template. + 1033 + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + createdbyname + 2026-05-15T07:09:51.84 + + false + canmodifyrequirementlevelsettings + None + + CreatedByName + + + StringType + + 5.0.0.0 + true + 0 + + Text + Auto + 100 + + + Text + + + false + 0 + 320 + + + cdc10493-8106-4e96-943e-63732f539bc6 + + createdby + String + false + false + false + + false + canmodifyadditionalsettings + false + + 35 + 1900-01-01T00:00:00 + + + + + 844f7b37-2341-db11-898a-0007e9e17ebd + + true + YomiName of the user who created the email template. + 1033 + + + + 844f7b37-2341-db11-898a-0007e9e17ebd + + true + YomiName of the user who created the email template. + 1033 + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + createdbyyominame + 2026-05-15T07:09:54.5900032 + + false + canmodifyrequirementlevelsettings + None + + CreatedByYomiName + + + StringType + + 5.0.0.0 + true + 0 + + Text + Auto + 100 + createdbyname + + Text + + + false + 0 + 320 + + + 52ae0715-5eb5-4f2d-a168-2c5662d7db58 + + + DateTime + false + false + false + + false + canmodifyadditionalsettings + false + + 15 + 1900-01-01T00:00:00 + + + + + e026e7d6-2241-db11-898a-0007e9e17ebd + + true + Date and time when the email template was created. + 1033 + + + + e026e7d6-2241-db11-898a-0007e9e17ebd + + true + Date and time when the email template was created. + 1033 + + + + + + df26e7d6-2241-db11-898a-0007e9e17ebd + + true + Created On + 1033 + + + + df26e7d6-2241-db11-898a-0007e9e17ebd + + true + Created On + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + false + true + true + false + true + + createdon + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + CreatedOn + + + DateTimeType + + 5.0.0.0 + false + 0 + + DateAndTime + Inactive + + 0 + + false + canmodifybehavior + false + + + UserLocal + + + + 5a0a7aed-dfa0-44bb-98a9-137892bd4b64 + + + Lookup + false + false + false + + false + canmodifyadditionalsettings + false + + 42 + 1900-01-01T00:00:00 + + + + + e5054e1c-47a1-49c9-ace2-f8fb0fd46082 + + true + Unique identifier of the delegate user who created the template. + 1033 + + + + e5054e1c-47a1-49c9-ace2-f8fb0fd46082 + + true + Unique identifier of the delegate user who created the template. + 1033 + + + + + + 9eb18cf1-f226-420c-b1aa-de8699755ad7 + + true + Created By (Delegate) + 1033 + + + + 9eb18cf1-f226-420c-b1aa-de8699755ad7 + + true + Created By (Delegate) + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + false + true + true + false + true + + createdonbehalfby + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + CreatedOnBehalfBy + + + LookupType + + 5.0.0.0 + false + + + None + + systemuser + + + + 0b21e731-bd3f-4b46-b06a-6a89451eb724 + + createdonbehalfby + String + false + false + false + + false + canmodifyadditionalsettings + false + + 44 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + createdonbehalfbyname + 2026-05-15T07:09:52.6200064 + + false + canmodifyrequirementlevelsettings + None + + CreatedOnBehalfByName + + + StringType + + 5.0.0.0 + true + 0 + + Text + Auto + 100 + + + Text + + + false + 0 + 320 + + + 013aa3f5-81ae-4be8-82b0-e0ec18bded64 + + createdonbehalfby + String + false + false + false + + false + canmodifyadditionalsettings + false + + 45 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + createdonbehalfbyyominame + 2026-05-15T07:09:54.5430016 + + false + canmodifyrequirementlevelsettings + None + + CreatedOnBehalfByYomiName + + + StringType + + 5.0.0.0 + true + 0 + + Text + Auto + 100 + createdonbehalfbyname + + Text + + + false + 0 + 320 + + + db3dce49-6363-4130-9617-4eaec35cf968 + + + Memo + false + false + false + + false + canmodifyadditionalsettings + false + + 11 + 1900-01-01T00:00:00 + + + + + f51dd7e8-2241-db11-898a-0007e9e17ebd + + true + Description of the email template. + 1033 + + + + f51dd7e8-2241-db11-898a-0007e9e17ebd + + true + Description of the email template. + 1033 + + + + + + f41dd7e8-2241-db11-898a-0007e9e17ebd + + true + Description + 1033 + + + + f41dd7e8-2241-db11-898a-0007e9e17ebd + + true + Description + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + true + false + false + true + true + true + + description + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + Description + + + MemoType + + 5.0.0.0 + false + + + Text + Auto + 2000 + + Text + + false + + + aecaf2b0-2d87-475a-b79f-780180a641a9 + + entityimageid + Virtual + false + false + false + + true + canmodifyadditionalsettings + false + + 10006 + 2026-05-15T11:47:35.0230016 + + + + + 9672d2e2-f6cd-4c69-95eb-59a7f6e4e545 + + false + Shows the default image for the record. + 1033 + + + + 9672d2e2-f6cd-4c69-95eb-59a7f6e4e545 + + false + Shows the default image for the record. + 1033 + + + + + + 29278ef8-c857-4d1a-bdd3-6aa424f3b46a + + false + Default Image + 1033 + + + + 29278ef8-c857-4d1a-bdd3-6aa424f3b46a + + false + Default Image + 1033 + + + template + + + + true + canmodifyauditsettings + false + + false + + true + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + false + false + false + + true + isrenameable + true + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + false + false + true + true + true + + entityimage + 2026-05-15T11:47:35.0230016 + + false + canmodifyrequirementlevelsettings + None + + EntityImage + + + ImageType + + 6.0.0.0 + true + + + false + true + 144 + 10240 + 144 + + + 0cf9348a-810c-4dda-8e8e-dd6370b7cc55 + + entityimageid + BigInt + false + false + false + + false + canmodifyadditionalsettings + false + + 10005 + 2026-05-15T11:47:35.0070016 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + true + + entityimage_timestamp + 2026-05-15T11:47:35.0070016 + + false + canmodifyrequirementlevelsettings + None + + EntityImage_Timestamp + + + BigIntType + + 6.0.0.0 + true + + + 9223372036854775807 + -9223372036854775808 + + + 73432d91-0418-4e0f-b5b6-1d6eb0902f7c + + entityimageid + String + false + false + false + + false + canmodifyadditionalsettings + false + + 10004 + 2026-05-15T11:47:34.9769984 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + true + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + true + + entityimage_url + 2026-05-15T11:47:34.9769984 + + false + canmodifyrequirementlevelsettings + None + + EntityImage_URL + + + StringType + + 6.0.0.0 + true + 0 + + Url + Disabled + 200 + + + Url + + + false + 0 + 400 + + + ff9785d6-38f2-44e6-879c-268e576307c7 + + + Uniqueidentifier + false + false + false + + false + canmodifyadditionalsettings + false + + 10003 + 2026-05-15T11:47:34.96 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + true + + entityimageid + 2026-05-15T11:47:34.96 + + false + canmodifyrequirementlevelsettings + None + + EntityImageId + + + UniqueidentifierType + + 6.0.0.0 + false + + + + + 66579e47-a3d5-46ff-837a-42eb6ada5a93 + + + Integer + false + false + false + + false + canmodifyadditionalsettings + false + + 31 + 1900-01-01T00:00:00 + + + + + b051c19b-998c-4a98-a376-68ed18cd3cd2 + + true + For internal use only. + 1033 + + + + b051c19b-998c-4a98-a376-68ed18cd3cd2 + + true + For internal use only. + 1033 + + + + + + e64bf18c-0efa-4699-84fb-0fc5b604b5b9 + + true + Generation Type Code + 1033 + + + + e64bf18c-0efa-4699-84fb-0fc5b604b5b9 + + true + Generation Type Code + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + false + false + true + false + true + + generationtypecode + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + GenerationTypeCode + + + IntegerType + + 5.0.0.0 + false + 0 + + None + 2147483647 + 0 + + 0 + + + 18460bd9-edf0-4569-afda-295beb33c54c + + + Integer + false + false + false + + false + canmodifyadditionalsettings + false + + 33 + 1900-01-01T00:00:00 + + + + + 8fcc9305-da95-40e1-b2c7-bee1c744f5e9 + + true + Unique identifier of the data import or data migration that created this record. + 1033 + + + + 8fcc9305-da95-40e1-b2c7-bee1c744f5e9 + + true + Unique identifier of the data import or data migration that created this record. + 1033 + + + + + + 2a4e2f19-926c-4fa9-9c54-5a88b05d8fcf + + true + Import Sequence Number + 1033 + + + + 2a4e2f19-926c-4fa9-9c54-5a88b05d8fcf + + true + Import Sequence Number + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + true + false + false + true + false + true + + importsequencenumber + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + ImportSequenceNumber + + + IntegerType + + 5.0.0.0 + false + 0 + + None + 2147483647 + -2147483648 + + 0 + + + 2edff88a-365e-4356-b2e8-43f357726d8c + + + String + false + false + false + + false + canmodifyadditionalsettings + false + + 54 + 1900-01-01T00:00:00 + + + + + 309a3bef-56fb-439a-89d8-629e356a1ce7 + + true + Version in which the form is introduced. + 1033 + + + + 309a3bef-56fb-439a-89d8-629e356a1ce7 + + true + Version in which the form is introduced. + 1033 + + + + + + 8f611973-b29a-4e31-92a2-11c7490d3b17 + + true + Introduced Version + 1033 + + + + 8f611973-b29a-4e31-92a2-11c7490d3b17 + + true + Introduced Version + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + false + false + true + false + true + + introducedversion + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + IntroducedVersion + + + StringType + + 6.0.0.0 + false + 0 + + VersionNumber + Auto + 48 + + + VersionNumber + + + false + 0 + 96 + + + 370865d2-b62f-4154-a5a1-4e0d6c8f7ff8 + + + ManagedProperty + false + false + false + + false + canmodifyadditionalsettings + false + + 52 + 1900-01-01T00:00:00 + + + + + 4c46c780-c44a-4fbe-852e-74b361f7ecd7 + + true + Information that specifies whether this component can be customized. + 1033 + + + + 4c46c780-c44a-4fbe-852e-74b361f7ecd7 + + true + Information that specifies whether this component can be customized. + 1033 + + + + + + bc14ca4b-8d45-44a7-8c7d-5e11d10d8fb3 + + true + Customizable + 1033 + + + + bc14ca4b-8d45-44a7-8c7d-5e11d10d8fb3 + + true + Customizable + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + false + false + true + true + true + + iscustomizable + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + SystemRequired + + IsCustomizable + + + ManagedPropertyType + + 5.0.0.0 + false + + + iscustomizableanddeletable + + 0 + Boolean + + + 9388702d-5f84-4cd5-8f00-b399429a15f7 + + + Boolean + false + false + false + + false + canmodifyadditionalsettings + false + + 51 + 1900-01-01T00:00:00 + + + + + 3cd2b49b-1704-4d71-8da2-4d3620ca3250 + + true + Indicates whether the solution component is part of a managed solution. + 1033 + + + + 3cd2b49b-1704-4d71-8da2-4d3620ca3250 + + true + Indicates whether the solution component is part of a managed solution. + 1033 + + + + + + 2a19ef4d-5a11-4749-9386-8f281126a77d + + true + Is Managed + 1033 + + + + 2a19ef4d-5a11-4749-9386-8f281126a77d + + true + Is Managed + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + true + + ismanaged + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + SystemRequired + + IsManaged + + + BooleanType + + 5.0.0.0 + false + 0 + + false + + 9d04e035-5408-4c1d-a5aa-20445a02f691 + + + + + b41954a2-f3a5-47e9-ae13-ceb49de4465b + + true + Information about whether the current component is managed. + 1033 + + + + b41954a2-f3a5-47e9-ae13-ceb49de4465b + + true + Information about whether the current component is managed. + 1033 + + + + + + 45a188b1-91a8-4019-b582-cebda8081064 + + true + Is Component Managed + 1033 + + + + 45a188b1-91a8-4019-b582-cebda8081064 + + true + Is Component Managed + 1033 + + + + false + + false + iscustomizable + false + + true + true + ismanaged + Boolean + 5.0.0.0 + + + + + + + + + + false + true + + + + 443c7078-b7cb-47e7-8547-08dfa82950d0 + + true + Unmanaged + 1033 + + + + 443c7078-b7cb-47e7-8547-08dfa82950d0 + + true + Unmanaged + 1033 + + + + 0 + + + + + + + + + + + + false + true + + + + ec886b5b-7e97-4c62-b30c-bf295639d540 + + true + Managed + 1033 + + + + ec886b5b-7e97-4c62-b30c-bf295639d540 + + true + Managed + 1033 + + + + 1 + + + + + 0 + + + 8748c5d2-3c6f-46e1-bc9b-e422580e9222 + + ismanaged + Virtual + false + false + false + + false + canmodifyadditionalsettings + false + + 53 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + ismanagedname + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + IsManagedName + + + VirtualType + + 5.0.0.0 + true + + + + + bd6cc13d-c4f6-4d08-b344-eff79adce1b7 + + + Boolean + false + false + false + + false + canmodifyadditionalsettings + false + + 4 + 1900-01-01T00:00:00 + + + + + becde1dc-2241-db11-898a-0007e9e17ebd + + true + Information about whether the template is personal or is available to all users. + 1033 + + + + becde1dc-2241-db11-898a-0007e9e17ebd + + true + Information about whether the template is personal or is available to all users. + 1033 + + + + + + bdcde1dc-2241-db11-898a-0007e9e17ebd + + true + Viewable By + 1033 + + + + bdcde1dc-2241-db11-898a-0007e9e17ebd + + true + Viewable By + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + true + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + true + false + true + true + true + true + + ispersonal + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + IsPersonal + + + BooleanType + + 5.0.0.0 + false + 0 + + true + + 692312cf-56a6-4e49-b23e-9102ff0f67ca + + + + + 2c800910-9d68-43da-a9be-89be5d0e076c + + true + Information about whether the template is personal or is available to all users. + 1033 + + + + 2c800910-9d68-43da-a9be-89be5d0e076c + + true + Information about whether the template is personal or is available to all users. + 1033 + + + + + + e1f336db-1848-48b0-8f61-7cad82130b34 + + true + Viewable By + 1033 + + + + e1f336db-1848-48b0-8f61-7cad82130b34 + + true + Viewable By + 1033 + + + + false + + false + iscustomizable + true + + false + true + template_ispersonal + Boolean + 5.0.0.0 + + + + + + + + + + false + true + + + + c0cde1dc-2241-db11-898a-0007e9e17ebd + + true + Organization + 1033 + + + + c0cde1dc-2241-db11-898a-0007e9e17ebd + + true + Organization + 1033 + + + + 0 + + + + + + + + + + + + false + true + + + + c2cde1dc-2241-db11-898a-0007e9e17ebd + + true + Individual + 1033 + + + + c2cde1dc-2241-db11-898a-0007e9e17ebd + + true + Individual + 1033 + + + + 1 + + + + + 0 + + + 0402f0d0-9dba-4af5-9587-9b7804f24285 + + ispersonal + Virtual + false + false + false + + false + canmodifyadditionalsettings + false + + 28 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + ispersonalname + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + IsPersonalName + + + VirtualType + + 5.0.0.0 + true + + + + + ce62e4df-044d-4caf-afca-31a42b8eb898 + + + Boolean + false + false + false + + false + canmodifyadditionalsettings + true + + 57 + 1900-01-01T00:00:00 + + + + + 34af6216-41cf-4336-9a7e-264f8f75f285 + + true + Indicates if a template is recommended by Dynamics 365. + 1033 + + + + 34af6216-41cf-4336-9a7e-264f8f75f285 + + true + Indicates if a template is recommended by Dynamics 365. + 1033 + + + + + + 75fcdf03-cc45-4f96-85ca-5f5c06745165 + + true + Recommended + 1033 + + + + 75fcdf03-cc45-4f96-85ca-5f5c06745165 + + true + Recommended + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + true + + false + false + false + false + + true + canmodifyissortablesettings + false + + + true + canmodifysearchsettings + true + + false + true + true + true + false + true + + isrecommended + 1900-01-01T00:00:00 + + true + canmodifyrequirementlevelsettings + None + + IsRecommended + + + BooleanType + + 8.2.0.0 + false + 0 + + false + + 566c3f11-fd9e-4fe5-8535-f81d07cb0b9e + + + + + d2ec89bb-142c-4c03-bde1-8640bfa6c185 + + true + Shows if this template is recommended or not + 1033 + + + + d2ec89bb-142c-4c03-bde1-8640bfa6c185 + + true + Shows if this template is recommended or not + 1033 + + + + + + da2d5600-b73b-4bf4-96e3-1cffca697255 + + true + Recommended + 1033 + + + + da2d5600-b73b-4bf4-96e3-1cffca697255 + + true + Recommended + 1033 + + + + false + + false + iscustomizable + false + + false + true + template_isrecommended + Boolean + 8.2.0.0 + + + + + + + + + + false + true + + + + 09409285-2d68-49f1-959c-e2d873f07fda + + true + No + 1033 + + + + 09409285-2d68-49f1-959c-e2d873f07fda + + true + No + 1033 + + + + 0 + + + + + + + + + + + + false + true + + + + 1802c1b4-80f4-4408-a536-c08efb4baf0b + + true + Yes + 1033 + + + + 1802c1b4-80f4-4408-a536-c08efb4baf0b + + true + Yes + 1033 + + + + 1 + + + + + 0 + + + bda7101f-2d74-4bab-8201-650cca2e1bc3 + + isrecommended + Virtual + false + false + false + + false + canmodifyadditionalsettings + true + + 58 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + true + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + isrecommendedname + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + IsRecommendedName + + + VirtualType + + 8.2.0.0 + true + + + + + ba5e9a47-c78f-40b4-bc1b-1008326192a6 + + + Integer + false + false + false + + false + canmodifyadditionalsettings + false + + 32 + 1900-01-01T00:00:00 + + + + + b99b1dc7-8e1e-4e1e-9b30-fc9e89322679 + + true + Language of the email template. + 1033 + + + + b99b1dc7-8e1e-4e1e-9b30-fc9e89322679 + + true + Language of the email template. + 1033 + + + + + + ae90bff0-065c-41f9-bc67-f316d9702a19 + + true + Language + 1033 + + + + ae90bff0-065c-41f9-bc67-f316d9702a19 + + true + Language + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + true + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + true + true + true + true + true + true + + languagecode + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + ApplicationRequired + + LanguageCode + + + IntegerType + + 5.0.0.0 + false + 0 + + Language + 2147483647 + 0 + + 0 + + + 1e90a39b-bda4-4ad2-b708-74ebcbcae348 + + + String + false + false + false + + false + canmodifyadditionalsettings + false + + 7 + 1900-01-01T00:00:00 + + + + + 6740b506-2341-db11-898a-0007e9e17ebd + + true + MIME type of the email template. + 1033 + + + + 6740b506-2341-db11-898a-0007e9e17ebd + + true + MIME type of the email template. + 1033 + + + + + + 6640b506-2341-db11-898a-0007e9e17ebd + + true + Mime Type + 1033 + + + + 6640b506-2341-db11-898a-0007e9e17ebd + + true + Mime Type + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + false + false + true + true + true + + mimetype + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + MimeType + + + StringType + + 5.0.0.0 + false + 0 + + Text + Auto + 256 + + + Text + + + false + 0 + 512 + + + 53b62ff6-eb39-4c51-bc6c-63cff9bd3bb9 + + + Lookup + false + false + false + + false + canmodifyadditionalsettings + false + + 16 + 1900-01-01T00:00:00 + + + + + 9b64cfee-2241-db11-898a-0007e9e17ebd + + true + Unique identifier of the user who last modified the template. + 1033 + + + + 9b64cfee-2241-db11-898a-0007e9e17ebd + + true + Unique identifier of the user who last modified the template. + 1033 + + + + + + 9a64cfee-2241-db11-898a-0007e9e17ebd + + true + Modified By + 1033 + + + + 9a64cfee-2241-db11-898a-0007e9e17ebd + + true + Modified By + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + false + true + true + false + true + + modifiedby + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + ModifiedBy + + + LookupType + + 5.0.0.0 + false + + + None + + systemuser + + + + b58aae8b-25f3-4cf2-b724-1ee3e355949b + + modifiedby + String + false + false + false + + false + canmodifyadditionalsettings + false + + 22 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + modifiedbyname + 2026-05-15T07:09:53.3699968 + + false + canmodifyrequirementlevelsettings + None + + ModifiedByName + + + StringType + + 5.0.0.0 + true + 0 + + Text + Auto + 100 + + + Text + + + false + 0 + 320 + + + f4645b25-ef5a-44c9-a347-34c01a8ae477 + + modifiedby + String + false + false + false + + false + canmodifyadditionalsettings + false + + 34 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + modifiedbyyominame + 2026-05-15T07:09:54.8530048 + + false + canmodifyrequirementlevelsettings + None + + ModifiedByYomiName + + + StringType + + 5.0.0.0 + true + 0 + + Text + Auto + 100 + modifiedbyname + + Text + + + false + 0 + 320 + + + a51d5ce5-d73b-49ca-aeef-a0ee4536d2d2 + + + DateTime + false + false + false + + false + canmodifyadditionalsettings + false + + 17 + 1900-01-01T00:00:00 + + + + + 2640b506-2341-db11-898a-0007e9e17ebd + + true + Date and time when the email template was last modified. + 1033 + + + + 2640b506-2341-db11-898a-0007e9e17ebd + + true + Date and time when the email template was last modified. + 1033 + + + + + + 2540b506-2341-db11-898a-0007e9e17ebd + + true + Modified On + 1033 + + + + 2540b506-2341-db11-898a-0007e9e17ebd + + true + Modified On + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + false + true + true + false + true + + modifiedon + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + ModifiedOn + + + DateTimeType + + 5.0.0.0 + false + 0 + + DateAndTime + Inactive + + 0 + + false + canmodifybehavior + false + + + UserLocal + + + + 2650518e-c42e-46d7-93ab-e8b2d4d10878 + + + Lookup + false + false + false + + false + canmodifyadditionalsettings + false + + 46 + 1900-01-01T00:00:00 + + + + + 88b366f8-3717-4822-b29d-db05dd46efbc + + true + Unique identifier of the delegate user who last modified the template. + 1033 + + + + 88b366f8-3717-4822-b29d-db05dd46efbc + + true + Unique identifier of the delegate user who last modified the template. + 1033 + + + + + + 4a8a8e56-dbbd-4d19-88f0-eacd62cf24ce + + true + Modified By (Delegate) + 1033 + + + + 4a8a8e56-dbbd-4d19-88f0-eacd62cf24ce + + true + Modified By (Delegate) + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + false + true + true + false + true + + modifiedonbehalfby + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + ModifiedOnBehalfBy + + + LookupType + + 5.0.0.0 + false + + + None + + systemuser + + + + 5edeb9b9-5fa4-40d7-bcb6-840485702594 + + modifiedonbehalfby + String + false + false + false + + false + canmodifyadditionalsettings + false + + 48 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + modifiedonbehalfbyname + 2026-05-15T07:09:52.7129984 + + false + canmodifyrequirementlevelsettings + None + + ModifiedOnBehalfByName + + + StringType + + 5.0.0.0 + true + 0 + + Text + Auto + 100 + + + Text + + + false + 0 + 320 + + + fd623a4d-004c-4b78-82ea-a82aadb2aa65 + + modifiedonbehalfby + String + false + false + false + + false + canmodifyadditionalsettings + false + + 49 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + modifiedonbehalfbyyominame + 2026-05-15T07:09:54.7430016 + + false + canmodifyrequirementlevelsettings + None + + ModifiedOnBehalfByYomiName + + + StringType + + 5.0.0.0 + true + 0 + + Text + Auto + 100 + modifiedonbehalfbyname + + Text + + + false + 0 + 320 + + + 56b0f9b5-1482-46d8-9a80-72d55b7742e8 + + + Integer + false + false + false + + false + canmodifyadditionalsettings + false + + 55 + 1900-01-01T00:00:00 + + + + + 92b43f6b-b037-4db6-8157-02b6418be326 + + true + For internal use only. Shows the number of times emails that use this template have been opened. + 1033 + + + + 92b43f6b-b037-4db6-8157-02b6418be326 + + true + For internal use only. Shows the number of times emails that use this template have been opened. + 1033 + + + + + + ecb78564-c1e7-408e-be5b-a0b85703f13e + + true + Open Count + 1033 + + + + ecb78564-c1e7-408e-be5b-a0b85703f13e + + true + Open Count + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + true + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + false + true + true + false + true + + opencount + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + OpenCount + + + IntegerType + + 8.2.0.0 + false + 0 + + None + 2147483647 + 0 + + 0 + + + ea7970f2-1ac9-484a-b4d4-dced0a298f80 + + + Integer + false + false + false + + false + canmodifyadditionalsettings + false + + 59 + 1900-01-01T00:00:00 + + + + + 445517b3-d409-4788-9ed5-60af9d105428 + + true + Shows the open rate of this template. This is based on number of opens on followed emails that use this template. + 1033 + + + + 445517b3-d409-4788-9ed5-60af9d105428 + + true + Shows the open rate of this template. This is based on number of opens on followed emails that use this template. + 1033 + + + + + + 86347fa3-64ac-4629-945e-88bce8f6070c + + true + Open Rate + 1033 + + + + 86347fa3-64ac-4629-945e-88bce8f6070c + + true + Open Rate + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + true + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + true + true + true + false + true + + openrate + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + OpenRate + + + IntegerType + + 8.2.0.0 + false + 0 + + None + 2147483647 + 0 + + 0 + + + 3fe1ef40-198d-4f89-81e4-c12aa4ea0720 + + + DateTime + false + false + false + + false + canmodifyadditionalsettings + false + + 37 + 1900-01-01T00:00:00 + + + + + 7b59ff51-01c5-42cf-949c-6a41d36f4fad + + true + For internal use only. + 1033 + + + + 7b59ff51-01c5-42cf-949c-6a41d36f4fad + + true + For internal use only. + 1033 + + + + + + cf4c1a13-ad1d-4c46-8b38-592926acebf8 + + true + Record Overwrite Time + 1033 + + + + cf4c1a13-ad1d-4c46-8b38-592926acebf8 + + true + Record Overwrite Time + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + true + + overwritetime + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + SystemRequired + + OverwriteTime + + + DateTimeType + + 5.0.0.0 + false + 0 + + DateOnly + Inactive + + 0 + + false + canmodifybehavior + false + + + UserLocal + + + + 7aa12efe-ad5b-46dd-b155-750a5095564f + + + Owner + false + false + false + + false + canmodifyadditionalsettings + false + + 24 + 1900-01-01T00:00:00 + + + + + 4ed8dee2-2241-db11-898a-0007e9e17ebd + + true + Unique identifier of the user or team who owns the template for the email activity. + 1033 + + + + 4ed8dee2-2241-db11-898a-0007e9e17ebd + + true + Unique identifier of the user or team who owns the template for the email activity. + 1033 + + + + + + 4dd8dee2-2241-db11-898a-0007e9e17ebd + + true + Owner + 1033 + + + + 4dd8dee2-2241-db11-898a-0007e9e17ebd + + true + Owner + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + true + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + true + false + true + true + true + true + + ownerid + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + SystemRequired + + OwnerId + + + OwnerType + + 5.0.0.0 + false + + + None + + systemuser + team + + + + d9a30cad-6c8b-4dad-89f6-82ba310879a0 + + ownerid + String + false + false + false + + false + canmodifyadditionalsettings + false + + 25 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + owneridname + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + SystemRequired + + OwnerIdName + + + StringType + + 5.0.0.0 + true + 0 + + Text + Auto + 100 + + + Text + + + false + 0 + 320 + + + 1a7a02c6-64df-4cbd-88b3-9059ca3c65d1 + + ownerid + EntityName + false + false + false + + false + canmodifyadditionalsettings + false + + 27 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + false + false + true + true + false + + owneridtype + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + SystemRequired + + OwnerIdType + + + EntityNameType + + 5.0.0.0 + false + + + + + + true + + + 6e55575d-5e3d-4908-9270-cda6d57332d3 + + ownerid + String + false + false + false + + false + canmodifyadditionalsettings + false + + 36 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + owneridyominame + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + SystemRequired + + OwnerIdYomiName + + + StringType + + 5.0.0.0 + true + 0 + + Text + Auto + 100 + owneridname + + Text + + + false + 0 + 320 + + + 4f946828-9978-4ea4-a37f-46db1aaa772b + + + Lookup + false + false + false + + false + canmodifyadditionalsettings + false + + 3 + 1900-01-01T00:00:00 + + + + + f9e8af0c-2341-db11-898a-0007e9e17ebd + + true + Unique identifier of the business unit that owns the template. + 1033 + + + + f9e8af0c-2341-db11-898a-0007e9e17ebd + + true + Unique identifier of the business unit that owns the template. + 1033 + + + + + + f8e8af0c-2341-db11-898a-0007e9e17ebd + + true + Owning Business Unit + 1033 + + + + f8e8af0c-2341-db11-898a-0007e9e17ebd + + true + Owning Business Unit + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + true + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + true + true + true + false + true + + owningbusinessunit + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + OwningBusinessUnit + + + LookupType + + 5.0.0.0 + false + + + None + + businessunit + + + + 21ba76d9-58e4-4451-a17f-e808155eb9f4 + + owningbusinessunit + String + false + false + false + + true + canmodifyadditionalsettings + true + + 10000 + 2026-05-15T07:22:29.5469952 + + + + + + + + + + template + + + + true + canmodifyauditsettings + true + + false + + true + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + false + false + false + + true + isrenameable + true + + false + false + false + false + + true + canmodifyissortablesettings + false + + + true + canmodifysearchsettings + false + + false + false + false + true + false + false + + owningbusinessunitname + 2026-05-15T07:22:29.5469952 + + true + canmodifyrequirementlevelsettings + None + + OwningBusinessUnitName + + + StringType + + 5.0.0.0 + true + 0 + + Text + Auto + 160 + + + Text + + + false + 0 + 320 + + + 3c708216-9ffd-480b-a84b-78d6cd56a583 + + + Lookup + false + false + false + + false + canmodifyadditionalsettings + false + + 50 + 1900-01-01T00:00:00 + + + + + 4f1d9b1e-2341-db11-898a-0007e9e17ebd + + true + Unique identifier of the team who owns the template. + 1033 + + + + 4f1d9b1e-2341-db11-898a-0007e9e17ebd + + true + Unique identifier of the team who owns the template. + 1033 + + + + + + 364cfbe8-ba39-43f1-9ea0-1fd0d8fe543a + + true + Owning Team + 1033 + + + + 364cfbe8-ba39-43f1-9ea0-1fd0d8fe543a + + true + Owning Team + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + true + + owningteam + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + OwningTeam + + + LookupType + + 5.0.0.0 + true + + + None + + team + + + + c8a1139a-b6d6-4f50-a136-d9fc8b0e460a + + + Lookup + false + false + false + + false + canmodifyadditionalsettings + false + + 12 + 1900-01-01T00:00:00 + + + + + 421d9b1e-2341-db11-898a-0007e9e17ebd + + true + Unique identifier of the user who owns the template. + 1033 + + + + 421d9b1e-2341-db11-898a-0007e9e17ebd + + true + Unique identifier of the user who owns the template. + 1033 + + + + + + 808bb9e1-4dcb-4652-a9b5-f4682127f409 + + true + Owning User + 1033 + + + + 808bb9e1-4dcb-4652-a9b5-f4682127f409 + + true + Owning User + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + true + + owninguser + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + OwningUser + + + LookupType + + 5.0.0.0 + true + + + None + + systemuser + + + + 281a44a6-e592-46e2-b88e-a51aa9fde9f6 + + + Memo + false + false + false + + false + canmodifyadditionalsettings + false + + 14 + 1900-01-01T00:00:00 + + + + + 08e8af0c-2341-db11-898a-0007e9e17ebd + + true + XML data for the body of the email template. + 1033 + + + + 08e8af0c-2341-db11-898a-0007e9e17ebd + + true + XML data for the body of the email template. + 1033 + + + + + + 07e8af0c-2341-db11-898a-0007e9e17ebd + + true + Presentation XML + 1033 + + + + 07e8af0c-2341-db11-898a-0007e9e17ebd + + true + Presentation XML + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + false + false + true + true + true + + presentationxml + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + PresentationXml + + + MemoType + + 5.0.0.0 + false + + + TextArea + Auto + 1073741823 + + TextArea + + false + + + 6db9efc5-ca95-478e-af0a-c7f181917fe8 + + + Integer + false + false + false + + false + canmodifyadditionalsettings + false + + 56 + 1900-01-01T00:00:00 + + + + + 2d6ad07a-1069-494b-b35b-8078bda15c1d + + true + For internal use only. Shows the number of times emails that use this template have received replies. + 1033 + + + + 2d6ad07a-1069-494b-b35b-8078bda15c1d + + true + For internal use only. Shows the number of times emails that use this template have received replies. + 1033 + + + + + + 67fa504d-a9b8-4019-8ca7-b7f09e0010c4 + + true + Reply Count + 1033 + + + + 67fa504d-a9b8-4019-8ca7-b7f09e0010c4 + + true + Reply Count + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + true + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + false + true + true + false + true + + replycount + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + ReplyCount + + + IntegerType + + 8.2.0.0 + false + 0 + + None + 2147483647 + 0 + + 0 + + + 8ea17bab-e6b9-40a0-821b-3c163c8404c1 + + + Integer + false + false + false + + false + canmodifyadditionalsettings + false + + 60 + 1900-01-01T00:00:00 + + + + + 1e62ae6e-4c6d-44e8-baf1-74cafbccac77 + + true + Shows the reply rate for this template. This is based on number of replies received on followed emails that use this template. + 1033 + + + + 1e62ae6e-4c6d-44e8-baf1-74cafbccac77 + + true + Shows the reply rate for this template. This is based on number of replies received on followed emails that use this template. + 1033 + + + + + + 381d62de-55a0-4da0-89b9-983ce4e03bec + + true + Reply Rate + 1033 + + + + 381d62de-55a0-4da0-89b9-983ce4e03bec + + true + Reply Rate + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + true + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + false + true + true + false + true + + replyrate + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + ReplyRate + + + IntegerType + + 8.2.0.0 + false + 0 + + None + 2147483647 + 0 + + 0 + + + 96523be8-ae07-43d0-96bd-e5616956e0ae + + + Memo + false + false + false + + false + canmodifyadditionalsettings + false + + 10001 + 2026-05-15T11:47:34.3330048 + + + + + 3e257413-2dfa-40af-8948-c11223b561a1 + + true + Safe html of email template. + 1033 + + + + 3e257413-2dfa-40af-8948-c11223b561a1 + + true + Safe html of email template. + 1033 + + + + + + 43de2f2a-81ae-4d36-bc25-4c3141f35f05 + + true + Safe HTML of email template + 1033 + + + + 43de2f2a-81ae-4d36-bc25-4c3141f35f05 + + true + Safe HTML of email template + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + true + false + true + true + true + + safehtml + 2026-05-15T11:47:34.3330048 + + false + canmodifyrequirementlevelsettings + None + + SafeHtml + + + MemoType + + 9.0.0.0 + false + + + TextArea + Auto + 1073741823 + + TextArea + + false + + + dfe5b70f-2c12-46ff-9f54-4439b3c04494 + + + Uniqueidentifier + false + false + false + + false + canmodifyadditionalsettings + false + + 39 + 1900-01-01T00:00:00 + + + + + e493d368-c2bd-49b4-a770-821ec99623bf + + true + Unique identifier of the associated solution. + 1033 + + + + e493d368-c2bd-49b4-a770-821ec99623bf + + true + Unique identifier of the associated solution. + 1033 + + + + + + 86c4c5ca-344c-43d5-b0ae-2a886f0e4ba4 + + true + Solution + 1033 + + + + 86c4c5ca-344c-43d5-b0ae-2a886f0e4ba4 + + true + Solution + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + true + + solutionid + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + SystemRequired + + SolutionId + + + UniqueidentifierType + + 5.0.0.0 + false + + + + + fd357f5c-54c2-4f64-92b2-c1729dd97fdf + + + Memo + false + false + false + + false + canmodifyadditionalsettings + false + + 2 + 1900-01-01T00:00:00 + + + + + d4cde1dc-2241-db11-898a-0007e9e17ebd + + true + Subject associated with the email template. + 1033 + + + + d4cde1dc-2241-db11-898a-0007e9e17ebd + + true + Subject associated with the email template. + 1033 + + + + + + d3cde1dc-2241-db11-898a-0007e9e17ebd + + true + Subject + 1033 + + + + d3cde1dc-2241-db11-898a-0007e9e17ebd + + true + Subject + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + false + false + true + true + true + + subject + 2026-05-15T11:47:34.8329984 + + false + canmodifyrequirementlevelsettings + ApplicationRequired + + Subject + + + MemoType + + 5.0.0.0 + false + + + Text + Auto + 5000 + + Text + + false + + + db69d772-8a60-4718-89f6-32190d1919df + + + Memo + false + false + false + + false + canmodifyadditionalsettings + false + + 30 + 1900-01-01T00:00:00 + + + + + 8454c2fa-2241-db11-898a-0007e9e17ebd + + true + XML data for the subject of the email template. + 1033 + + + + 8454c2fa-2241-db11-898a-0007e9e17ebd + + true + XML data for the subject of the email template. + 1033 + + + + + + 8354c2fa-2241-db11-898a-0007e9e17ebd + + true + Subject XML + 1033 + + + + 8354c2fa-2241-db11-898a-0007e9e17ebd + + true + Subject XML + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + false + false + true + true + true + + subjectpresentationxml + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + SubjectPresentationXml + + + MemoType + + 5.0.0.0 + false + + + TextArea + Auto + 1073741823 + + TextArea + + false + + + fbb526b1-60dc-4a81-93f0-0f528072c81d + + + Memo + false + false + false + + false + canmodifyadditionalsettings + false + + 10002 + 2026-05-15T11:47:34.3670016 + + + + + 446c2253-8898-41c9-a66b-db8c7400a341 + + true + Safe html of email template subject. + 1033 + + + + 446c2253-8898-41c9-a66b-db8c7400a341 + + true + Safe html of email template subject. + 1033 + + + + + + 2b4656e2-e1fa-4a54-be9c-5b1f69ed8e0f + + true + Safe HTML of email template subject + 1033 + + + + 2b4656e2-e1fa-4a54-be9c-5b1f69ed8e0f + + true + Safe HTML of email template subject + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + true + true + false + true + true + true + + subjectsafehtml + 2026-05-15T11:47:34.3670016 + + false + canmodifyrequirementlevelsettings + None + + SubjectSafeHtml + + + MemoType + + 9.0.0.0 + false + + + TextArea + Auto + 1073741823 + + TextArea + + false + + + aa6fc6fa-e20a-4ba5-99aa-4eefcd922598 + + + Uniqueidentifier + false + false + false + + false + canmodifyadditionalsettings + false + + 40 + 1900-01-01T00:00:00 + + + + + 67307349-acbd-4112-968f-b10e4aa08774 + + true + For internal use only. + 1033 + + + + 67307349-acbd-4112-968f-b10e4aa08774 + + true + For internal use only. + 1033 + + + + + + b4549769-e02d-489e-8ed9-6423165d0125 + + true + Solution + 1033 + + + + b4549769-e02d-489e-8ed9-6423165d0125 + + true + Solution + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + false + false + false + + supportingsolutionid + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + SupportingSolutionId + + + UniqueidentifierType + + 5.0.0.0 + false + + + + + cf2042c2-fd1f-4932-9569-b18411a11cac + + + Uniqueidentifier + false + false + false + + false + canmodifyadditionalsettings + false + + 1 + 1900-01-01T00:00:00 + + + + + 0853c2fa-2241-db11-898a-0007e9e17ebd + + true + Unique identifier of the template. + 1033 + + + + 0853c2fa-2241-db11-898a-0007e9e17ebd + + true + Unique identifier of the template. + 1033 + + + + + + 0753c2fa-2241-db11-898a-0007e9e17ebd + + true + Email Template + 1033 + + + + 0753c2fa-2241-db11-898a-0007e9e17ebd + + true + Email Template + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + true + + true + canmodifyglobalfiltersettings + false + + true + true + false + + false + isrenameable + false + + false + true + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + true + false + false + true + false + true + + templateid + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + SystemRequired + + TemplateId + + + UniqueidentifierType + + 5.0.0.0 + false + + + + + 16355f79-7183-4f85-a905-d60e25b6cd5d + + + Uniqueidentifier + false + false + false + + false + canmodifyadditionalsettings + false + + 41 + 1900-01-01T00:00:00 + + + + + af5cf60d-207a-4bcd-855b-488a84a47615 + + true + For internal use only. + 1033 + + + + af5cf60d-207a-4bcd-855b-488a84a47615 + + true + For internal use only. + 1033 + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + true + + templateidunique + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + SystemRequired + + TemplateIdUnique + + + UniqueidentifierType + + 5.0.0.0 + false + + + + + cd1d90b9-e1b8-49c8-b8f4-106ccdd88051 + + + EntityName + false + false + false + + false + canmodifyadditionalsettings + false + + 8 + 1900-01-01T00:00:00 + + + + + 0754c2fa-2241-db11-898a-0007e9e17ebd + + true + Type of email template. + 1033 + + + + 0754c2fa-2241-db11-898a-0007e9e17ebd + + true + Type of email template. + 1033 + + + + + + 0654c2fa-2241-db11-898a-0007e9e17ebd + + true + Template Type + 1033 + + + + 0654c2fa-2241-db11-898a-0007e9e17ebd + + true + Template Type + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + true + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + true + false + true + true + true + true + + templatetypecode + 2026-05-15T11:47:34.4130048 + + false + canmodifyrequirementlevelsettings + SystemRequired + + TemplateTypeCode + + + EntityNameType + + 5.0.0.0 + false + + + -1 + + 2be068b7-04d3-45bf-b24b-f268fd56156d + + + + + 40d4c6e3-d814-46dd-b0de-89540069b604 + + true + Type of email template. + 1033 + + + + 40d4c6e3-d814-46dd-b0de-89540069b604 + + true + Type of email template. + 1033 + + + + + + 4439956c-fe1e-449e-8991-c14e012b4ca4 + + true + Template Type + 1033 + + + + 4439956c-fe1e-449e-8991-c14e012b4ca4 + + true + Template Type + 1033 + + + + false + + false + iscustomizable + true + + false + true + template_templatetypecode + Picklist + 5.0.0.0 + + + + + + + + + + + false + true + + + + 0f54c2fa-2241-db11-898a-0007e9e17ebd + + true + Account + 1033 + + + + 0f54c2fa-2241-db11-898a-0007e9e17ebd + + true + Account + 1033 + + + account + 1 + + + + + + + + + + + + false + true + + + + 1154c2fa-2241-db11-898a-0007e9e17ebd + + true + Contact + 1033 + + + + 1154c2fa-2241-db11-898a-0007e9e17ebd + + true + Contact + 1033 + + + contact + 2 + + + + + + + + + + + + false + true + + + + 2154c2fa-2241-db11-898a-0007e9e17ebd + + true + System Job + 1033 + + + + 2154c2fa-2241-db11-898a-0007e9e17ebd + + true + System Job + 1033 + + + asyncoperation + 4700 + + + + + + + + + + + + false + true + + + + 0954c2fa-2241-db11-898a-0007e9e17ebd + + true + User + 1033 + + + + 0954c2fa-2241-db11-898a-0007e9e17ebd + + true + User + 1033 + + + systemuser + 8 + + + + + + + true + + + 8daa3583-0741-40a1-ad16-15bcbe82db77 + + templatetypecode + Virtual + false + false + false + + false + canmodifyadditionalsettings + false + + 29 + 1900-01-01T00:00:00 + + + + + + + + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + false + + templatetypecodename + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + TemplateTypeCodeName + + + VirtualType + + 5.0.0.0 + true + + + + + bac1c51a-8e29-45a3-8cea-e81c2368872f + + + String + false + false + false + + false + canmodifyadditionalsettings + false + + 10 + 1900-01-01T00:00:00 + + + + + e8d7a218-2341-db11-898a-0007e9e17ebd + + true + Title of the template. + 1033 + + + + e8d7a218-2341-db11-898a-0007e9e17ebd + + true + Title of the template. + 1033 + + + + + + e7d7a218-2341-db11-898a-0007e9e17ebd + + true + Title + 1033 + + + + e7d7a218-2341-db11-898a-0007e9e17ebd + + true + Title + 1033 + + + template + + + + true + canmodifyauditsettings + true + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + true + + false + isrenameable + false + + false + true + true + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + true + false + true + true + true + true + + title + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + ApplicationRequired + + Title + + + StringType + + 5.0.0.0 + false + 0 + + Text + Auto + 200 + + + Text + + + false + 0 + 400 + + + 0787149a-40b4-45e9-ac33-cc59923cf027 + + + Integer + false + false + false + + false + canmodifyadditionalsettings + false + + 61 + 1900-01-01T00:00:00 + + + + + 24d31f47-0d64-43dd-aa24-663d381ba775 + + true + Shows the number of sent emails that use this template. + 1033 + + + + 24d31f47-0d64-43dd-aa24-663d381ba775 + + true + Shows the number of sent emails that use this template. + 1033 + + + + + + b5b5aa19-6c36-4cd1-acad-383cc1923c9e + + true + Sent email count + 1033 + + + + b5b5aa19-6c36-4cd1-acad-383cc1923c9e + + true + Sent email count + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + true + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + true + + false + false + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + true + + false + false + true + true + false + true + + usedcount + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + UsedCount + + + IntegerType + + 8.2.0.0 + false + 0 + + None + 2147483647 + 0 + + 0 + + + 0b00c500-0d91-4edf-a9a4-3817d43d86c5 + + + BigInt + false + false + false + + false + canmodifyadditionalsettings + false + + 18 + 1900-01-01T00:00:00 + + + + + 7996c2d8-ca66-441b-9583-42de92544e40 + + true + Version number of the template. + 1033 + + + + 7996c2d8-ca66-441b-9583-42de92544e40 + + true + Version number of the template. + 1033 + + + + + + eef1b083-63ef-4ae9-8850-ae64b729baee + + true + Version Number + 1033 + + + + eef1b083-63ef-4ae9-8850-ae64b729baee + + true + Version Number + 1033 + + + template + + + + false + canmodifyauditsettings + false + + false + + false + iscustomizable + false + + false + false + + true + canmodifyglobalfiltersettings + false + + true + false + false + + false + isrenameable + false + + false + true + false + false + + true + canmodifyissortablesettings + false + + + false + canmodifysearchsettings + false + + false + false + false + true + false + true + + versionnumber + 1900-01-01T00:00:00 + + false + canmodifyrequirementlevelsettings + None + + VersionNumber + + + BigIntType + + 5.0.0.0 + false + + + 9223372036854775807 + -9223372036854775808 + + + false + false + false + + false + canbeincustomentityassociation + false + + + false + canbeinmanytomany + false + + + false + canbeprimaryentityinrelationship + false + + + false + canberelatedentityinrelationship + false + + true + + true + canchangetrackingbeenabled + true + + + false + cancreateattributes + false + + + false + cancreatecharts + false + + + false + cancreateforms + false + + + false + cancreateviews + true + + + false + canenablesynctoexternalsearchindex + false + + + true + canmodifyadditionalsettings + true + + true + false + Local + 1900-01-01T00:00:00 + + + false + + + + 0ddd01b9-2241-db11-898a-0007e9e17ebd + + true + Template for an email message that contains the standard attributes of an email message. + 1033 + + + + 0ddd01b9-2241-db11-898a-0007e9e17ebd + + true + Template for an email message that contains the standard attributes of an email message. + 1033 + + + + + + 0fdd01b9-2241-db11-898a-0007e9e17ebd + + true + Email Templates + 1033 + + + + 0fdd01b9-2241-db11-898a-0007e9e17ebd + + true + Email Templates + 1033 + + + + + + 0edd01b9-2241-db11-898a-0007e9e17ebd + + true + Email Template + 1033 + + + + 0edd01b9-2241-db11-898a-0007e9e17ebd + + true + Email Template + 1033 + + + false + + false + false + false + false + + + + + false + false + false + false + + true + canmodifyauditsettings + false + + true + false + false + + false + canmodifyconnectionsettings + false + + false + + false + iscustomizable + true + + false + false + + false + canmodifyduplicatedetectionsettings + false + + false + false + false + false + false + false + false + + false + canmodifymailmergesettings + false + + true + + false + ismappable + false + + false + false + + false + canmodifymobileclientreadonly + false + + true + + false + isrenameable + true + + false + false + false + true + false + true + + false + canmodifyqueuesettings + false + + + false + canmodifymobilevisibility + false + + + false + canmodifymobileclientvisibility + true + + template + + + + 975c286e-54a5-430d-b05d-e2ed66804dff + + false + + false + iscustomizable + false + + true + true + system_user_email_templates + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + systemuserid + systemuser + system_user_email_templates + owninguser + template + owninguser + + 0 + + + 72f8fb8b-5f25-4854-86eb-5100b27c4e26 + + false + + false + iscustomizable + false + + true + true + lk_templatebase_modifiedby + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + systemuserid + systemuser + lk_templatebase_modifiedby + modifiedby + template + modifiedby + + 0 + + + b6928293-c433-4da5-8f25-208338bcaac4 + + false + + false + iscustomizable + false + + true + true + lk_templatebase_createdby + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + systemuserid + systemuser + lk_templatebase_createdby + createdby + template + createdby + + 0 + + + 5a19faa3-db82-4f65-8511-c0cf68e351ba + + false + + false + iscustomizable + false + + true + false + owner_templates + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + Restrict + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + ownerid + owner + owner_templates + ownerid + template + ownerid + + 0 + + + c25f5eaf-8f92-4ec9-8ed1-65f310fffdc2 + + false + + false + iscustomizable + false + + true + true + lk_templatebase_createdonbehalfby + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + systemuserid + systemuser + lk_templatebase_createdonbehalfby + createdonbehalfby + template + createdonbehalfby + + 0 + + + 347d35b2-b0ff-45d0-a4f8-6e0687ee5b40 + + false + + false + iscustomizable + false + + true + true + team_email_templates + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + teamid + team + team_email_templates + owningteam + template + owningteam + + 0 + + + 66715cda-65c4-4c44-95f4-e68ecb284369 + + false + + false + iscustomizable + false + + true + true + lk_templatebase_modifiedonbehalfby + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + systemuserid + systemuser + lk_templatebase_modifiedonbehalfby + modifiedonbehalfby + template + modifiedonbehalfby + + 0 + + + 0eb5a9db-5350-f111-bec6-e4fb1ef8f465 + + false + + false + iscustomizable + false + + true + false + ImageDescriptor_Template + None + 6.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + imagedescriptorid + imagedescriptor + ImageDescriptor_Template + entityimageid + template + entityimageid_imagedescriptor + + 0 + + + bccaeff8-a650-4a59-9b5a-3ec33438b3ce + + false + + false + iscustomizable + false + + true + false + business_unit_templates + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + businessunitid + businessunit + business_unit_templates + owningbusinessunit + template + owningbusinessunit + + 0 + + + 2026-05-15T16:03:49.2099968 + 2010 + + + 44042f12-485e-4e9a-aaff-588f692f186e + + false + + false + iscustomizable + false + + true + true + Template_AsyncOperations + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + templateid + template + Template_AsyncOperations + regardingobjectid + asyncoperation + regardingobjectid_template + + 0 + + + 10958037-4bc9-4153-85a7-8d3bdb661f6f + + false + + false + iscustomizable + false + + true + true + Template_ProcessSessions + None + 5.0.0.0 + OneToManyRelationship + + UseCollectionName + Details + + + + + 110 + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + templateid + template + Template_ProcessSessions + regardingobjectid + processsession + regardingobjectid_template + + 0 + + + a9835154-a72e-47f2-b9f9-d929fb0a00a0 + + false + + false + iscustomizable + true + + true + true + Template_SyncErrors + Append + 8.1.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + Cascade + Cascade + Cascade + Cascade + Cascade + Cascade + NoCascade + + + + + false + false + templateid + template + Template_SyncErrors + regardingobjectid + syncerror + regardingobjectid_template_syncerror + + 1 + + + dcda8e64-c0fe-4d2d-8a8a-e32d365fa90d + + false + + false + iscustomizable + false + + true + false + Template_Organization + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + RemoveLink + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + templateid + template + Template_Organization + acknowledgementtemplateid + organization + acknowledgementtemplateid + + 0 + + + 9beff8aa-f008-4a46-8846-59649bbe5460 + + false + + false + iscustomizable + false + + true + false + Template_BulkDeleteFailures + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + Cascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + templateid + template + Template_BulkDeleteFailures + regardingobjectid + bulkdeletefailure + regardingobjectid_template + + 0 + + + 760df4d9-e26a-4d72-a1f5-e8da979e61c6 + + false + + false + iscustomizable + true + + true + true + Email_EmailTemplate + ParentChild + 8.2.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + RemoveLink + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + templateid + template + Email_EmailTemplate + templateid + email + templateid + + 2 + + + 8ff49bdd-71a3-470b-a986-043cea152cea + + false + + false + iscustomizable + false + + true + true + emailtemplate_convertrule + Append + 6.1.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + Restrict + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + templateid + template + emailtemplate_convertrule + responsetemplateid + convertrule + responsetemplateid + + 1 + + + 4c37f9e8-f9b4-4c94-a4a1-8690ae249c69 + + false + + false + iscustomizable + false + + true + true + template_activity_mime_attachments + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + Cascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + templateid + template + template_activity_mime_attachments + objectid + activitymimeattachment + objectid_template + + 0 + + + 94b415f9-da73-4fee-b50a-c1035c08799f + + false + + false + iscustomizable + false + + true + false + userentityinstancedata_template + None + 5.0.0.0 + OneToManyRelationship + + DoNotDisplay + Details + + + + + + true + + false + + + 00000000-0000-0000-0000-000000000000 + + + NoCascade + NoCascade + Cascade + NoCascade + NoCascade + NoCascade + NoCascade + NoCascade + + + + + false + false + templateid + template + userentityinstancedata_template + objectid + userentityinstancedata + objectid_template + + 0 + + + + 8 + UserOwned + + templateid + + title + + + true + true + false + true + true + false + false + prvCreateEmailTemplate + 921dac3c-3dc0-4f66-83c1-f4e6ea427a45 + Create + + + true + true + false + true + true + false + false + prvReadEmailTemplate + 6c619dca-e165-4baa-ba16-ef6f820a0e01 + Read + + + true + true + false + true + true + false + false + prvWriteEmailTemplate + f2cc25b1-bfcc-4f7c-a6c3-9a5fc386391a + Write + + + true + true + false + true + true + false + false + prvDeleteEmailTemplate + ffe4299b-7978-4b50-a724-2317db0d3949 + Delete + + + true + true + false + true + true + false + false + prvAssignEmailTemplate + 17b31e5e-bc94-4967-b83f-c7049eb483da + Assign + + + true + true + false + true + true + false + false + prvShareEmailTemplate + df6a99af-703c-47cb-80c6-74eb519ad453 + Share + + + true + true + false + true + true + false + false + prvAppendEmailTemplate + 57444774-b24c-4684-a514-dfcab252c331 + Append + + + true + true + false + true + true + false + false + prvAppendToEmailTemplate + c7057b81-25b8-4940-9ced-eed842b712a5 + AppendTo + + + false + false + false + true + false + false + false + prvCreateOrgEmailTemplates + 01750f14-3320-49cc-a7d1-52502cdcd16d + None + + + + FilteredTemplate + Template + + + false + Standard + false + 5.0.0.0 + entityimage + + false + canchangehierarchicalrelationship + false + + + false + Templates + + + true + + templates + 0 + templates + false + + true + canmodifymobileclientoffline + false + + false + false + + false + false + + + + + + + \ No newline at end of file From 5f63a99ef82f7b3f2f90e46d27989ee4ecf2a71d Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Tue, 2 Jun 2026 15:43:35 +0200 Subject: [PATCH 06/14] Make SendEmailFromTemplate mirror Dataverse error behavior Throw FaultException when the template or regarding record does not exist and when the template type does not match the regarding object type, rather than silently sending unmerged mail. Existence and type validation are isolated in RetrieveOrThrow and ValidateTemplateType helpers so the core Execute flow stays a simple linear sequence. Add tests covering the template-not-found and type-mismatch paths. --- .../SendEmailFromTemplateRequestHandler.cs | 87 +++++++++--------- .../TestSendEmailFromTemplate.cs | 88 ++++++++++++++++--- 2 files changed, 121 insertions(+), 54 deletions(-) diff --git a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs index 4a195c66..e3e22a16 100644 --- a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs +++ b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs @@ -12,6 +12,31 @@ internal class SendEmailFromTemplateRequestHandler : RequestHandler { public SendEmailFromTemplateRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "SendEmailFromTemplate") { } + // Dataverse throws when a referenced record does not exist; mirror that rather than + // silently sending an empty/unmerged e-mail. + private Entity RetrieveOrThrow(EntityReference reference) + { + return db.GetEntityOrNull(reference) + ?? throw new FaultException($"{reference.LogicalName} With Id = {reference.Id} Does Not Exist"); + } + + // A template is bound to an entity type via templatetypecode (an object type code). + // Dataverse rejects a regarding record of a different type. + private void ValidateTemplateType(Entity template, string regardingType) + { + var templateTypeCode = (template.GetAttributeValue("templatetypecode"))?.Value + ?? template.GetAttributeValue("templatetypecode"); + metadata.EntityMetadata.TryGetValue(regardingType, out var regardingMetadata); + var regardingTypeCode = regardingMetadata?.ObjectTypeCode; + + if (templateTypeCode.HasValue && regardingTypeCode.HasValue && + templateTypeCode.Value != regardingTypeCode.Value) + { + throw new FaultException( + $"The template type does not match the regarding object type '{regardingType}'."); + } + } + internal override OrganizationResponse Execute(OrganizationRequest orgRequest, EntityReference userRef) { var request = MakeRequest(orgRequest); @@ -31,57 +56,33 @@ internal override OrganizationResponse Execute(OrganizationRequest orgRequest, E if (string.IsNullOrEmpty(request.RegardingType)) throw new FaultException("Regarding type should be set."); + var template = RetrieveOrThrow(new EntityReference("template", request.TemplateId)); + var regardingRef = new EntityReference(request.RegardingType, request.RegardingId); + var regarding = RetrieveOrThrow(regardingRef); + + ValidateTemplateType(template, request.RegardingType); + + // The template's subject/body are XSLT stylesheets rendered against the regarding + // record and the sending user. Verified against a live org: the merged values (and + // XSLT whitespace handling) match the platform. + var entities = new Dictionary { [request.RegardingType] = regarding }; + var sender = db.GetEntityOrNull(userRef); + if (sender != null) + entities[sender.LogicalName] = sender; + var email = request.Target; - email["regardingobjectid"] = new EntityReference(request.RegardingType, request.RegardingId); - - // Merge the template content into the e-mail, mirroring Dataverse: the template's - // subject/body are XSLT stylesheets rendered against the regarding record and the - // sending user. This is guarded on metadata because looking up an entity that was - // not generated throws - in that case the caller-supplied subject/body are used. - // - // Verified against a live org: the merged values (and XSLT whitespace handling) match - // the platform. Two cosmetic decorations the platform adds are intentionally NOT - // reproduced, as they are environment/version specific: it wraps the rendered body in - // an envelope, and appends an e-mail tracking token to the - // subject (e.g. "...with us CRM:0100002"). - if (metadata.EntityMetadata.ContainsKey("template")) - { - var template = db.GetEntityOrNull(new EntityReference("template", request.TemplateId)); - if (template != null) - { - var entities = new Dictionary(); - - var regarding = db.GetEntityOrNull(new EntityReference(request.RegardingType, request.RegardingId)); - if (regarding != null) - entities[request.RegardingType] = regarding; - - var sender = db.GetEntityOrNull(userRef); - if (sender != null) - entities[sender.LogicalName] = sender; - - var subject = EmailTemplateRenderer.Render(template.GetAttributeValue("subject"), entities); - if (!string.IsNullOrEmpty(subject)) - email["subject"] = subject; - - var body = EmailTemplateRenderer.Render(template.GetAttributeValue("body"), entities); - if (!string.IsNullOrEmpty(body)) - email["description"] = body; - } - } + email["regardingobjectid"] = regardingRef; + email["subject"] = EmailTemplateRenderer.Render(template.GetAttributeValue("subject"), entities); + email["description"] = EmailTemplateRenderer.Render(template.GetAttributeValue("body"), entities); // Delegate to the existing Create and SendEmail handlers so plugins, security // and status transitions are applied consistently. - var createResponse = (CreateResponse)core.Execute(new CreateRequest { Target = email }, userRef); - var emailId = createResponse.id; - + var emailId = ((CreateResponse)core.Execute(new CreateRequest { Target = email }, userRef)).id; core.Execute(new SendEmailRequest { EmailId = emailId, IssueSend = true }, userRef); return new SendEmailFromTemplateResponse { - Results = new ParameterCollection - { - { "Id", emailId } - } + Results = new ParameterCollection { { "Id", emailId } } }; } } diff --git a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs index d2e6d3c7..2737356e 100644 --- a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs +++ b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs @@ -1,6 +1,8 @@ using DG.XrmFramework.BusinessDomain.ServiceContext; using Microsoft.Crm.Sdk.Messages; using Microsoft.Xrm.Sdk; +using Microsoft.Xrm.Sdk.Messages; +using Microsoft.Xrm.Sdk.Metadata; using Microsoft.Xrm.Sdk.Query; using System; using System.Linq; @@ -29,6 +31,33 @@ private Email BuildEmail(Contact recipient) }; } + private int ObjectTypeCode(string logicalName) + { + var response = (RetrieveEntityResponse)orgAdminService.Execute(new RetrieveEntityRequest + { + LogicalName = logicalName, + EntityFilters = EntityFilters.Entity + }); + return response.EntityMetadata.ObjectTypeCode.Value; + } + + private Template CreateContactTemplate() + { + var template = new Template + { + Title = "Registration", + Subject = SubjectXslt, + Body = BodyXslt, + IsPersonal = false, + LanguageCode = 1033 + }; + // templatetypecode is an OptionSet-backed EntityName attribute, so XrmMockup stores it + // as the entity's integer object type code rather than the logical-name string. + template["templatetypecode"] = ObjectTypeCode(Contact.EntityLogicalName); + template.Id = orgAdminService.Create(template); + return template; + } + [Fact] public void TestSendEmailFromTemplateCreatesAndSendsEmail() { @@ -39,10 +68,12 @@ public void TestSendEmailFromTemplateCreatesAndSendsEmail() }; contact.Id = orgAdminUIService.Create(contact); + var template = CreateContactTemplate(); + var request = new SendEmailFromTemplateRequest { Target = BuildEmail(contact), - TemplateId = Guid.NewGuid(), + TemplateId = template.Id, RegardingId = contact.Id, RegardingType = Contact.EntityLogicalName }; @@ -78,16 +109,7 @@ public void TestSendEmailFromTemplateCreatesAndSendsEmail() [Fact] public void TestSendEmailFromTemplateRendersTemplateContent() { - var template = new Template - { - Title = "Registration", - TemplateTypeCode = "contact", - Subject = SubjectXslt, - Body = BodyXslt, - IsPersonal = false, - LanguageCode = 1033 - }; - template.Id = orgAdminService.Create(template); + var template = CreateContactTemplate(); var contact = new Contact { @@ -151,5 +173,49 @@ public void TestSendEmailFromTemplateThrowsWhenRegardingMissing() Assert.Throws(() => orgAdminUIService.Execute(request)); } + + [Fact] + public void TestSendEmailFromTemplateThrowsWhenTemplateDoesNotExist() + { + var contact = new Contact { FirstName = "Test", EMailAddress1 = "test@test.com" }; + contact.Id = orgAdminUIService.Create(contact); + + var request = new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = Guid.NewGuid(), + RegardingId = contact.Id, + RegardingType = Contact.EntityLogicalName + }; + + Assert.Throws(() => orgAdminUIService.Execute(request)); + } + + [Fact] + public void TestSendEmailFromTemplateThrowsWhenTemplateTypeMismatch() + { + var contact = new Contact { FirstName = "Test", EMailAddress1 = "test@test.com" }; + contact.Id = orgAdminUIService.Create(contact); + + // Template is bound to 'account' but the regarding record is a contact. + var template = new Template + { + Title = "Mismatch", + Subject = SubjectXslt, + Body = BodyXslt + }; + template["templatetypecode"] = ObjectTypeCode(Account.EntityLogicalName); + template.Id = orgAdminService.Create(template); + + var request = new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = template.Id, + RegardingId = contact.Id, + RegardingType = Contact.EntityLogicalName + }; + + Assert.Throws(() => orgAdminUIService.Execute(request)); + } } } From 3d752b8386e64f5f16f53df029639577c470c2f5 Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Tue, 2 Jun 2026 16:38:46 +0200 Subject: [PATCH 07/14] Add end-to-end tests for sender merge and plain-text templates --- .../TestSendEmailFromTemplate.cs | 73 ++++++++++++++++++- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs index 2737356e..12ca20bf 100644 --- a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs +++ b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs @@ -41,13 +41,15 @@ private int ObjectTypeCode(string logicalName) return response.EntityMetadata.ObjectTypeCode.Value; } - private Template CreateContactTemplate() + private Template CreateContactTemplate() => CreateContactTemplate(SubjectXslt, BodyXslt); + + private Template CreateContactTemplate(string subject, string body) { var template = new Template { Title = "Registration", - Subject = SubjectXslt, - Body = BodyXslt, + Subject = subject, + Body = body, IsPersonal = false, LanguageCode = 1033 }; @@ -143,6 +145,71 @@ public void TestSendEmailFromTemplateRendersTemplateContent() Assert.Equal(EmailState.Completed, email.StateCode); } + // A body stylesheet that merges a field from the sending systemuser rather than the + // regarding record. The handler adds the executing user to the render context. + private const string SenderBodyXslt = + "" + + "" + + ""; + + [Fact] + public void TestSendEmailFromTemplateMergesSenderFields() + { + // Give the user that orgAdminUIService runs as a known, mergeable value, then verify + // it flows through the sender side of the render context (not the regarding record). + orgAdminService.Update(new Entity("systemuser", crm.AdminUser.Id) { ["firstname"] = "Sender" }); + + var contact = new Contact { FirstName = "Test", EMailAddress1 = "sender@test.com" }; + contact.Id = orgAdminUIService.Create(contact); + + var template = CreateContactTemplate(SubjectXslt, SenderBodyXslt); + + var request = new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = template.Id, + RegardingId = contact.Id, + RegardingType = Contact.EntityLogicalName + }; + + var response = orgAdminUIService.Execute(request) as SendEmailFromTemplateResponse; + Assert.NotNull(response); + + var email = orgAdminService + .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("description")) + .ToEntity(); + + Assert.Equal("From: Sender", email.Description); + } + + [Fact] + public void TestSendEmailFromTemplateRendersPlainTextTemplate() + { + var contact = new Contact { FirstName = "Test", EMailAddress1 = "plain@test.com" }; + contact.Id = orgAdminUIService.Create(contact); + + // Not every template is an XSLT stylesheet; literal text must pass through unchanged. + var template = CreateContactTemplate("Plain subject", "Plain body text"); + + var request = new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = template.Id, + RegardingId = contact.Id, + RegardingType = Contact.EntityLogicalName + }; + + var response = orgAdminUIService.Execute(request) as SendEmailFromTemplateResponse; + Assert.NotNull(response); + + var email = orgAdminService + .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("subject", "description")) + .ToEntity(); + + Assert.Equal("Plain subject", email.Subject); + Assert.Equal("Plain body text", email.Description); + } + [Fact] public void TestSendEmailFromTemplateThrowsWhenTemplateIdMissing() { From 20dc80d73398e8cd7ca2b689b9309b523e852115 Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Wed, 2 Sep 2026 09:11:30 +0200 Subject: [PATCH 08/14] Drop template stopgaps now that the test context is generated The standalone Template.cs and TemplateMetadata.xml were placeholders for a regenerated early-bound context, which master now produces: `template` is in tests/appsettings.json for both the metadata and XrmContext pulls, so Metadata.xml carries the entity and Context/tables/Template.cs the early-bound type. Both stopgaps are removed. Adapt the tests to the current generator's naming (ActivityParty collections are `from`/`to`; state/status enums are `email_statecode` / `email_statuscode`), and add the RELEASE_NOTES entry. The handler and renderer are unchanged apart from a comment noting why templatetypecode is read as an integer: it is an EntityName attribute carrying an option set, which XrmMockup stores as the object type code rather than the logical name Dataverse exposes. --- RELEASE_NOTES.md | 3 + .../SendEmailFromTemplateRequestHandler.cs | 8 +- .../TestPluginAssembly365/Context/Template.cs | 537 - .../Metadata/TemplateMetadata.xml | 9074 ----------------- .../TestSendEmailFromTemplate.cs | 10 +- 5 files changed, 13 insertions(+), 9619 deletions(-) delete mode 100644 tests/TestPluginAssembly365/Context/Template.cs delete mode 100644 tests/XrmMockup365Test/Metadata/TemplateMetadata.xml diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index d8b7faeb..e5833547 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,6 @@ +### 1.20.2 - UNRELEASED +* Add: `SendEmailFromTemplate` request support. The e-mail is created from the template and then sent through the existing `Create` and `SendEmail` handlers, so security, plugins and status transitions behave like a normal send. Template subject/body are stored by Dataverse as XSLT stylesheets, so they are rendered against the regarding record and the sending user; plain-text templates pass through unchanged (#331) + ### 1.20.1 - 1 September 2026 * Fix: Match alternate keys by value, not reference (#350) diff --git a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs index e3e22a16..f629e777 100644 --- a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs +++ b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs @@ -20,11 +20,13 @@ private Entity RetrieveOrThrow(EntityReference reference) ?? throw new FaultException($"{reference.LogicalName} With Id = {reference.Id} Does Not Exist"); } - // A template is bound to an entity type via templatetypecode (an object type code). - // Dataverse rejects a regarding record of a different type. + // A template is bound to an entity type via templatetypecode; Dataverse rejects a + // regarding record of a different type. templatetypecode is an EntityName attribute + // carrying an option set, which XrmMockup stores as the integer object type code (see + // DbAttributeTypeMap) rather than the logical name Dataverse itself exposes. private void ValidateTemplateType(Entity template, string regardingType) { - var templateTypeCode = (template.GetAttributeValue("templatetypecode"))?.Value + var templateTypeCode = template.GetAttributeValue("templatetypecode")?.Value ?? template.GetAttributeValue("templatetypecode"); metadata.EntityMetadata.TryGetValue(regardingType, out var regardingMetadata); var regardingTypeCode = regardingMetadata?.ObjectTypeCode; diff --git a/tests/TestPluginAssembly365/Context/Template.cs b/tests/TestPluginAssembly365/Context/Template.cs deleted file mode 100644 index fc10599e..00000000 --- a/tests/TestPluginAssembly365/Context/Template.cs +++ /dev/null @@ -1,537 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by Delegate XrmContext v3.0.1. -// -// Generated from the live org https://orgd3a12bfa.crm4.dynamics.com scoped to the -// 'template' entity. The main XrmContext.cs is generated from a different reference org -// that does not contain 'template', so this type is generated separately and kept here. -// -// Adjusted to match the existing XrmContext.cs style (which predates v3): the cosmetic -// [DisplayName]/[MaxLength]/[Range] annotations and their System.ComponentModel* usings were -// removed (net462 does not reference DataAnnotations and the existing context omits them), -// and the unused standalone Template_TemplateTypeCode option-set enum was dropped because -// 'templatetypecode' is an EntityName (string). The attribute data is otherwise unchanged. -// The 'componentstate' enum referenced below is defined in XrmContext.cs. -// -//------------------------------------------------------------------------------ - -using DG.XrmContext; -using Microsoft.Xrm.Sdk; -using Microsoft.Xrm.Sdk.Client; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Linq.Expressions; -using System.Runtime.Serialization; - - -namespace DG.XrmFramework.BusinessDomain.ServiceContext { - - - /// - /// Template for an email message that contains the standard attributes of an email message. - /// Display Name: Email Template - /// - [EntityLogicalName("template")] - [DebuggerDisplay("{DebuggerDisplay,nq}")] - [DataContract()] - public partial class Template : ExtendedEntity { - - public const string EntityLogicalName = "template"; - - public const int EntityTypeCode = 2010; - - public Template() : - base(EntityLogicalName) { - } - - public Template(Guid Id) : - base(EntityLogicalName, Id) { - } - - private string DebuggerDisplay { - get { - return GetDebuggerDisplay("title"); - } - } - - [AttributeLogicalName("templateid")] - public override Guid Id { - get { - return base.Id; - } - set { - SetId("templateid", value); - } - } - - /// - /// Unique identifier of the template. - /// - [AttributeLogicalName("templateid")] - public Guid? TemplateId { - get { - return GetAttributeValue("templateid"); - } - set { - SetId("templateid", value); - } - } - - /// - /// Body text of the email template. - /// - [AttributeLogicalName("body")] - public string Body { - get { - return GetAttributeValue("body"); - } - set { - SetAttributeValue("body", value); - } - } - - /// - /// For internal use only. - /// - [AttributeLogicalName("componentstate")] - public componentstate? ComponentState { - get { - return GetOptionSetValue("componentstate"); - } - } - - /// - /// Unique identifier of the user who created the email template. - /// - [AttributeLogicalName("createdby")] - public EntityReference CreatedBy { - get { - return GetAttributeValue("createdby"); - } - } - - /// - /// Date and time when the email template was created. - /// - [AttributeLogicalName("createdon")] - public DateTime? CreatedOn { - get { - return GetAttributeValue("createdon"); - } - } - - /// - /// Unique identifier of the delegate user who created the template. - /// - [AttributeLogicalName("createdonbehalfby")] - public EntityReference CreatedOnBehalfBy { - get { - return GetAttributeValue("createdonbehalfby"); - } - } - - /// - /// Description of the email template. - /// - [AttributeLogicalName("description")] - public string Description { - get { - return GetAttributeValue("description"); - } - set { - SetAttributeValue("description", value); - } - } - - [AttributeLogicalName("entityimageid")] - public Guid? EntityImageId { - get { - return GetAttributeValue("entityimageid"); - } - } - - /// - /// For internal use only. - /// - [AttributeLogicalName("generationtypecode")] - public int? GenerationTypeCode { - get { - return GetAttributeValue("generationtypecode"); - } - set { - SetAttributeValue("generationtypecode", value); - } - } - - /// - /// Unique identifier of the data import or data migration that created this record. - /// - [AttributeLogicalName("importsequencenumber")] - public int? ImportSequenceNumber { - get { - return GetAttributeValue("importsequencenumber"); - } - set { - SetAttributeValue("importsequencenumber", value); - } - } - - /// - /// Version in which the form is introduced. - /// - [AttributeLogicalName("introducedversion")] - public string IntroducedVersion { - get { - return GetAttributeValue("introducedversion"); - } - set { - SetAttributeValue("introducedversion", value); - } - } - - /// - /// Information that specifies whether this component can be customized. - /// - [AttributeLogicalName("iscustomizable")] - public BooleanManagedProperty IsCustomizable { - get { - return GetAttributeValue("iscustomizable"); - } - set { - SetAttributeValue("iscustomizable", value); - } - } - - /// - /// Indicates whether the solution component is part of a managed solution. - /// - [AttributeLogicalName("ismanaged")] - public bool? IsManaged { - get { - return GetAttributeValue("ismanaged"); - } - } - - /// - /// Information about whether the template is personal or is available to all users. - /// - [AttributeLogicalName("ispersonal")] - public bool? IsPersonal { - get { - return GetAttributeValue("ispersonal"); - } - set { - SetAttributeValue("ispersonal", value); - } - } - - /// - /// Indicates if a template is recommended by Dynamics 365. - /// - [AttributeLogicalName("isrecommended")] - public bool? IsRecommended { - get { - return GetAttributeValue("isrecommended"); - } - } - - /// - /// Language of the email template. - /// - [AttributeLogicalName("languagecode")] - public int? LanguageCode { - get { - return GetAttributeValue("languagecode"); - } - set { - SetAttributeValue("languagecode", value); - } - } - - /// - /// MIME type of the email template. - /// - [AttributeLogicalName("mimetype")] - public string MimeType { - get { - return GetAttributeValue("mimetype"); - } - set { - SetAttributeValue("mimetype", value); - } - } - - /// - /// Unique identifier of the user who last modified the template. - /// - [AttributeLogicalName("modifiedby")] - public EntityReference ModifiedBy { - get { - return GetAttributeValue("modifiedby"); - } - } - - /// - /// Date and time when the email template was last modified. - /// - [AttributeLogicalName("modifiedon")] - public DateTime? ModifiedOn { - get { - return GetAttributeValue("modifiedon"); - } - } - - /// - /// Unique identifier of the delegate user who last modified the template. - /// - [AttributeLogicalName("modifiedonbehalfby")] - public EntityReference ModifiedOnBehalfBy { - get { - return GetAttributeValue("modifiedonbehalfby"); - } - } - - /// - /// For internal use only. Shows the number of times emails that use this template have been opened. - /// - [AttributeLogicalName("opencount")] - public int? OpenCount { - get { - return GetAttributeValue("opencount"); - } - } - - /// - /// Shows the open rate of this template. This is based on number of opens on followed emails that use this template. - /// - [AttributeLogicalName("openrate")] - public int? OpenRate { - get { - return GetAttributeValue("openrate"); - } - } - - /// - /// For internal use only. - /// - [AttributeLogicalName("overwritetime")] - public DateTime? OverwriteTime { - get { - return GetAttributeValue("overwritetime"); - } - } - - /// - /// Unique identifier of the user or team who owns the template for the email activity. - /// - [AttributeLogicalName("ownerid")] - public EntityReference OwnerId { - get { - return GetAttributeValue("ownerid"); - } - set { - SetAttributeValue("ownerid", value); - } - } - - /// - /// Unique identifier of the business unit that owns the template. - /// - [AttributeLogicalName("owningbusinessunit")] - public EntityReference OwningBusinessUnit { - get { - return GetAttributeValue("owningbusinessunit"); - } - } - - /// - /// Unique identifier of the team who owns the template. - /// - [AttributeLogicalName("owningteam")] - public EntityReference OwningTeam { - get { - return GetAttributeValue("owningteam"); - } - } - - /// - /// Unique identifier of the user who owns the template. - /// - [AttributeLogicalName("owninguser")] - public EntityReference OwningUser { - get { - return GetAttributeValue("owninguser"); - } - } - - /// - /// XML data for the body of the email template. - /// - [AttributeLogicalName("presentationxml")] - public string PresentationXml { - get { - return GetAttributeValue("presentationxml"); - } - set { - SetAttributeValue("presentationxml", value); - } - } - - /// - /// Title of the template. - /// - [AttributeLogicalName("title")] - public string PrimaryNameField { - get { - return GetAttributeValue("title"); - } - set { - SetAttributeValue("title", value); - } - } - - /// - /// For internal use only. Shows the number of times emails that use this template have received replies. - /// - [AttributeLogicalName("replycount")] - public int? ReplyCount { - get { - return GetAttributeValue("replycount"); - } - } - - /// - /// Shows the reply rate for this template. This is based on number of replies received on followed emails that use this template. - /// - [AttributeLogicalName("replyrate")] - public int? ReplyRate { - get { - return GetAttributeValue("replyrate"); - } - } - - /// - /// Safe html of email template. - /// - [AttributeLogicalName("safehtml")] - public string SafeHtml { - get { - return GetAttributeValue("safehtml"); - } - set { - SetAttributeValue("safehtml", value); - } - } - - /// - /// Unique identifier of the associated solution. - /// - [AttributeLogicalName("solutionid")] - public Guid? SolutionId { - get { - return GetAttributeValue("solutionid"); - } - } - - /// - /// Subject associated with the email template. - /// - [AttributeLogicalName("subject")] - public string Subject { - get { - return GetAttributeValue("subject"); - } - set { - SetAttributeValue("subject", value); - } - } - - /// - /// XML data for the subject of the email template. - /// - [AttributeLogicalName("subjectpresentationxml")] - public string SubjectPresentationXml { - get { - return GetAttributeValue("subjectpresentationxml"); - } - set { - SetAttributeValue("subjectpresentationxml", value); - } - } - - /// - /// Safe html of email template subject. - /// - [AttributeLogicalName("subjectsafehtml")] - public string SubjectSafeHtml { - get { - return GetAttributeValue("subjectsafehtml"); - } - set { - SetAttributeValue("subjectsafehtml", value); - } - } - - /// - /// For internal use only. - /// - [AttributeLogicalName("templateidunique")] - public Guid? TemplateIdUnique { - get { - return GetAttributeValue("templateidunique"); - } - } - - /// - /// Type of email template. - /// - [AttributeLogicalName("templatetypecode")] - public string TemplateTypeCode { - get { - return GetAttributeValue("templatetypecode"); - } - set { - SetAttributeValue("templatetypecode", value); - } - } - - /// - /// Title of the template. - /// - [AttributeLogicalName("title")] - public string Title { - get { - return GetAttributeValue("title"); - } - set { - SetAttributeValue("title", value); - } - } - - /// - /// Shows the number of sent emails that use this template. - /// - [AttributeLogicalName("usedcount")] - public int? UsedCount { - get { - return GetAttributeValue("usedcount"); - } - } - - /// - /// Version number of the template. - /// - [AttributeLogicalName("versionnumber")] - public long? VersionNumber { - get { - return GetAttributeValue("versionnumber"); - } - } - - public static Template Retrieve(IOrganizationService service, Guid id, params Expression>[] attrs) { - return service.Retrieve(id, attrs); - } - } -} diff --git a/tests/XrmMockup365Test/Metadata/TemplateMetadata.xml b/tests/XrmMockup365Test/Metadata/TemplateMetadata.xml deleted file mode 100644 index 328ade39..00000000 --- a/tests/XrmMockup365Test/Metadata/TemplateMetadata.xml +++ /dev/null @@ -1,9074 +0,0 @@ - - - - - - - - template - - b71c0a4c-b9b6-4e12-a02e-94feba67eade - - 0 - - - 79fce9cd-25b4-4d41-bf22-85670d2f70f2 - - - Memo - false - false - false - - false - canmodifyadditionalsettings - false - - 9 - 1900-01-01T00:00:00 - - - - - 1764cfee-2241-db11-898a-0007e9e17ebd - - true - Body text of the email template. - 1033 - - - - 1764cfee-2241-db11-898a-0007e9e17ebd - - true - Body text of the email template. - 1033 - - - - - - 1664cfee-2241-db11-898a-0007e9e17ebd - - true - Body - 1033 - - - - 1664cfee-2241-db11-898a-0007e9e17ebd - - true - Body - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - false - false - true - true - true - - body - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - Body - - - MemoType - - 5.0.0.0 - false - - - TextArea - Auto - 1073741823 - - TextArea - - false - - - eb40fb38-f56c-43a2-9e4f-08fc4ae1374c - - - Picklist - false - false - false - - false - canmodifyadditionalsettings - false - - 38 - 1900-01-01T00:00:00 - - - - - 4bc15966-4061-4f84-96a5-5323a385d5b2 - - true - For internal use only. - 1033 - - - - 4bc15966-4061-4f84-96a5-5323a385d5b2 - - true - For internal use only. - 1033 - - - - - - 91a2c350-e738-484c-90df-13d406b28602 - - true - Component State - 1033 - - - - 91a2c350-e738-484c-90df-13d406b28602 - - true - Component State - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - true - - componentstate - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - SystemRequired - - ComponentState - - - PicklistType - - 5.0.0.0 - false - 0 - - -1 - - faece09f-cefc-11de-8150-00155da18b00 - - - - - faece0a1-cefc-11de-8150-00155da18b00 - - true - The state of this component. - 1033 - - - - faece0a1-cefc-11de-8150-00155da18b00 - - true - The state of this component. - 1033 - - - - - - faece0a0-cefc-11de-8150-00155da18b00 - - true - Component State - 1033 - - - - faece0a0-cefc-11de-8150-00155da18b00 - - true - Component State - 1033 - - - - false - - false - iscustomizable - false - - true - true - componentstate - Picklist - 5.0.0.0 - - - - - - - - - - - false - true - - - - faece0a3-cefc-11de-8150-00155da18b00 - - true - Published - 1033 - - - - faece0a3-cefc-11de-8150-00155da18b00 - - true - Published - 1033 - - - - 0 - - - - - - - - - - - - false - true - - - - faece0a5-cefc-11de-8150-00155da18b00 - - true - Unpublished - 1033 - - - - faece0a5-cefc-11de-8150-00155da18b00 - - true - Unpublished - 1033 - - - - 1 - - - - - - - - - - - - false - true - - - - faece0a7-cefc-11de-8150-00155da18b00 - - true - Deleted - 1033 - - - - faece0a7-cefc-11de-8150-00155da18b00 - - true - Deleted - 1033 - - - - 2 - - - - - - - - - - - - false - true - - - - 1f83e0bb-cefd-11de-8150-00155da18b00 - - true - Deleted Unpublished - 1033 - - - - 1f83e0bb-cefd-11de-8150-00155da18b00 - - true - Deleted Unpublished - 1033 - - - - 3 - - - - - - - - 0 - - - - - 306d7cb9-fcd9-4d42-a400-2aa73bdea381 - - - Lookup - false - false - false - - false - canmodifyadditionalsettings - false - - 13 - 1900-01-01T00:00:00 - - - - - fae9af0c-2341-db11-898a-0007e9e17ebd - - true - Unique identifier of the user who created the email template. - 1033 - - - - fae9af0c-2341-db11-898a-0007e9e17ebd - - true - Unique identifier of the user who created the email template. - 1033 - - - - - - f9e9af0c-2341-db11-898a-0007e9e17ebd - - true - Created By - 1033 - - - - f9e9af0c-2341-db11-898a-0007e9e17ebd - - true - Created By - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - false - true - true - false - true - - createdby - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - CreatedBy - - - LookupType - - 5.0.0.0 - false - - - None - - systemuser - - - - d081bb4a-b92f-4790-9a1a-ef359a53b12b - - createdby - String - false - false - false - - false - canmodifyadditionalsettings - false - - 20 - 1900-01-01T00:00:00 - - - - - 641d9b1e-2341-db11-898a-0007e9e17ebd - - true - Name of the user who created the email template. - 1033 - - - - 641d9b1e-2341-db11-898a-0007e9e17ebd - - true - Name of the user who created the email template. - 1033 - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - createdbyname - 2026-05-15T07:09:51.84 - - false - canmodifyrequirementlevelsettings - None - - CreatedByName - - - StringType - - 5.0.0.0 - true - 0 - - Text - Auto - 100 - - - Text - - - false - 0 - 320 - - - cdc10493-8106-4e96-943e-63732f539bc6 - - createdby - String - false - false - false - - false - canmodifyadditionalsettings - false - - 35 - 1900-01-01T00:00:00 - - - - - 844f7b37-2341-db11-898a-0007e9e17ebd - - true - YomiName of the user who created the email template. - 1033 - - - - 844f7b37-2341-db11-898a-0007e9e17ebd - - true - YomiName of the user who created the email template. - 1033 - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - createdbyyominame - 2026-05-15T07:09:54.5900032 - - false - canmodifyrequirementlevelsettings - None - - CreatedByYomiName - - - StringType - - 5.0.0.0 - true - 0 - - Text - Auto - 100 - createdbyname - - Text - - - false - 0 - 320 - - - 52ae0715-5eb5-4f2d-a168-2c5662d7db58 - - - DateTime - false - false - false - - false - canmodifyadditionalsettings - false - - 15 - 1900-01-01T00:00:00 - - - - - e026e7d6-2241-db11-898a-0007e9e17ebd - - true - Date and time when the email template was created. - 1033 - - - - e026e7d6-2241-db11-898a-0007e9e17ebd - - true - Date and time when the email template was created. - 1033 - - - - - - df26e7d6-2241-db11-898a-0007e9e17ebd - - true - Created On - 1033 - - - - df26e7d6-2241-db11-898a-0007e9e17ebd - - true - Created On - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - false - true - true - false - true - - createdon - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - CreatedOn - - - DateTimeType - - 5.0.0.0 - false - 0 - - DateAndTime - Inactive - - 0 - - false - canmodifybehavior - false - - - UserLocal - - - - 5a0a7aed-dfa0-44bb-98a9-137892bd4b64 - - - Lookup - false - false - false - - false - canmodifyadditionalsettings - false - - 42 - 1900-01-01T00:00:00 - - - - - e5054e1c-47a1-49c9-ace2-f8fb0fd46082 - - true - Unique identifier of the delegate user who created the template. - 1033 - - - - e5054e1c-47a1-49c9-ace2-f8fb0fd46082 - - true - Unique identifier of the delegate user who created the template. - 1033 - - - - - - 9eb18cf1-f226-420c-b1aa-de8699755ad7 - - true - Created By (Delegate) - 1033 - - - - 9eb18cf1-f226-420c-b1aa-de8699755ad7 - - true - Created By (Delegate) - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - false - true - true - false - true - - createdonbehalfby - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - CreatedOnBehalfBy - - - LookupType - - 5.0.0.0 - false - - - None - - systemuser - - - - 0b21e731-bd3f-4b46-b06a-6a89451eb724 - - createdonbehalfby - String - false - false - false - - false - canmodifyadditionalsettings - false - - 44 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - createdonbehalfbyname - 2026-05-15T07:09:52.6200064 - - false - canmodifyrequirementlevelsettings - None - - CreatedOnBehalfByName - - - StringType - - 5.0.0.0 - true - 0 - - Text - Auto - 100 - - - Text - - - false - 0 - 320 - - - 013aa3f5-81ae-4be8-82b0-e0ec18bded64 - - createdonbehalfby - String - false - false - false - - false - canmodifyadditionalsettings - false - - 45 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - createdonbehalfbyyominame - 2026-05-15T07:09:54.5430016 - - false - canmodifyrequirementlevelsettings - None - - CreatedOnBehalfByYomiName - - - StringType - - 5.0.0.0 - true - 0 - - Text - Auto - 100 - createdonbehalfbyname - - Text - - - false - 0 - 320 - - - db3dce49-6363-4130-9617-4eaec35cf968 - - - Memo - false - false - false - - false - canmodifyadditionalsettings - false - - 11 - 1900-01-01T00:00:00 - - - - - f51dd7e8-2241-db11-898a-0007e9e17ebd - - true - Description of the email template. - 1033 - - - - f51dd7e8-2241-db11-898a-0007e9e17ebd - - true - Description of the email template. - 1033 - - - - - - f41dd7e8-2241-db11-898a-0007e9e17ebd - - true - Description - 1033 - - - - f41dd7e8-2241-db11-898a-0007e9e17ebd - - true - Description - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - true - false - false - true - true - true - - description - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - Description - - - MemoType - - 5.0.0.0 - false - - - Text - Auto - 2000 - - Text - - false - - - aecaf2b0-2d87-475a-b79f-780180a641a9 - - entityimageid - Virtual - false - false - false - - true - canmodifyadditionalsettings - false - - 10006 - 2026-05-15T11:47:35.0230016 - - - - - 9672d2e2-f6cd-4c69-95eb-59a7f6e4e545 - - false - Shows the default image for the record. - 1033 - - - - 9672d2e2-f6cd-4c69-95eb-59a7f6e4e545 - - false - Shows the default image for the record. - 1033 - - - - - - 29278ef8-c857-4d1a-bdd3-6aa424f3b46a - - false - Default Image - 1033 - - - - 29278ef8-c857-4d1a-bdd3-6aa424f3b46a - - false - Default Image - 1033 - - - template - - - - true - canmodifyauditsettings - false - - false - - true - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - false - false - false - - true - isrenameable - true - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - false - false - true - true - true - - entityimage - 2026-05-15T11:47:35.0230016 - - false - canmodifyrequirementlevelsettings - None - - EntityImage - - - ImageType - - 6.0.0.0 - true - - - false - true - 144 - 10240 - 144 - - - 0cf9348a-810c-4dda-8e8e-dd6370b7cc55 - - entityimageid - BigInt - false - false - false - - false - canmodifyadditionalsettings - false - - 10005 - 2026-05-15T11:47:35.0070016 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - true - - entityimage_timestamp - 2026-05-15T11:47:35.0070016 - - false - canmodifyrequirementlevelsettings - None - - EntityImage_Timestamp - - - BigIntType - - 6.0.0.0 - true - - - 9223372036854775807 - -9223372036854775808 - - - 73432d91-0418-4e0f-b5b6-1d6eb0902f7c - - entityimageid - String - false - false - false - - false - canmodifyadditionalsettings - false - - 10004 - 2026-05-15T11:47:34.9769984 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - true - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - true - - entityimage_url - 2026-05-15T11:47:34.9769984 - - false - canmodifyrequirementlevelsettings - None - - EntityImage_URL - - - StringType - - 6.0.0.0 - true - 0 - - Url - Disabled - 200 - - - Url - - - false - 0 - 400 - - - ff9785d6-38f2-44e6-879c-268e576307c7 - - - Uniqueidentifier - false - false - false - - false - canmodifyadditionalsettings - false - - 10003 - 2026-05-15T11:47:34.96 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - true - - entityimageid - 2026-05-15T11:47:34.96 - - false - canmodifyrequirementlevelsettings - None - - EntityImageId - - - UniqueidentifierType - - 6.0.0.0 - false - - - - - 66579e47-a3d5-46ff-837a-42eb6ada5a93 - - - Integer - false - false - false - - false - canmodifyadditionalsettings - false - - 31 - 1900-01-01T00:00:00 - - - - - b051c19b-998c-4a98-a376-68ed18cd3cd2 - - true - For internal use only. - 1033 - - - - b051c19b-998c-4a98-a376-68ed18cd3cd2 - - true - For internal use only. - 1033 - - - - - - e64bf18c-0efa-4699-84fb-0fc5b604b5b9 - - true - Generation Type Code - 1033 - - - - e64bf18c-0efa-4699-84fb-0fc5b604b5b9 - - true - Generation Type Code - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - false - false - true - false - true - - generationtypecode - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - GenerationTypeCode - - - IntegerType - - 5.0.0.0 - false - 0 - - None - 2147483647 - 0 - - 0 - - - 18460bd9-edf0-4569-afda-295beb33c54c - - - Integer - false - false - false - - false - canmodifyadditionalsettings - false - - 33 - 1900-01-01T00:00:00 - - - - - 8fcc9305-da95-40e1-b2c7-bee1c744f5e9 - - true - Unique identifier of the data import or data migration that created this record. - 1033 - - - - 8fcc9305-da95-40e1-b2c7-bee1c744f5e9 - - true - Unique identifier of the data import or data migration that created this record. - 1033 - - - - - - 2a4e2f19-926c-4fa9-9c54-5a88b05d8fcf - - true - Import Sequence Number - 1033 - - - - 2a4e2f19-926c-4fa9-9c54-5a88b05d8fcf - - true - Import Sequence Number - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - true - false - false - true - false - true - - importsequencenumber - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - ImportSequenceNumber - - - IntegerType - - 5.0.0.0 - false - 0 - - None - 2147483647 - -2147483648 - - 0 - - - 2edff88a-365e-4356-b2e8-43f357726d8c - - - String - false - false - false - - false - canmodifyadditionalsettings - false - - 54 - 1900-01-01T00:00:00 - - - - - 309a3bef-56fb-439a-89d8-629e356a1ce7 - - true - Version in which the form is introduced. - 1033 - - - - 309a3bef-56fb-439a-89d8-629e356a1ce7 - - true - Version in which the form is introduced. - 1033 - - - - - - 8f611973-b29a-4e31-92a2-11c7490d3b17 - - true - Introduced Version - 1033 - - - - 8f611973-b29a-4e31-92a2-11c7490d3b17 - - true - Introduced Version - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - false - false - true - false - true - - introducedversion - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - IntroducedVersion - - - StringType - - 6.0.0.0 - false - 0 - - VersionNumber - Auto - 48 - - - VersionNumber - - - false - 0 - 96 - - - 370865d2-b62f-4154-a5a1-4e0d6c8f7ff8 - - - ManagedProperty - false - false - false - - false - canmodifyadditionalsettings - false - - 52 - 1900-01-01T00:00:00 - - - - - 4c46c780-c44a-4fbe-852e-74b361f7ecd7 - - true - Information that specifies whether this component can be customized. - 1033 - - - - 4c46c780-c44a-4fbe-852e-74b361f7ecd7 - - true - Information that specifies whether this component can be customized. - 1033 - - - - - - bc14ca4b-8d45-44a7-8c7d-5e11d10d8fb3 - - true - Customizable - 1033 - - - - bc14ca4b-8d45-44a7-8c7d-5e11d10d8fb3 - - true - Customizable - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - false - false - true - true - true - - iscustomizable - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - SystemRequired - - IsCustomizable - - - ManagedPropertyType - - 5.0.0.0 - false - - - iscustomizableanddeletable - - 0 - Boolean - - - 9388702d-5f84-4cd5-8f00-b399429a15f7 - - - Boolean - false - false - false - - false - canmodifyadditionalsettings - false - - 51 - 1900-01-01T00:00:00 - - - - - 3cd2b49b-1704-4d71-8da2-4d3620ca3250 - - true - Indicates whether the solution component is part of a managed solution. - 1033 - - - - 3cd2b49b-1704-4d71-8da2-4d3620ca3250 - - true - Indicates whether the solution component is part of a managed solution. - 1033 - - - - - - 2a19ef4d-5a11-4749-9386-8f281126a77d - - true - Is Managed - 1033 - - - - 2a19ef4d-5a11-4749-9386-8f281126a77d - - true - Is Managed - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - true - - ismanaged - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - SystemRequired - - IsManaged - - - BooleanType - - 5.0.0.0 - false - 0 - - false - - 9d04e035-5408-4c1d-a5aa-20445a02f691 - - - - - b41954a2-f3a5-47e9-ae13-ceb49de4465b - - true - Information about whether the current component is managed. - 1033 - - - - b41954a2-f3a5-47e9-ae13-ceb49de4465b - - true - Information about whether the current component is managed. - 1033 - - - - - - 45a188b1-91a8-4019-b582-cebda8081064 - - true - Is Component Managed - 1033 - - - - 45a188b1-91a8-4019-b582-cebda8081064 - - true - Is Component Managed - 1033 - - - - false - - false - iscustomizable - false - - true - true - ismanaged - Boolean - 5.0.0.0 - - - - - - - - - - false - true - - - - 443c7078-b7cb-47e7-8547-08dfa82950d0 - - true - Unmanaged - 1033 - - - - 443c7078-b7cb-47e7-8547-08dfa82950d0 - - true - Unmanaged - 1033 - - - - 0 - - - - - - - - - - - - false - true - - - - ec886b5b-7e97-4c62-b30c-bf295639d540 - - true - Managed - 1033 - - - - ec886b5b-7e97-4c62-b30c-bf295639d540 - - true - Managed - 1033 - - - - 1 - - - - - 0 - - - 8748c5d2-3c6f-46e1-bc9b-e422580e9222 - - ismanaged - Virtual - false - false - false - - false - canmodifyadditionalsettings - false - - 53 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - ismanagedname - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - IsManagedName - - - VirtualType - - 5.0.0.0 - true - - - - - bd6cc13d-c4f6-4d08-b344-eff79adce1b7 - - - Boolean - false - false - false - - false - canmodifyadditionalsettings - false - - 4 - 1900-01-01T00:00:00 - - - - - becde1dc-2241-db11-898a-0007e9e17ebd - - true - Information about whether the template is personal or is available to all users. - 1033 - - - - becde1dc-2241-db11-898a-0007e9e17ebd - - true - Information about whether the template is personal or is available to all users. - 1033 - - - - - - bdcde1dc-2241-db11-898a-0007e9e17ebd - - true - Viewable By - 1033 - - - - bdcde1dc-2241-db11-898a-0007e9e17ebd - - true - Viewable By - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - true - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - true - false - true - true - true - true - - ispersonal - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - IsPersonal - - - BooleanType - - 5.0.0.0 - false - 0 - - true - - 692312cf-56a6-4e49-b23e-9102ff0f67ca - - - - - 2c800910-9d68-43da-a9be-89be5d0e076c - - true - Information about whether the template is personal or is available to all users. - 1033 - - - - 2c800910-9d68-43da-a9be-89be5d0e076c - - true - Information about whether the template is personal or is available to all users. - 1033 - - - - - - e1f336db-1848-48b0-8f61-7cad82130b34 - - true - Viewable By - 1033 - - - - e1f336db-1848-48b0-8f61-7cad82130b34 - - true - Viewable By - 1033 - - - - false - - false - iscustomizable - true - - false - true - template_ispersonal - Boolean - 5.0.0.0 - - - - - - - - - - false - true - - - - c0cde1dc-2241-db11-898a-0007e9e17ebd - - true - Organization - 1033 - - - - c0cde1dc-2241-db11-898a-0007e9e17ebd - - true - Organization - 1033 - - - - 0 - - - - - - - - - - - - false - true - - - - c2cde1dc-2241-db11-898a-0007e9e17ebd - - true - Individual - 1033 - - - - c2cde1dc-2241-db11-898a-0007e9e17ebd - - true - Individual - 1033 - - - - 1 - - - - - 0 - - - 0402f0d0-9dba-4af5-9587-9b7804f24285 - - ispersonal - Virtual - false - false - false - - false - canmodifyadditionalsettings - false - - 28 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - ispersonalname - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - IsPersonalName - - - VirtualType - - 5.0.0.0 - true - - - - - ce62e4df-044d-4caf-afca-31a42b8eb898 - - - Boolean - false - false - false - - false - canmodifyadditionalsettings - true - - 57 - 1900-01-01T00:00:00 - - - - - 34af6216-41cf-4336-9a7e-264f8f75f285 - - true - Indicates if a template is recommended by Dynamics 365. - 1033 - - - - 34af6216-41cf-4336-9a7e-264f8f75f285 - - true - Indicates if a template is recommended by Dynamics 365. - 1033 - - - - - - 75fcdf03-cc45-4f96-85ca-5f5c06745165 - - true - Recommended - 1033 - - - - 75fcdf03-cc45-4f96-85ca-5f5c06745165 - - true - Recommended - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - true - - false - false - false - false - - true - canmodifyissortablesettings - false - - - true - canmodifysearchsettings - true - - false - true - true - true - false - true - - isrecommended - 1900-01-01T00:00:00 - - true - canmodifyrequirementlevelsettings - None - - IsRecommended - - - BooleanType - - 8.2.0.0 - false - 0 - - false - - 566c3f11-fd9e-4fe5-8535-f81d07cb0b9e - - - - - d2ec89bb-142c-4c03-bde1-8640bfa6c185 - - true - Shows if this template is recommended or not - 1033 - - - - d2ec89bb-142c-4c03-bde1-8640bfa6c185 - - true - Shows if this template is recommended or not - 1033 - - - - - - da2d5600-b73b-4bf4-96e3-1cffca697255 - - true - Recommended - 1033 - - - - da2d5600-b73b-4bf4-96e3-1cffca697255 - - true - Recommended - 1033 - - - - false - - false - iscustomizable - false - - false - true - template_isrecommended - Boolean - 8.2.0.0 - - - - - - - - - - false - true - - - - 09409285-2d68-49f1-959c-e2d873f07fda - - true - No - 1033 - - - - 09409285-2d68-49f1-959c-e2d873f07fda - - true - No - 1033 - - - - 0 - - - - - - - - - - - - false - true - - - - 1802c1b4-80f4-4408-a536-c08efb4baf0b - - true - Yes - 1033 - - - - 1802c1b4-80f4-4408-a536-c08efb4baf0b - - true - Yes - 1033 - - - - 1 - - - - - 0 - - - bda7101f-2d74-4bab-8201-650cca2e1bc3 - - isrecommended - Virtual - false - false - false - - false - canmodifyadditionalsettings - true - - 58 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - true - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - isrecommendedname - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - IsRecommendedName - - - VirtualType - - 8.2.0.0 - true - - - - - ba5e9a47-c78f-40b4-bc1b-1008326192a6 - - - Integer - false - false - false - - false - canmodifyadditionalsettings - false - - 32 - 1900-01-01T00:00:00 - - - - - b99b1dc7-8e1e-4e1e-9b30-fc9e89322679 - - true - Language of the email template. - 1033 - - - - b99b1dc7-8e1e-4e1e-9b30-fc9e89322679 - - true - Language of the email template. - 1033 - - - - - - ae90bff0-065c-41f9-bc67-f316d9702a19 - - true - Language - 1033 - - - - ae90bff0-065c-41f9-bc67-f316d9702a19 - - true - Language - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - true - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - true - true - true - true - true - true - - languagecode - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - ApplicationRequired - - LanguageCode - - - IntegerType - - 5.0.0.0 - false - 0 - - Language - 2147483647 - 0 - - 0 - - - 1e90a39b-bda4-4ad2-b708-74ebcbcae348 - - - String - false - false - false - - false - canmodifyadditionalsettings - false - - 7 - 1900-01-01T00:00:00 - - - - - 6740b506-2341-db11-898a-0007e9e17ebd - - true - MIME type of the email template. - 1033 - - - - 6740b506-2341-db11-898a-0007e9e17ebd - - true - MIME type of the email template. - 1033 - - - - - - 6640b506-2341-db11-898a-0007e9e17ebd - - true - Mime Type - 1033 - - - - 6640b506-2341-db11-898a-0007e9e17ebd - - true - Mime Type - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - false - false - true - true - true - - mimetype - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - MimeType - - - StringType - - 5.0.0.0 - false - 0 - - Text - Auto - 256 - - - Text - - - false - 0 - 512 - - - 53b62ff6-eb39-4c51-bc6c-63cff9bd3bb9 - - - Lookup - false - false - false - - false - canmodifyadditionalsettings - false - - 16 - 1900-01-01T00:00:00 - - - - - 9b64cfee-2241-db11-898a-0007e9e17ebd - - true - Unique identifier of the user who last modified the template. - 1033 - - - - 9b64cfee-2241-db11-898a-0007e9e17ebd - - true - Unique identifier of the user who last modified the template. - 1033 - - - - - - 9a64cfee-2241-db11-898a-0007e9e17ebd - - true - Modified By - 1033 - - - - 9a64cfee-2241-db11-898a-0007e9e17ebd - - true - Modified By - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - false - true - true - false - true - - modifiedby - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - ModifiedBy - - - LookupType - - 5.0.0.0 - false - - - None - - systemuser - - - - b58aae8b-25f3-4cf2-b724-1ee3e355949b - - modifiedby - String - false - false - false - - false - canmodifyadditionalsettings - false - - 22 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - modifiedbyname - 2026-05-15T07:09:53.3699968 - - false - canmodifyrequirementlevelsettings - None - - ModifiedByName - - - StringType - - 5.0.0.0 - true - 0 - - Text - Auto - 100 - - - Text - - - false - 0 - 320 - - - f4645b25-ef5a-44c9-a347-34c01a8ae477 - - modifiedby - String - false - false - false - - false - canmodifyadditionalsettings - false - - 34 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - modifiedbyyominame - 2026-05-15T07:09:54.8530048 - - false - canmodifyrequirementlevelsettings - None - - ModifiedByYomiName - - - StringType - - 5.0.0.0 - true - 0 - - Text - Auto - 100 - modifiedbyname - - Text - - - false - 0 - 320 - - - a51d5ce5-d73b-49ca-aeef-a0ee4536d2d2 - - - DateTime - false - false - false - - false - canmodifyadditionalsettings - false - - 17 - 1900-01-01T00:00:00 - - - - - 2640b506-2341-db11-898a-0007e9e17ebd - - true - Date and time when the email template was last modified. - 1033 - - - - 2640b506-2341-db11-898a-0007e9e17ebd - - true - Date and time when the email template was last modified. - 1033 - - - - - - 2540b506-2341-db11-898a-0007e9e17ebd - - true - Modified On - 1033 - - - - 2540b506-2341-db11-898a-0007e9e17ebd - - true - Modified On - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - false - true - true - false - true - - modifiedon - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - ModifiedOn - - - DateTimeType - - 5.0.0.0 - false - 0 - - DateAndTime - Inactive - - 0 - - false - canmodifybehavior - false - - - UserLocal - - - - 2650518e-c42e-46d7-93ab-e8b2d4d10878 - - - Lookup - false - false - false - - false - canmodifyadditionalsettings - false - - 46 - 1900-01-01T00:00:00 - - - - - 88b366f8-3717-4822-b29d-db05dd46efbc - - true - Unique identifier of the delegate user who last modified the template. - 1033 - - - - 88b366f8-3717-4822-b29d-db05dd46efbc - - true - Unique identifier of the delegate user who last modified the template. - 1033 - - - - - - 4a8a8e56-dbbd-4d19-88f0-eacd62cf24ce - - true - Modified By (Delegate) - 1033 - - - - 4a8a8e56-dbbd-4d19-88f0-eacd62cf24ce - - true - Modified By (Delegate) - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - false - true - true - false - true - - modifiedonbehalfby - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - ModifiedOnBehalfBy - - - LookupType - - 5.0.0.0 - false - - - None - - systemuser - - - - 5edeb9b9-5fa4-40d7-bcb6-840485702594 - - modifiedonbehalfby - String - false - false - false - - false - canmodifyadditionalsettings - false - - 48 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - modifiedonbehalfbyname - 2026-05-15T07:09:52.7129984 - - false - canmodifyrequirementlevelsettings - None - - ModifiedOnBehalfByName - - - StringType - - 5.0.0.0 - true - 0 - - Text - Auto - 100 - - - Text - - - false - 0 - 320 - - - fd623a4d-004c-4b78-82ea-a82aadb2aa65 - - modifiedonbehalfby - String - false - false - false - - false - canmodifyadditionalsettings - false - - 49 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - modifiedonbehalfbyyominame - 2026-05-15T07:09:54.7430016 - - false - canmodifyrequirementlevelsettings - None - - ModifiedOnBehalfByYomiName - - - StringType - - 5.0.0.0 - true - 0 - - Text - Auto - 100 - modifiedonbehalfbyname - - Text - - - false - 0 - 320 - - - 56b0f9b5-1482-46d8-9a80-72d55b7742e8 - - - Integer - false - false - false - - false - canmodifyadditionalsettings - false - - 55 - 1900-01-01T00:00:00 - - - - - 92b43f6b-b037-4db6-8157-02b6418be326 - - true - For internal use only. Shows the number of times emails that use this template have been opened. - 1033 - - - - 92b43f6b-b037-4db6-8157-02b6418be326 - - true - For internal use only. Shows the number of times emails that use this template have been opened. - 1033 - - - - - - ecb78564-c1e7-408e-be5b-a0b85703f13e - - true - Open Count - 1033 - - - - ecb78564-c1e7-408e-be5b-a0b85703f13e - - true - Open Count - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - true - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - false - true - true - false - true - - opencount - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - OpenCount - - - IntegerType - - 8.2.0.0 - false - 0 - - None - 2147483647 - 0 - - 0 - - - ea7970f2-1ac9-484a-b4d4-dced0a298f80 - - - Integer - false - false - false - - false - canmodifyadditionalsettings - false - - 59 - 1900-01-01T00:00:00 - - - - - 445517b3-d409-4788-9ed5-60af9d105428 - - true - Shows the open rate of this template. This is based on number of opens on followed emails that use this template. - 1033 - - - - 445517b3-d409-4788-9ed5-60af9d105428 - - true - Shows the open rate of this template. This is based on number of opens on followed emails that use this template. - 1033 - - - - - - 86347fa3-64ac-4629-945e-88bce8f6070c - - true - Open Rate - 1033 - - - - 86347fa3-64ac-4629-945e-88bce8f6070c - - true - Open Rate - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - true - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - true - true - true - false - true - - openrate - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - OpenRate - - - IntegerType - - 8.2.0.0 - false - 0 - - None - 2147483647 - 0 - - 0 - - - 3fe1ef40-198d-4f89-81e4-c12aa4ea0720 - - - DateTime - false - false - false - - false - canmodifyadditionalsettings - false - - 37 - 1900-01-01T00:00:00 - - - - - 7b59ff51-01c5-42cf-949c-6a41d36f4fad - - true - For internal use only. - 1033 - - - - 7b59ff51-01c5-42cf-949c-6a41d36f4fad - - true - For internal use only. - 1033 - - - - - - cf4c1a13-ad1d-4c46-8b38-592926acebf8 - - true - Record Overwrite Time - 1033 - - - - cf4c1a13-ad1d-4c46-8b38-592926acebf8 - - true - Record Overwrite Time - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - true - - overwritetime - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - SystemRequired - - OverwriteTime - - - DateTimeType - - 5.0.0.0 - false - 0 - - DateOnly - Inactive - - 0 - - false - canmodifybehavior - false - - - UserLocal - - - - 7aa12efe-ad5b-46dd-b155-750a5095564f - - - Owner - false - false - false - - false - canmodifyadditionalsettings - false - - 24 - 1900-01-01T00:00:00 - - - - - 4ed8dee2-2241-db11-898a-0007e9e17ebd - - true - Unique identifier of the user or team who owns the template for the email activity. - 1033 - - - - 4ed8dee2-2241-db11-898a-0007e9e17ebd - - true - Unique identifier of the user or team who owns the template for the email activity. - 1033 - - - - - - 4dd8dee2-2241-db11-898a-0007e9e17ebd - - true - Owner - 1033 - - - - 4dd8dee2-2241-db11-898a-0007e9e17ebd - - true - Owner - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - true - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - true - false - true - true - true - true - - ownerid - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - SystemRequired - - OwnerId - - - OwnerType - - 5.0.0.0 - false - - - None - - systemuser - team - - - - d9a30cad-6c8b-4dad-89f6-82ba310879a0 - - ownerid - String - false - false - false - - false - canmodifyadditionalsettings - false - - 25 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - owneridname - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - SystemRequired - - OwnerIdName - - - StringType - - 5.0.0.0 - true - 0 - - Text - Auto - 100 - - - Text - - - false - 0 - 320 - - - 1a7a02c6-64df-4cbd-88b3-9059ca3c65d1 - - ownerid - EntityName - false - false - false - - false - canmodifyadditionalsettings - false - - 27 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - false - false - true - true - false - - owneridtype - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - SystemRequired - - OwnerIdType - - - EntityNameType - - 5.0.0.0 - false - - - - - - true - - - 6e55575d-5e3d-4908-9270-cda6d57332d3 - - ownerid - String - false - false - false - - false - canmodifyadditionalsettings - false - - 36 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - owneridyominame - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - SystemRequired - - OwnerIdYomiName - - - StringType - - 5.0.0.0 - true - 0 - - Text - Auto - 100 - owneridname - - Text - - - false - 0 - 320 - - - 4f946828-9978-4ea4-a37f-46db1aaa772b - - - Lookup - false - false - false - - false - canmodifyadditionalsettings - false - - 3 - 1900-01-01T00:00:00 - - - - - f9e8af0c-2341-db11-898a-0007e9e17ebd - - true - Unique identifier of the business unit that owns the template. - 1033 - - - - f9e8af0c-2341-db11-898a-0007e9e17ebd - - true - Unique identifier of the business unit that owns the template. - 1033 - - - - - - f8e8af0c-2341-db11-898a-0007e9e17ebd - - true - Owning Business Unit - 1033 - - - - f8e8af0c-2341-db11-898a-0007e9e17ebd - - true - Owning Business Unit - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - true - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - true - true - true - false - true - - owningbusinessunit - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - OwningBusinessUnit - - - LookupType - - 5.0.0.0 - false - - - None - - businessunit - - - - 21ba76d9-58e4-4451-a17f-e808155eb9f4 - - owningbusinessunit - String - false - false - false - - true - canmodifyadditionalsettings - true - - 10000 - 2026-05-15T07:22:29.5469952 - - - - - - - - - - template - - - - true - canmodifyauditsettings - true - - false - - true - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - false - false - false - - true - isrenameable - true - - false - false - false - false - - true - canmodifyissortablesettings - false - - - true - canmodifysearchsettings - false - - false - false - false - true - false - false - - owningbusinessunitname - 2026-05-15T07:22:29.5469952 - - true - canmodifyrequirementlevelsettings - None - - OwningBusinessUnitName - - - StringType - - 5.0.0.0 - true - 0 - - Text - Auto - 160 - - - Text - - - false - 0 - 320 - - - 3c708216-9ffd-480b-a84b-78d6cd56a583 - - - Lookup - false - false - false - - false - canmodifyadditionalsettings - false - - 50 - 1900-01-01T00:00:00 - - - - - 4f1d9b1e-2341-db11-898a-0007e9e17ebd - - true - Unique identifier of the team who owns the template. - 1033 - - - - 4f1d9b1e-2341-db11-898a-0007e9e17ebd - - true - Unique identifier of the team who owns the template. - 1033 - - - - - - 364cfbe8-ba39-43f1-9ea0-1fd0d8fe543a - - true - Owning Team - 1033 - - - - 364cfbe8-ba39-43f1-9ea0-1fd0d8fe543a - - true - Owning Team - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - true - - owningteam - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - OwningTeam - - - LookupType - - 5.0.0.0 - true - - - None - - team - - - - c8a1139a-b6d6-4f50-a136-d9fc8b0e460a - - - Lookup - false - false - false - - false - canmodifyadditionalsettings - false - - 12 - 1900-01-01T00:00:00 - - - - - 421d9b1e-2341-db11-898a-0007e9e17ebd - - true - Unique identifier of the user who owns the template. - 1033 - - - - 421d9b1e-2341-db11-898a-0007e9e17ebd - - true - Unique identifier of the user who owns the template. - 1033 - - - - - - 808bb9e1-4dcb-4652-a9b5-f4682127f409 - - true - Owning User - 1033 - - - - 808bb9e1-4dcb-4652-a9b5-f4682127f409 - - true - Owning User - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - true - - owninguser - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - OwningUser - - - LookupType - - 5.0.0.0 - true - - - None - - systemuser - - - - 281a44a6-e592-46e2-b88e-a51aa9fde9f6 - - - Memo - false - false - false - - false - canmodifyadditionalsettings - false - - 14 - 1900-01-01T00:00:00 - - - - - 08e8af0c-2341-db11-898a-0007e9e17ebd - - true - XML data for the body of the email template. - 1033 - - - - 08e8af0c-2341-db11-898a-0007e9e17ebd - - true - XML data for the body of the email template. - 1033 - - - - - - 07e8af0c-2341-db11-898a-0007e9e17ebd - - true - Presentation XML - 1033 - - - - 07e8af0c-2341-db11-898a-0007e9e17ebd - - true - Presentation XML - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - false - false - true - true - true - - presentationxml - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - PresentationXml - - - MemoType - - 5.0.0.0 - false - - - TextArea - Auto - 1073741823 - - TextArea - - false - - - 6db9efc5-ca95-478e-af0a-c7f181917fe8 - - - Integer - false - false - false - - false - canmodifyadditionalsettings - false - - 56 - 1900-01-01T00:00:00 - - - - - 2d6ad07a-1069-494b-b35b-8078bda15c1d - - true - For internal use only. Shows the number of times emails that use this template have received replies. - 1033 - - - - 2d6ad07a-1069-494b-b35b-8078bda15c1d - - true - For internal use only. Shows the number of times emails that use this template have received replies. - 1033 - - - - - - 67fa504d-a9b8-4019-8ca7-b7f09e0010c4 - - true - Reply Count - 1033 - - - - 67fa504d-a9b8-4019-8ca7-b7f09e0010c4 - - true - Reply Count - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - true - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - false - true - true - false - true - - replycount - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - ReplyCount - - - IntegerType - - 8.2.0.0 - false - 0 - - None - 2147483647 - 0 - - 0 - - - 8ea17bab-e6b9-40a0-821b-3c163c8404c1 - - - Integer - false - false - false - - false - canmodifyadditionalsettings - false - - 60 - 1900-01-01T00:00:00 - - - - - 1e62ae6e-4c6d-44e8-baf1-74cafbccac77 - - true - Shows the reply rate for this template. This is based on number of replies received on followed emails that use this template. - 1033 - - - - 1e62ae6e-4c6d-44e8-baf1-74cafbccac77 - - true - Shows the reply rate for this template. This is based on number of replies received on followed emails that use this template. - 1033 - - - - - - 381d62de-55a0-4da0-89b9-983ce4e03bec - - true - Reply Rate - 1033 - - - - 381d62de-55a0-4da0-89b9-983ce4e03bec - - true - Reply Rate - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - true - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - false - true - true - false - true - - replyrate - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - ReplyRate - - - IntegerType - - 8.2.0.0 - false - 0 - - None - 2147483647 - 0 - - 0 - - - 96523be8-ae07-43d0-96bd-e5616956e0ae - - - Memo - false - false - false - - false - canmodifyadditionalsettings - false - - 10001 - 2026-05-15T11:47:34.3330048 - - - - - 3e257413-2dfa-40af-8948-c11223b561a1 - - true - Safe html of email template. - 1033 - - - - 3e257413-2dfa-40af-8948-c11223b561a1 - - true - Safe html of email template. - 1033 - - - - - - 43de2f2a-81ae-4d36-bc25-4c3141f35f05 - - true - Safe HTML of email template - 1033 - - - - 43de2f2a-81ae-4d36-bc25-4c3141f35f05 - - true - Safe HTML of email template - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - true - false - true - true - true - - safehtml - 2026-05-15T11:47:34.3330048 - - false - canmodifyrequirementlevelsettings - None - - SafeHtml - - - MemoType - - 9.0.0.0 - false - - - TextArea - Auto - 1073741823 - - TextArea - - false - - - dfe5b70f-2c12-46ff-9f54-4439b3c04494 - - - Uniqueidentifier - false - false - false - - false - canmodifyadditionalsettings - false - - 39 - 1900-01-01T00:00:00 - - - - - e493d368-c2bd-49b4-a770-821ec99623bf - - true - Unique identifier of the associated solution. - 1033 - - - - e493d368-c2bd-49b4-a770-821ec99623bf - - true - Unique identifier of the associated solution. - 1033 - - - - - - 86c4c5ca-344c-43d5-b0ae-2a886f0e4ba4 - - true - Solution - 1033 - - - - 86c4c5ca-344c-43d5-b0ae-2a886f0e4ba4 - - true - Solution - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - true - - solutionid - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - SystemRequired - - SolutionId - - - UniqueidentifierType - - 5.0.0.0 - false - - - - - fd357f5c-54c2-4f64-92b2-c1729dd97fdf - - - Memo - false - false - false - - false - canmodifyadditionalsettings - false - - 2 - 1900-01-01T00:00:00 - - - - - d4cde1dc-2241-db11-898a-0007e9e17ebd - - true - Subject associated with the email template. - 1033 - - - - d4cde1dc-2241-db11-898a-0007e9e17ebd - - true - Subject associated with the email template. - 1033 - - - - - - d3cde1dc-2241-db11-898a-0007e9e17ebd - - true - Subject - 1033 - - - - d3cde1dc-2241-db11-898a-0007e9e17ebd - - true - Subject - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - false - false - true - true - true - - subject - 2026-05-15T11:47:34.8329984 - - false - canmodifyrequirementlevelsettings - ApplicationRequired - - Subject - - - MemoType - - 5.0.0.0 - false - - - Text - Auto - 5000 - - Text - - false - - - db69d772-8a60-4718-89f6-32190d1919df - - - Memo - false - false - false - - false - canmodifyadditionalsettings - false - - 30 - 1900-01-01T00:00:00 - - - - - 8454c2fa-2241-db11-898a-0007e9e17ebd - - true - XML data for the subject of the email template. - 1033 - - - - 8454c2fa-2241-db11-898a-0007e9e17ebd - - true - XML data for the subject of the email template. - 1033 - - - - - - 8354c2fa-2241-db11-898a-0007e9e17ebd - - true - Subject XML - 1033 - - - - 8354c2fa-2241-db11-898a-0007e9e17ebd - - true - Subject XML - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - false - false - true - true - true - - subjectpresentationxml - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - SubjectPresentationXml - - - MemoType - - 5.0.0.0 - false - - - TextArea - Auto - 1073741823 - - TextArea - - false - - - fbb526b1-60dc-4a81-93f0-0f528072c81d - - - Memo - false - false - false - - false - canmodifyadditionalsettings - false - - 10002 - 2026-05-15T11:47:34.3670016 - - - - - 446c2253-8898-41c9-a66b-db8c7400a341 - - true - Safe html of email template subject. - 1033 - - - - 446c2253-8898-41c9-a66b-db8c7400a341 - - true - Safe html of email template subject. - 1033 - - - - - - 2b4656e2-e1fa-4a54-be9c-5b1f69ed8e0f - - true - Safe HTML of email template subject - 1033 - - - - 2b4656e2-e1fa-4a54-be9c-5b1f69ed8e0f - - true - Safe HTML of email template subject - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - true - true - false - true - true - true - - subjectsafehtml - 2026-05-15T11:47:34.3670016 - - false - canmodifyrequirementlevelsettings - None - - SubjectSafeHtml - - - MemoType - - 9.0.0.0 - false - - - TextArea - Auto - 1073741823 - - TextArea - - false - - - aa6fc6fa-e20a-4ba5-99aa-4eefcd922598 - - - Uniqueidentifier - false - false - false - - false - canmodifyadditionalsettings - false - - 40 - 1900-01-01T00:00:00 - - - - - 67307349-acbd-4112-968f-b10e4aa08774 - - true - For internal use only. - 1033 - - - - 67307349-acbd-4112-968f-b10e4aa08774 - - true - For internal use only. - 1033 - - - - - - b4549769-e02d-489e-8ed9-6423165d0125 - - true - Solution - 1033 - - - - b4549769-e02d-489e-8ed9-6423165d0125 - - true - Solution - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - false - false - false - - supportingsolutionid - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - SupportingSolutionId - - - UniqueidentifierType - - 5.0.0.0 - false - - - - - cf2042c2-fd1f-4932-9569-b18411a11cac - - - Uniqueidentifier - false - false - false - - false - canmodifyadditionalsettings - false - - 1 - 1900-01-01T00:00:00 - - - - - 0853c2fa-2241-db11-898a-0007e9e17ebd - - true - Unique identifier of the template. - 1033 - - - - 0853c2fa-2241-db11-898a-0007e9e17ebd - - true - Unique identifier of the template. - 1033 - - - - - - 0753c2fa-2241-db11-898a-0007e9e17ebd - - true - Email Template - 1033 - - - - 0753c2fa-2241-db11-898a-0007e9e17ebd - - true - Email Template - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - true - - true - canmodifyglobalfiltersettings - false - - true - true - false - - false - isrenameable - false - - false - true - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - true - false - false - true - false - true - - templateid - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - SystemRequired - - TemplateId - - - UniqueidentifierType - - 5.0.0.0 - false - - - - - 16355f79-7183-4f85-a905-d60e25b6cd5d - - - Uniqueidentifier - false - false - false - - false - canmodifyadditionalsettings - false - - 41 - 1900-01-01T00:00:00 - - - - - af5cf60d-207a-4bcd-855b-488a84a47615 - - true - For internal use only. - 1033 - - - - af5cf60d-207a-4bcd-855b-488a84a47615 - - true - For internal use only. - 1033 - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - true - - templateidunique - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - SystemRequired - - TemplateIdUnique - - - UniqueidentifierType - - 5.0.0.0 - false - - - - - cd1d90b9-e1b8-49c8-b8f4-106ccdd88051 - - - EntityName - false - false - false - - false - canmodifyadditionalsettings - false - - 8 - 1900-01-01T00:00:00 - - - - - 0754c2fa-2241-db11-898a-0007e9e17ebd - - true - Type of email template. - 1033 - - - - 0754c2fa-2241-db11-898a-0007e9e17ebd - - true - Type of email template. - 1033 - - - - - - 0654c2fa-2241-db11-898a-0007e9e17ebd - - true - Template Type - 1033 - - - - 0654c2fa-2241-db11-898a-0007e9e17ebd - - true - Template Type - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - true - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - true - false - true - true - true - true - - templatetypecode - 2026-05-15T11:47:34.4130048 - - false - canmodifyrequirementlevelsettings - SystemRequired - - TemplateTypeCode - - - EntityNameType - - 5.0.0.0 - false - - - -1 - - 2be068b7-04d3-45bf-b24b-f268fd56156d - - - - - 40d4c6e3-d814-46dd-b0de-89540069b604 - - true - Type of email template. - 1033 - - - - 40d4c6e3-d814-46dd-b0de-89540069b604 - - true - Type of email template. - 1033 - - - - - - 4439956c-fe1e-449e-8991-c14e012b4ca4 - - true - Template Type - 1033 - - - - 4439956c-fe1e-449e-8991-c14e012b4ca4 - - true - Template Type - 1033 - - - - false - - false - iscustomizable - true - - false - true - template_templatetypecode - Picklist - 5.0.0.0 - - - - - - - - - - - false - true - - - - 0f54c2fa-2241-db11-898a-0007e9e17ebd - - true - Account - 1033 - - - - 0f54c2fa-2241-db11-898a-0007e9e17ebd - - true - Account - 1033 - - - account - 1 - - - - - - - - - - - - false - true - - - - 1154c2fa-2241-db11-898a-0007e9e17ebd - - true - Contact - 1033 - - - - 1154c2fa-2241-db11-898a-0007e9e17ebd - - true - Contact - 1033 - - - contact - 2 - - - - - - - - - - - - false - true - - - - 2154c2fa-2241-db11-898a-0007e9e17ebd - - true - System Job - 1033 - - - - 2154c2fa-2241-db11-898a-0007e9e17ebd - - true - System Job - 1033 - - - asyncoperation - 4700 - - - - - - - - - - - - false - true - - - - 0954c2fa-2241-db11-898a-0007e9e17ebd - - true - User - 1033 - - - - 0954c2fa-2241-db11-898a-0007e9e17ebd - - true - User - 1033 - - - systemuser - 8 - - - - - - - true - - - 8daa3583-0741-40a1-ad16-15bcbe82db77 - - templatetypecode - Virtual - false - false - false - - false - canmodifyadditionalsettings - false - - 29 - 1900-01-01T00:00:00 - - - - - - - - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - false - - templatetypecodename - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - TemplateTypeCodeName - - - VirtualType - - 5.0.0.0 - true - - - - - bac1c51a-8e29-45a3-8cea-e81c2368872f - - - String - false - false - false - - false - canmodifyadditionalsettings - false - - 10 - 1900-01-01T00:00:00 - - - - - e8d7a218-2341-db11-898a-0007e9e17ebd - - true - Title of the template. - 1033 - - - - e8d7a218-2341-db11-898a-0007e9e17ebd - - true - Title of the template. - 1033 - - - - - - e7d7a218-2341-db11-898a-0007e9e17ebd - - true - Title - 1033 - - - - e7d7a218-2341-db11-898a-0007e9e17ebd - - true - Title - 1033 - - - template - - - - true - canmodifyauditsettings - true - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - true - - false - isrenameable - false - - false - true - true - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - true - false - true - true - true - true - - title - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - ApplicationRequired - - Title - - - StringType - - 5.0.0.0 - false - 0 - - Text - Auto - 200 - - - Text - - - false - 0 - 400 - - - 0787149a-40b4-45e9-ac33-cc59923cf027 - - - Integer - false - false - false - - false - canmodifyadditionalsettings - false - - 61 - 1900-01-01T00:00:00 - - - - - 24d31f47-0d64-43dd-aa24-663d381ba775 - - true - Shows the number of sent emails that use this template. - 1033 - - - - 24d31f47-0d64-43dd-aa24-663d381ba775 - - true - Shows the number of sent emails that use this template. - 1033 - - - - - - b5b5aa19-6c36-4cd1-acad-383cc1923c9e - - true - Sent email count - 1033 - - - - b5b5aa19-6c36-4cd1-acad-383cc1923c9e - - true - Sent email count - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - true - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - true - - false - false - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - true - - false - false - true - true - false - true - - usedcount - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - UsedCount - - - IntegerType - - 8.2.0.0 - false - 0 - - None - 2147483647 - 0 - - 0 - - - 0b00c500-0d91-4edf-a9a4-3817d43d86c5 - - - BigInt - false - false - false - - false - canmodifyadditionalsettings - false - - 18 - 1900-01-01T00:00:00 - - - - - 7996c2d8-ca66-441b-9583-42de92544e40 - - true - Version number of the template. - 1033 - - - - 7996c2d8-ca66-441b-9583-42de92544e40 - - true - Version number of the template. - 1033 - - - - - - eef1b083-63ef-4ae9-8850-ae64b729baee - - true - Version Number - 1033 - - - - eef1b083-63ef-4ae9-8850-ae64b729baee - - true - Version Number - 1033 - - - template - - - - false - canmodifyauditsettings - false - - false - - false - iscustomizable - false - - false - false - - true - canmodifyglobalfiltersettings - false - - true - false - false - - false - isrenameable - false - - false - true - false - false - - true - canmodifyissortablesettings - false - - - false - canmodifysearchsettings - false - - false - false - false - true - false - true - - versionnumber - 1900-01-01T00:00:00 - - false - canmodifyrequirementlevelsettings - None - - VersionNumber - - - BigIntType - - 5.0.0.0 - false - - - 9223372036854775807 - -9223372036854775808 - - - false - false - false - - false - canbeincustomentityassociation - false - - - false - canbeinmanytomany - false - - - false - canbeprimaryentityinrelationship - false - - - false - canberelatedentityinrelationship - false - - true - - true - canchangetrackingbeenabled - true - - - false - cancreateattributes - false - - - false - cancreatecharts - false - - - false - cancreateforms - false - - - false - cancreateviews - true - - - false - canenablesynctoexternalsearchindex - false - - - true - canmodifyadditionalsettings - true - - true - false - Local - 1900-01-01T00:00:00 - - - false - - - - 0ddd01b9-2241-db11-898a-0007e9e17ebd - - true - Template for an email message that contains the standard attributes of an email message. - 1033 - - - - 0ddd01b9-2241-db11-898a-0007e9e17ebd - - true - Template for an email message that contains the standard attributes of an email message. - 1033 - - - - - - 0fdd01b9-2241-db11-898a-0007e9e17ebd - - true - Email Templates - 1033 - - - - 0fdd01b9-2241-db11-898a-0007e9e17ebd - - true - Email Templates - 1033 - - - - - - 0edd01b9-2241-db11-898a-0007e9e17ebd - - true - Email Template - 1033 - - - - 0edd01b9-2241-db11-898a-0007e9e17ebd - - true - Email Template - 1033 - - - false - - false - false - false - false - - - - - false - false - false - false - - true - canmodifyauditsettings - false - - true - false - false - - false - canmodifyconnectionsettings - false - - false - - false - iscustomizable - true - - false - false - - false - canmodifyduplicatedetectionsettings - false - - false - false - false - false - false - false - false - - false - canmodifymailmergesettings - false - - true - - false - ismappable - false - - false - false - - false - canmodifymobileclientreadonly - false - - true - - false - isrenameable - true - - false - false - false - true - false - true - - false - canmodifyqueuesettings - false - - - false - canmodifymobilevisibility - false - - - false - canmodifymobileclientvisibility - true - - template - - - - 975c286e-54a5-430d-b05d-e2ed66804dff - - false - - false - iscustomizable - false - - true - true - system_user_email_templates - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - systemuserid - systemuser - system_user_email_templates - owninguser - template - owninguser - - 0 - - - 72f8fb8b-5f25-4854-86eb-5100b27c4e26 - - false - - false - iscustomizable - false - - true - true - lk_templatebase_modifiedby - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - systemuserid - systemuser - lk_templatebase_modifiedby - modifiedby - template - modifiedby - - 0 - - - b6928293-c433-4da5-8f25-208338bcaac4 - - false - - false - iscustomizable - false - - true - true - lk_templatebase_createdby - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - systemuserid - systemuser - lk_templatebase_createdby - createdby - template - createdby - - 0 - - - 5a19faa3-db82-4f65-8511-c0cf68e351ba - - false - - false - iscustomizable - false - - true - false - owner_templates - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - Restrict - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - ownerid - owner - owner_templates - ownerid - template - ownerid - - 0 - - - c25f5eaf-8f92-4ec9-8ed1-65f310fffdc2 - - false - - false - iscustomizable - false - - true - true - lk_templatebase_createdonbehalfby - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - systemuserid - systemuser - lk_templatebase_createdonbehalfby - createdonbehalfby - template - createdonbehalfby - - 0 - - - 347d35b2-b0ff-45d0-a4f8-6e0687ee5b40 - - false - - false - iscustomizable - false - - true - true - team_email_templates - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - teamid - team - team_email_templates - owningteam - template - owningteam - - 0 - - - 66715cda-65c4-4c44-95f4-e68ecb284369 - - false - - false - iscustomizable - false - - true - true - lk_templatebase_modifiedonbehalfby - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - systemuserid - systemuser - lk_templatebase_modifiedonbehalfby - modifiedonbehalfby - template - modifiedonbehalfby - - 0 - - - 0eb5a9db-5350-f111-bec6-e4fb1ef8f465 - - false - - false - iscustomizable - false - - true - false - ImageDescriptor_Template - None - 6.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - imagedescriptorid - imagedescriptor - ImageDescriptor_Template - entityimageid - template - entityimageid_imagedescriptor - - 0 - - - bccaeff8-a650-4a59-9b5a-3ec33438b3ce - - false - - false - iscustomizable - false - - true - false - business_unit_templates - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - businessunitid - businessunit - business_unit_templates - owningbusinessunit - template - owningbusinessunit - - 0 - - - 2026-05-15T16:03:49.2099968 - 2010 - - - 44042f12-485e-4e9a-aaff-588f692f186e - - false - - false - iscustomizable - false - - true - true - Template_AsyncOperations - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - templateid - template - Template_AsyncOperations - regardingobjectid - asyncoperation - regardingobjectid_template - - 0 - - - 10958037-4bc9-4153-85a7-8d3bdb661f6f - - false - - false - iscustomizable - false - - true - true - Template_ProcessSessions - None - 5.0.0.0 - OneToManyRelationship - - UseCollectionName - Details - - - - - 110 - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - templateid - template - Template_ProcessSessions - regardingobjectid - processsession - regardingobjectid_template - - 0 - - - a9835154-a72e-47f2-b9f9-d929fb0a00a0 - - false - - false - iscustomizable - true - - true - true - Template_SyncErrors - Append - 8.1.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - Cascade - Cascade - Cascade - Cascade - Cascade - Cascade - NoCascade - - - - - false - false - templateid - template - Template_SyncErrors - regardingobjectid - syncerror - regardingobjectid_template_syncerror - - 1 - - - dcda8e64-c0fe-4d2d-8a8a-e32d365fa90d - - false - - false - iscustomizable - false - - true - false - Template_Organization - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - RemoveLink - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - templateid - template - Template_Organization - acknowledgementtemplateid - organization - acknowledgementtemplateid - - 0 - - - 9beff8aa-f008-4a46-8846-59649bbe5460 - - false - - false - iscustomizable - false - - true - false - Template_BulkDeleteFailures - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - Cascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - templateid - template - Template_BulkDeleteFailures - regardingobjectid - bulkdeletefailure - regardingobjectid_template - - 0 - - - 760df4d9-e26a-4d72-a1f5-e8da979e61c6 - - false - - false - iscustomizable - true - - true - true - Email_EmailTemplate - ParentChild - 8.2.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - RemoveLink - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - templateid - template - Email_EmailTemplate - templateid - email - templateid - - 2 - - - 8ff49bdd-71a3-470b-a986-043cea152cea - - false - - false - iscustomizable - false - - true - true - emailtemplate_convertrule - Append - 6.1.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - Restrict - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - templateid - template - emailtemplate_convertrule - responsetemplateid - convertrule - responsetemplateid - - 1 - - - 4c37f9e8-f9b4-4c94-a4a1-8690ae249c69 - - false - - false - iscustomizable - false - - true - true - template_activity_mime_attachments - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - Cascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - templateid - template - template_activity_mime_attachments - objectid - activitymimeattachment - objectid_template - - 0 - - - 94b415f9-da73-4fee-b50a-c1035c08799f - - false - - false - iscustomizable - false - - true - false - userentityinstancedata_template - None - 5.0.0.0 - OneToManyRelationship - - DoNotDisplay - Details - - - - - - true - - false - - - 00000000-0000-0000-0000-000000000000 - - - NoCascade - NoCascade - Cascade - NoCascade - NoCascade - NoCascade - NoCascade - NoCascade - - - - - false - false - templateid - template - userentityinstancedata_template - objectid - userentityinstancedata - objectid_template - - 0 - - - - 8 - UserOwned - - templateid - - title - - - true - true - false - true - true - false - false - prvCreateEmailTemplate - 921dac3c-3dc0-4f66-83c1-f4e6ea427a45 - Create - - - true - true - false - true - true - false - false - prvReadEmailTemplate - 6c619dca-e165-4baa-ba16-ef6f820a0e01 - Read - - - true - true - false - true - true - false - false - prvWriteEmailTemplate - f2cc25b1-bfcc-4f7c-a6c3-9a5fc386391a - Write - - - true - true - false - true - true - false - false - prvDeleteEmailTemplate - ffe4299b-7978-4b50-a724-2317db0d3949 - Delete - - - true - true - false - true - true - false - false - prvAssignEmailTemplate - 17b31e5e-bc94-4967-b83f-c7049eb483da - Assign - - - true - true - false - true - true - false - false - prvShareEmailTemplate - df6a99af-703c-47cb-80c6-74eb519ad453 - Share - - - true - true - false - true - true - false - false - prvAppendEmailTemplate - 57444774-b24c-4684-a514-dfcab252c331 - Append - - - true - true - false - true - true - false - false - prvAppendToEmailTemplate - c7057b81-25b8-4940-9ced-eed842b712a5 - AppendTo - - - false - false - false - true - false - false - false - prvCreateOrgEmailTemplates - 01750f14-3320-49cc-a7d1-52502cdcd16d - None - - - - FilteredTemplate - Template - - - false - Standard - false - 5.0.0.0 - entityimage - - false - canchangehierarchicalrelationship - false - - - false - Templates - - - true - - templates - 0 - templates - false - - true - canmodifymobileclientoffline - false - - false - false - - false - false - - - - - - - \ No newline at end of file diff --git a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs index 12ca20bf..91f74735 100644 --- a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs +++ b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs @@ -19,11 +19,11 @@ private Email BuildEmail(Contact recipient) { return new Email { - From = new ActivityParty[] + from = new ActivityParty[] { new ActivityParty { PartyId = crm.AdminUser } }, - To = new ActivityParty[] + to = new ActivityParty[] { new ActivityParty { PartyId = recipient.ToEntityReference() } }, @@ -89,8 +89,8 @@ public void TestSendEmailFromTemplateCreatesAndSendsEmail() { var email = context.EmailSet.FirstOrDefault(e => e.Id == response.Id); Assert.NotNull(email); - Assert.Equal(EmailState.Completed, email.StateCode); - Assert.Equal(Email_StatusCode.PendingSend, email.StatusCode); + Assert.Equal(email_statecode.Completed, email.StateCode); + Assert.Equal(email_statuscode.PendingSend, email.StatusCode); Assert.Equal(contact.Id, email.RegardingObjectId.Id); } } @@ -142,7 +142,7 @@ public void TestSendEmailFromTemplateRendersTemplateContent() Assert.Contains("Dear", email.Description); Assert.Contains("Smith", email.Description); Assert.Contains("smith@test.com", email.Description); - Assert.Equal(EmailState.Completed, email.StateCode); + Assert.Equal(email_statecode.Completed, email.StateCode); } // A body stylesheet that merges a field from the sending systemuser rather than the From 9185b84da80c7339281408e18dcc80f5a98b954e Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Thu, 3 Sep 2026 10:04:28 +0200 Subject: [PATCH 09/14] Address review findings on SendEmailFromTemplate Correctness fixes, each with a regression test: * templatetypecode: the `GetAttributeValue() ?? GetAttributeValue()` chain could not work - the first call hard-casts, so it throws on a type mismatch instead of returning null, making the int fallback unreachable. A live org returns templatetypecode as the string "contact", which the old code turned into an unhandled InvalidCastException. Now switches explicitly on OptionSetValue, int and string. * The sending user no longer overwrites the regarding record in the render context. A template regarding a systemuser merged the caller instead of the regarding user. * A stylesheet that does not compile now faults instead of returning the raw XSLT, which previously shipped markup into the sent e-mail. The old comment justified the fallback with plain-text templates, but those never reach it - they return at the xsl:stylesheet check above. * Lookups merge as the record id in registry format ({GUID}, uppercase), which is what Dataverse does. Previously EntityReference.Name was used, and that is always null for entities read from XrmDb, so lookups merged as nothing at all. * XSLT is loaded with an explicit null resolver so xsl:import/include cannot reach the network and a mock run stays offline. * The template and regarding record are now read with a ReadAccess check, mirroring RetrieveRequestHandler. Comments: added summaries to BuildDataDocument and AttributeToString, removed the "verified against a live org" provenance notes from source (they belong in the PR), and left the templatetypecode explanation in one place instead of three. Release note shortened to match the rest of the file. Verified: 682 tests pass, net462 builds clean, and the packed NuGet was consumed by a standalone project running against metadata generated from a live org. Not addressed here: Dataverse wraps the merged body in an HTML envelope where we return bare text. Deliberately left to a follow-up so this change stays scoped. --- RELEASE_NOTES.md | 2 +- .../Internal/EmailTemplateRenderer.cs | 35 ++--- .../SendEmailFromTemplateRequestHandler.cs | 55 +++++--- .../TestEmailTemplateRenderer.cs | 44 +++++- .../TestSendEmailFromTemplate.cs | 132 ++++++++++++++---- 5 files changed, 197 insertions(+), 71 deletions(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index e5833547..025bb69a 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,5 +1,5 @@ ### 1.20.2 - UNRELEASED -* Add: `SendEmailFromTemplate` request support. The e-mail is created from the template and then sent through the existing `Create` and `SendEmail` handlers, so security, plugins and status transitions behave like a normal send. Template subject/body are stored by Dataverse as XSLT stylesheets, so they are rendered against the regarding record and the sending user; plain-text templates pass through unchanged (#331) +* Add: `SendEmailFromTemplate` request support, rendering the template's XSLT subject/body against the regarding record and the sending user (#331) ### 1.20.1 - 1 September 2026 * Fix: Match alternate keys by value, not reference (#350) diff --git a/src/XrmMockup365/Internal/EmailTemplateRenderer.cs b/src/XrmMockup365/Internal/EmailTemplateRenderer.cs index fb6d032f..15da9017 100644 --- a/src/XrmMockup365/Internal/EmailTemplateRenderer.cs +++ b/src/XrmMockup365/Internal/EmailTemplateRenderer.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; +using System.ServiceModel; using System.Xml; using System.Xml.Xsl; @@ -17,19 +18,14 @@ namespace DG.Tools.XrmMockup /// internal static class EmailTemplateRenderer { - /// - /// Renders a single template field (subject or body). - /// - /// The raw template attribute value (an XSLT stylesheet in Dataverse). + /// The raw template attribute value. /// /// The records available to the template, keyed by logical name. Each becomes a child of /// <data> (e.g. <contact>, <systemuser>) with one /// element per populated attribute. /// - /// - /// The merged text. If the field is not an XSLT stylesheet, or the transform fails, the - /// raw value is returned unchanged so plain-text templates still work. - /// + /// The merged text, or the value unchanged if it is not a stylesheet. + /// The value is a stylesheet but does not compile or apply. public static string Render(string templateField, IReadOnlyDictionary entitiesByLogicalName) { if (string.IsNullOrWhiteSpace(templateField)) @@ -45,25 +41,27 @@ public static string Render(string templateField, IReadOnlyDictionary + /// Builds the <data> document the stylesheet selects its merge values from. + /// private static XmlDocument BuildDataDocument(IReadOnlyDictionary entitiesByLogicalName) { var document = new XmlDocument(); @@ -96,6 +94,9 @@ private static XmlDocument BuildDataDocument(IReadOnlyDictionary return document; } + /// + /// Flattens an attribute to the text a stylesheet's xsl:value-of would select. + /// private static string AttributeToString(object value) { switch (value) @@ -105,7 +106,9 @@ private static string AttributeToString(object value) case string s: return s; case EntityReference reference: - return reference.Name; + // Dataverse merges a lookup as the record id in registry format (verified + // against a live org), not as the display name. + return reference.Id.ToString("B").ToUpperInvariant(); case OptionSetValue optionSet: return optionSet.Value.ToString(CultureInfo.InvariantCulture); case Money money: diff --git a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs index f629e777..096d6824 100644 --- a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs +++ b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs @@ -12,27 +12,44 @@ internal class SendEmailFromTemplateRequestHandler : RequestHandler { public SendEmailFromTemplateRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "SendEmailFromTemplate") { } - // Dataverse throws when a referenced record does not exist; mirror that rather than - // silently sending an empty/unmerged e-mail. - private Entity RetrieveOrThrow(EntityReference reference) + // Dataverse throws when a referenced record does not exist or the caller cannot read it; + // mirror that rather than silently sending an empty or unmerged e-mail. + private Entity RetrieveOrThrow(EntityReference reference, EntityReference userRef) { - return db.GetEntityOrNull(reference) + var entity = db.GetEntityOrNull(reference) ?? throw new FaultException($"{reference.LogicalName} With Id = {reference.Id} Does Not Exist"); + + if (!security.HasPermission(entity, AccessRights.ReadAccess, userRef)) + throw new FaultException($"Calling user with id '{userRef.Id}' does not have permission to read entity '{reference.LogicalName}'"); + + return entity; } - // A template is bound to an entity type via templatetypecode; Dataverse rejects a - // regarding record of a different type. templatetypecode is an EntityName attribute - // carrying an option set, which XrmMockup stores as the integer object type code (see - // DbAttributeTypeMap) rather than the logical name Dataverse itself exposes. + // A template is bound to an entity type via templatetypecode; Dataverse rejects a regarding + // record of a different type. templatetypecode is an EntityName attribute, stored as the + // integer object type code when its metadata carries an option set and as the logical name + // otherwise (see DbAttributeTypeMap), so both shapes are accepted. private void ValidateTemplateType(Entity template, string regardingType) { - var templateTypeCode = template.GetAttributeValue("templatetypecode")?.Value - ?? template.GetAttributeValue("templatetypecode"); + if (!template.Attributes.TryGetValue("templatetypecode", out var rawTypeCode) || rawTypeCode == null) + return; + metadata.EntityMetadata.TryGetValue(regardingType, out var regardingMetadata); var regardingTypeCode = regardingMetadata?.ObjectTypeCode; - - if (templateTypeCode.HasValue && regardingTypeCode.HasValue && - templateTypeCode.Value != regardingTypeCode.Value) + if (regardingTypeCode == null) + return; + + bool matches; + if (rawTypeCode is OptionSetValue optionSet) + matches = optionSet.Value == regardingTypeCode.Value; + else if (rawTypeCode is int typeCode) + matches = typeCode == regardingTypeCode.Value; + else if (rawTypeCode is string logicalName) + matches = logicalName == regardingType; + else + return; + + if (!matches) { throw new FaultException( $"The template type does not match the regarding object type '{regardingType}'."); @@ -58,18 +75,18 @@ internal override OrganizationResponse Execute(OrganizationRequest orgRequest, E if (string.IsNullOrEmpty(request.RegardingType)) throw new FaultException("Regarding type should be set."); - var template = RetrieveOrThrow(new EntityReference("template", request.TemplateId)); + var template = RetrieveOrThrow(new EntityReference("template", request.TemplateId), userRef); var regardingRef = new EntityReference(request.RegardingType, request.RegardingId); - var regarding = RetrieveOrThrow(regardingRef); + var regarding = RetrieveOrThrow(regardingRef, userRef); ValidateTemplateType(template, request.RegardingType); - // The template's subject/body are XSLT stylesheets rendered against the regarding - // record and the sending user. Verified against a live org: the merged values (and - // XSLT whitespace handling) match the platform. var entities = new Dictionary { [request.RegardingType] = regarding }; + + // The sending user is a second merge source, but never at the regarding record's + // expense: a template regarding a systemuser must merge that user, not the caller. var sender = db.GetEntityOrNull(userRef); - if (sender != null) + if (sender != null && !entities.ContainsKey(sender.LogicalName)) entities[sender.LogicalName] = sender; var email = request.Target; diff --git a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs index a7215897..a5270897 100644 --- a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs +++ b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs @@ -1,6 +1,8 @@ using DG.Tools.XrmMockup; using Microsoft.Xrm.Sdk; +using System; using System.Collections.Generic; +using System.ServiceModel; using Xunit; namespace DG.XrmMockupTest @@ -27,6 +29,17 @@ public class TestEmailTemplateRenderer "E-mail Address: ]]>" + "]]>
"; + private const string LookupXslt = + "" + + "" + + ""; + + // Well-formed XML, but 'contact/' is not a valid XPath expression. + private const string MalformedXslt = + "" + + "" + + ""; + [Fact] public void RendersStaticSubject() { @@ -63,10 +76,8 @@ public void RendersBodyWithRegardingAndSenderValues() var result = EmailTemplateRenderer.Render(RealBodyXslt, entities); - // Values are merged from the regarding contact and the sending systemuser. - // The "MrSmith" concatenation (no space) is verified against real Dataverse output: - // SendEmailFromTemplate against a live org renders this same template as "Dear MrSmith ," - // because XSLT strips the whitespace-only stylesheet text node between the two values. + // "MrSmith" has no space because XSLT strips the whitespace-only text node the + // stylesheet places between the two values. Dataverse renders it the same way. Assert.Contains("Dear MrSmith", result); Assert.Contains("Name: Admin User", result); Assert.Contains("Street Address: 123 Main St", result); @@ -104,5 +115,30 @@ public void ReturnsNullForNullInput() { Assert.Null(EmailTemplateRenderer.Render(null, new Dictionary())); } + + [Fact] + public void ThrowsWhenStylesheetDoesNotCompile() + { + Assert.Throws( + () => EmailTemplateRenderer.Render(MalformedXslt, new Dictionary())); + } + + [Fact] + public void MergesLookupAsRecordId() + { + var accountId = new Guid("3c2e0869-d1a6-f111-b8de-70a8a57d382b"); + var entities = new Dictionary + { + // The name is populated to prove it is deliberately not what gets merged. + ["contact"] = new Entity("contact") + { + ["parentcustomerid"] = new EntityReference("account", accountId) { Name = "Probe Account A/S" } + } + }; + + var result = EmailTemplateRenderer.Render(LookupXslt, entities); + + Assert.Equal("company={3C2E0869-D1A6-F111-B8DE-70A8A57D382B}", result); + } } } diff --git a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs index 91f74735..3c81deba 100644 --- a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs +++ b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs @@ -15,6 +15,31 @@ public class TestSendEmailFromTemplate : UnitTestBase { public TestSendEmailFromTemplate(XrmMockupFixture fixture) : base(fixture) { } + // The subject/body below are XSLT stylesheets in the same shape Dataverse stores them in. + private const string SubjectXslt = + "" + + "" + + ""; + + private const string BodyXslt = + "" + + "" + + "Dear ]]>Valued Customer" + + "" + + "]]>"; + + // Merges a field from the sending systemuser rather than the regarding record. + private const string SenderBodyXslt = + "" + + "" + + ""; + + // Well-formed XML, but 'contact/' is not a valid XPath expression. + private const string MalformedXslt = + "" + + "" + + ""; + private Email BuildEmail(Contact recipient) { return new Email @@ -43,7 +68,10 @@ private int ObjectTypeCode(string logicalName) private Template CreateContactTemplate() => CreateContactTemplate(SubjectXslt, BodyXslt); - private Template CreateContactTemplate(string subject, string body) + private Template CreateContactTemplate(string subject, string body) => + CreateTemplate(subject, body, Contact.EntityLogicalName); + + private Template CreateTemplate(string subject, string body, string boundTo) { var template = new Template { @@ -53,9 +81,8 @@ private Template CreateContactTemplate(string subject, string body) IsPersonal = false, LanguageCode = 1033 }; - // templatetypecode is an OptionSet-backed EntityName attribute, so XrmMockup stores it - // as the entity's integer object type code rather than the logical-name string. - template["templatetypecode"] = ObjectTypeCode(Contact.EntityLogicalName); + // Stored as the entity's integer object type code - see ValidateTemplateType. + template["templatetypecode"] = ObjectTypeCode(boundTo); template.Id = orgAdminService.Create(template); return template; } @@ -95,19 +122,6 @@ public void TestSendEmailFromTemplateCreatesAndSendsEmail() } } - // The subject/body below are XSLT stylesheets in the same shape Dataverse stores them in. - private const string SubjectXslt = - "" + - "" + - ""; - - private const string BodyXslt = - "" + - "" + - "Dear ]]>Valued Customer" + - "" + - "]]>"; - [Fact] public void TestSendEmailFromTemplateRendersTemplateContent() { @@ -145,13 +159,6 @@ public void TestSendEmailFromTemplateRendersTemplateContent() Assert.Equal(email_statecode.Completed, email.StateCode); } - // A body stylesheet that merges a field from the sending systemuser rather than the - // regarding record. The handler adds the executing user to the render context. - private const string SenderBodyXslt = - "" + - "" + - ""; - [Fact] public void TestSendEmailFromTemplateMergesSenderFields() { @@ -182,6 +189,37 @@ public void TestSendEmailFromTemplateMergesSenderFields() Assert.Equal("From: Sender", email.Description); } + [Fact] + public void TestSendEmailFromTemplateRegardingUserWinsOverSender() + { + // Regarding record and sender share the systemuser key in the render context. The + // regarding user must win, otherwise a user template silently merges the caller. + orgAdminService.Update(new Entity("systemuser", crm.AdminUser.Id) { ["firstname"] = "Caller" }); + orgAdminService.Update(new Entity("systemuser", testUser1.Id) { ["firstname"] = "Regarding" }); + + var contact = new Contact { FirstName = "Test", EMailAddress1 = "user@test.com" }; + contact.Id = orgAdminUIService.Create(contact); + + var template = CreateTemplate(SubjectXslt, SenderBodyXslt, "systemuser"); + + var request = new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = template.Id, + RegardingId = testUser1.Id, + RegardingType = "systemuser" + }; + + var response = orgAdminUIService.Execute(request) as SendEmailFromTemplateResponse; + Assert.NotNull(response); + + var email = orgAdminService + .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("description")) + .ToEntity(); + + Assert.Equal("From: Regarding", email.Description); + } + [Fact] public void TestSendEmailFromTemplateRendersPlainTextTemplate() { @@ -264,15 +302,27 @@ public void TestSendEmailFromTemplateThrowsWhenTemplateTypeMismatch() var contact = new Contact { FirstName = "Test", EMailAddress1 = "test@test.com" }; contact.Id = orgAdminUIService.Create(contact); - // Template is bound to 'account' but the regarding record is a contact. - var template = new Template + var template = CreateTemplate(SubjectXslt, BodyXslt, Account.EntityLogicalName); + + var request = new SendEmailFromTemplateRequest { - Title = "Mismatch", - Subject = SubjectXslt, - Body = BodyXslt + Target = BuildEmail(contact), + TemplateId = template.Id, + RegardingId = contact.Id, + RegardingType = Contact.EntityLogicalName }; - template["templatetypecode"] = ObjectTypeCode(Account.EntityLogicalName); - template.Id = orgAdminService.Create(template); + + Assert.Throws(() => orgAdminUIService.Execute(request)); + } + + [Fact] + public void TestSendEmailFromTemplateThrowsWhenTemplateDoesNotCompile() + { + var contact = new Contact { FirstName = "Test", EMailAddress1 = "broken@test.com" }; + contact.Id = orgAdminUIService.Create(contact); + + // A broken stylesheet must fault, not put raw XSLT markup in the sent e-mail. + var template = CreateContactTemplate(SubjectXslt, MalformedXslt); var request = new SendEmailFromTemplateRequest { @@ -284,5 +334,25 @@ public void TestSendEmailFromTemplateThrowsWhenTemplateTypeMismatch() Assert.Throws(() => orgAdminUIService.Execute(request)); } + + [Fact] + public void TestSendEmailFromTemplateThrowsWhenCallerCannotReadTemplate() + { + var contact = new Contact { FirstName = "Test", EMailAddress1 = "denied@test.com" }; + contact.Id = orgAdminUIService.Create(contact); + + var template = CreateContactTemplate(); + + var request = new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = template.Id, + RegardingId = contact.Id, + RegardingType = Contact.EntityLogicalName + }; + + var ex = Assert.Throws(() => testUser1Service.Execute(request)); + Assert.Contains("template", ex.Message); + } } } From e948cdc21628e7612425c79b8f1ad6de2cad0ecd Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Thu, 3 Sep 2026 10:24:33 +0200 Subject: [PATCH 10/14] Tighten comments and strengthen SendEmailFromTemplate tests Comments: cut the class and method docs down to what the code does not already say, dropped provenance notes that belong in the PR, and stopped re-explaining the document at every level. Added one comment that was missing - the empty-value skip in BuildDataDocument looks like a trivial null guard but is what lets xsl:otherwise defaults fire. Tests: * ThrowsWhenRegardingMissing omitted both RegardingId and RegardingType, so the RegardingType guard was never executed. Split into two tests. * Every negative test now asserts the fault message. Seven guards all raise FaultException, so these tests previously passed regardless of which one fired - including the permission test, whose "template" substring also matched the record-not-found message. * MergesScalarAttributesInvariantly covers AttributeToString's option set, money, bool, DateTime, int and decimal cases, none of which were exercised. * UsesXsltDefaultsWhenAttributeIsEmpty covers the empty-value skip. * New cases: null Target, non-email Target, missing regarding record, template without a templatetypecode, and a null record dictionary. * The rendered body is asserted with one Assert.Equal on the exact string instead of three Contains that could not catch lost punctuation or leaked markup. Helpers stay local to the test class - that is the convention throughout this suite (see TestLeads.cs); there is no shared test-data location to move them to. 690 tests pass, net462 builds clean. --- .../Internal/EmailTemplateRenderer.cs | 38 +-- .../SendEmailFromTemplateRequestHandler.cs | 16 +- .../TestEmailTemplateRenderer.cs | 128 +++++--- .../TestSendEmailFromTemplate.cs | 278 +++++++++--------- 4 files changed, 243 insertions(+), 217 deletions(-) diff --git a/src/XrmMockup365/Internal/EmailTemplateRenderer.cs b/src/XrmMockup365/Internal/EmailTemplateRenderer.cs index 15da9017..ff426a18 100644 --- a/src/XrmMockup365/Internal/EmailTemplateRenderer.cs +++ b/src/XrmMockup365/Internal/EmailTemplateRenderer.cs @@ -10,28 +10,21 @@ namespace DG.Tools.XrmMockup { /// - /// Renders Dynamics e-mail template content. In Dataverse a template's subject and - /// body attributes are XSLT stylesheets (method="text") that transform a - /// <data> document built from the records the e-mail draws from (the regarding - /// record and the sending user). This reproduces that mechanism so the merged text matches - /// what the platform produces. + /// Renders an e-mail template's subject or body. Dataverse stores these as XSLT stylesheets + /// that transform a <data> document built from the records the e-mail draws from. + /// Values that are not stylesheets are literal text and pass through unchanged. /// internal static class EmailTemplateRenderer { - /// The raw template attribute value. /// - /// The records available to the template, keyed by logical name. Each becomes a child of - /// <data> (e.g. <contact>, <systemuser>) with one - /// element per populated attribute. + /// Records the stylesheet may select from. Keys become element names, so a contact keyed + /// "contact" is addressed as contact/lastname. /// - /// The merged text, or the value unchanged if it is not a stylesheet. - /// The value is a stylesheet but does not compile or apply. public static string Render(string templateField, IReadOnlyDictionary entitiesByLogicalName) { if (string.IsNullOrWhiteSpace(templateField)) return templateField; - // Real Dataverse templates are XSLT. Anything else is treated as literal text. if (templateField.IndexOf("xsl:stylesheet", StringComparison.OrdinalIgnoreCase) < 0) return templateField; @@ -41,8 +34,8 @@ public static string Render(string templateField, IReadOnlyDictionary - /// Builds the <data> document the stylesheet selects its merge values from. - /// + /// Builds the document the stylesheet selects its merge values from. private static XmlDocument BuildDataDocument(IReadOnlyDictionary entitiesByLogicalName) { var document = new XmlDocument(); @@ -82,6 +73,9 @@ private static XmlDocument BuildDataDocument(IReadOnlyDictionary foreach (var attribute in pair.Value.Attributes) { var text = AttributeToString(attribute.Value); + + // An empty element and a missing one differ to the stylesheet: xsl:when treats + // a missing node as false and falls through to its xsl:otherwise default. if (string.IsNullOrEmpty(text)) continue; @@ -94,9 +88,7 @@ private static XmlDocument BuildDataDocument(IReadOnlyDictionary return document; } - /// - /// Flattens an attribute to the text a stylesheet's xsl:value-of would select. - /// + /// Flattens an attribute to the text the stylesheet will select. private static string AttributeToString(object value) { switch (value) @@ -106,10 +98,10 @@ private static string AttributeToString(object value) case string s: return s; case EntityReference reference: - // Dataverse merges a lookup as the record id in registry format (verified - // against a live org), not as the display name. + // Dataverse merges a lookup as the record id, not the display name. return reference.Id.ToString("B").ToUpperInvariant(); case OptionSetValue optionSet: + // Likewise the raw value rather than the option label. return optionSet.Value.ToString(CultureInfo.InvariantCulture); case Money money: return money.Value.ToString(CultureInfo.InvariantCulture); diff --git a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs index 096d6824..e26afd9f 100644 --- a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs +++ b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs @@ -12,8 +12,7 @@ internal class SendEmailFromTemplateRequestHandler : RequestHandler { public SendEmailFromTemplateRequestHandler(Core core, XrmDb db, MetadataSkeleton metadata, Security security) : base(core, db, metadata, security, "SendEmailFromTemplate") { } - // Dataverse throws when a referenced record does not exist or the caller cannot read it; - // mirror that rather than silently sending an empty or unmerged e-mail. + // Dataverse fails the send rather than merging an unreadable record as blanks. private Entity RetrieveOrThrow(EntityReference reference, EntityReference userRef) { var entity = db.GetEntityOrNull(reference) @@ -25,10 +24,9 @@ private Entity RetrieveOrThrow(EntityReference reference, EntityReference userRe return entity; } - // A template is bound to an entity type via templatetypecode; Dataverse rejects a regarding - // record of a different type. templatetypecode is an EntityName attribute, stored as the - // integer object type code when its metadata carries an option set and as the logical name - // otherwise (see DbAttributeTypeMap), so both shapes are accepted. + // Dataverse rejects a regarding record whose type differs from the template's. Depending on + // the attribute's metadata (see DbAttributeTypeMap), templatetypecode arrives as an + // OptionSetValue, an int, or the logical name. private void ValidateTemplateType(Entity template, string regardingType) { if (!template.Attributes.TryGetValue("templatetypecode", out var rawTypeCode) || rawTypeCode == null) @@ -83,8 +81,7 @@ internal override OrganizationResponse Execute(OrganizationRequest orgRequest, E var entities = new Dictionary { [request.RegardingType] = regarding }; - // The sending user is a second merge source, but never at the regarding record's - // expense: a template regarding a systemuser must merge that user, not the caller. + // A template regarding a systemuser must merge that user, not the caller. var sender = db.GetEntityOrNull(userRef); if (sender != null && !entities.ContainsKey(sender.LogicalName)) entities[sender.LogicalName] = sender; @@ -94,8 +91,7 @@ internal override OrganizationResponse Execute(OrganizationRequest orgRequest, E email["subject"] = EmailTemplateRenderer.Render(template.GetAttributeValue("subject"), entities); email["description"] = EmailTemplateRenderer.Render(template.GetAttributeValue("body"), entities); - // Delegate to the existing Create and SendEmail handlers so plugins, security - // and status transitions are applied consistently. + // Going through Create and SendEmail keeps plugins, security and status consistent. var emailId = ((CreateResponse)core.Execute(new CreateRequest { Target = email }, userRef)).id; core.Execute(new SendEmailRequest { EmailId = emailId, IssueSend = true }, userRef); diff --git a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs index a5270897..108e77cd 100644 --- a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs +++ b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs @@ -8,18 +8,17 @@ namespace DG.XrmMockupTest { /// - /// Unit tests for the XSLT-based template rendering used by SendEmailFromTemplate. The - /// stylesheets below are the actual subject/body of the built-in "Thank you for registering - /// with us" contact template in Dataverse. + /// Tests the XSLT rendering behind SendEmailFromTemplate. The subject and body below are the + /// actual stylesheets of the built-in "Thank you for registering with us" contact template. /// public class TestEmailTemplateRenderer { - private const string RealSubjectXslt = + private const string SubjectXslt = "" + "" + ""; - private const string RealBodyXslt = + private const string BodyXslt = "" + "" + "Dear ]]>" + @@ -34,21 +33,34 @@ public class TestEmailTemplateRenderer "" + ""; + private const string ScalarsXslt = + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + // Well-formed XML, but 'contact/' is not a valid XPath expression. private const string MalformedXslt = "" + "" + ""; + private static Dictionary Context(Entity contact, Entity user = null) + { + var entities = new Dictionary { ["contact"] = contact }; + if (user != null) + entities["systemuser"] = user; + return entities; + } + [Fact] public void RendersStaticSubject() { - var entities = new Dictionary - { - ["contact"] = new Entity("contact") - }; - - var result = EmailTemplateRenderer.Render(RealSubjectXslt, entities); + var result = EmailTemplateRenderer.Render(SubjectXslt, Context(new Entity("contact"))); Assert.Equal("Thank you for registering with us", result); } @@ -63,18 +75,9 @@ public void RendersBodyWithRegardingAndSenderValues() ["address1_line1"] = "123 Main St", ["emailaddress1"] = "smith@test.com" }; - var user = new Entity("systemuser") - { - ["fullname"] = "Admin User" - }; + var user = new Entity("systemuser") { ["fullname"] = "Admin User" }; - var entities = new Dictionary - { - ["contact"] = contact, - ["systemuser"] = user - }; - - var result = EmailTemplateRenderer.Render(RealBodyXslt, entities); + var result = EmailTemplateRenderer.Render(BodyXslt, Context(contact, user)); // "MrSmith" has no space because XSLT strips the whitespace-only text node the // stylesheet places between the two values. Dataverse renders it the same way. @@ -87,13 +90,9 @@ public void RendersBodyWithRegardingAndSenderValues() [Fact] public void UsesXsltDefaultsWhenAttributesMissing() { - // contact has neither lastname nor address1_line1 -> the defaults apply. - var entities = new Dictionary - { - ["contact"] = new Entity("contact") { ["salutation"] = "Ms" } - }; + var contact = new Entity("contact") { ["salutation"] = "Ms" }; - var result = EmailTemplateRenderer.Render(RealBodyXslt, entities); + var result = EmailTemplateRenderer.Render(BodyXslt, Context(contact)); Assert.Contains("Dear Ms", result); Assert.Contains("Valued Customer", result); @@ -101,11 +100,56 @@ public void UsesXsltDefaultsWhenAttributesMissing() } [Fact] - public void ReturnsPlainTextTemplatesUnchanged() + public void UsesXsltDefaultsWhenAttributeIsEmpty() + { + // An empty value must be omitted from the document, not written as an empty element, + // or xsl:when would match it and suppress the default. + var contact = new Entity("contact") { ["salutation"] = "Ms", ["lastname"] = "" }; + + var result = EmailTemplateRenderer.Render(BodyXslt, Context(contact)); + + Assert.Contains("Valued Customer", result); + } + + [Fact] + public void MergesLookupAsRecordId() + { + var accountId = new Guid("3c2e0869-d1a6-f111-b8de-70a8a57d382b"); + // The name is populated to prove it is deliberately not what gets merged. + var contact = new Entity("contact") + { + ["parentcustomerid"] = new EntityReference("account", accountId) { Name = "Probe Account A/S" } + }; + + var result = EmailTemplateRenderer.Render(LookupXslt, Context(contact)); + + Assert.Equal("company={3C2E0869-D1A6-F111-B8DE-70A8A57D382B}", result); + } + + [Fact] + public void MergesScalarAttributesInvariantly() { - var entities = new Dictionary(); + var contact = new Entity("contact") + { + ["gendercode"] = new OptionSetValue(1), + ["creditlimit"] = new Money(1234.5m), + ["donotemail"] = true, + ["birthdate"] = new DateTime(2026, 1, 2, 3, 4, 5), + ["numberofchildren"] = 42, + ["exchangerate"] = 3.5m + }; - var result = EmailTemplateRenderer.Render("Just plain text", entities); + var result = EmailTemplateRenderer.Render(ScalarsXslt, Context(contact)); + + Assert.Equal( + "option=1|money=1234.5|flag=True|date=01/02/2026 03:04:05|int=42|decimal=3.5", + result); + } + + [Fact] + public void ReturnsPlainTextTemplatesUnchanged() + { + var result = EmailTemplateRenderer.Render("Just plain text", new Dictionary()); Assert.Equal("Just plain text", result); } @@ -117,28 +161,16 @@ public void ReturnsNullForNullInput() } [Fact] - public void ThrowsWhenStylesheetDoesNotCompile() + public void RendersWithoutAnyRecords() { - Assert.Throws( - () => EmailTemplateRenderer.Render(MalformedXslt, new Dictionary())); + Assert.Equal("Thank you for registering with us", EmailTemplateRenderer.Render(SubjectXslt, null)); } [Fact] - public void MergesLookupAsRecordId() + public void ThrowsWhenStylesheetDoesNotCompile() { - var accountId = new Guid("3c2e0869-d1a6-f111-b8de-70a8a57d382b"); - var entities = new Dictionary - { - // The name is populated to prove it is deliberately not what gets merged. - ["contact"] = new Entity("contact") - { - ["parentcustomerid"] = new EntityReference("account", accountId) { Name = "Probe Account A/S" } - } - }; - - var result = EmailTemplateRenderer.Render(LookupXslt, entities); - - Assert.Equal("company={3C2E0869-D1A6-F111-B8DE-70A8A57D382B}", result); + Assert.Throws( + () => EmailTemplateRenderer.Render(MalformedXslt, new Dictionary())); } } } diff --git a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs index 3c81deba..b8a4142a 100644 --- a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs +++ b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs @@ -15,7 +15,7 @@ public class TestSendEmailFromTemplate : UnitTestBase { public TestSendEmailFromTemplate(XrmMockupFixture fixture) : base(fixture) { } - // The subject/body below are XSLT stylesheets in the same shape Dataverse stores them in. + // Stylesheets in the shape Dataverse stores template subject/body in. private const string SubjectXslt = "" + "" + @@ -28,7 +28,6 @@ public TestSendEmailFromTemplate(XrmMockupFixture fixture) : base(fixture) { } "" + "]]>"; - // Merges a field from the sending systemuser rather than the regarding record. private const string SenderBodyXslt = "" + "" + @@ -40,6 +39,13 @@ public TestSendEmailFromTemplate(XrmMockupFixture fixture) : base(fixture) { } "" + ""; + private Contact CreateRecipient(string email = "test@test.com") + { + var contact = new Contact { FirstName = "Test", EMailAddress1 = email }; + contact.Id = orgAdminUIService.Create(contact); + return contact; + } + private Email BuildEmail(Contact recipient) { return new Email @@ -73,41 +79,39 @@ private Template CreateContactTemplate(string subject, string body) => private Template CreateTemplate(string subject, string body, string boundTo) { - var template = new Template - { - Title = "Registration", - Subject = subject, - Body = body, - IsPersonal = false, - LanguageCode = 1033 - }; - // Stored as the entity's integer object type code - see ValidateTemplateType. + var template = NewTemplate(subject, body); + // Set late-bound: the generated TemplateTypeCode is a string and cannot hold the + // integer object type code the database stores. template["templatetypecode"] = ObjectTypeCode(boundTo); template.Id = orgAdminService.Create(template); return template; } - [Fact] - public void TestSendEmailFromTemplateCreatesAndSendsEmail() + private static Template NewTemplate(string subject, string body) => new Template { - var contact = new Contact - { - FirstName = "Test", - EMailAddress1 = "test@test.com" - }; - contact.Id = orgAdminUIService.Create(contact); - - var template = CreateContactTemplate(); - - var request = new SendEmailFromTemplateRequest + Title = "Registration", + Subject = subject, + Body = body, + IsPersonal = false, + LanguageCode = 1033 + }; + + private SendEmailFromTemplateRequest BuildRequest(Template template, Contact regarding) => + new SendEmailFromTemplateRequest { - Target = BuildEmail(contact), + Target = BuildEmail(regarding), TemplateId = template.Id, - RegardingId = contact.Id, + RegardingId = regarding.Id, RegardingType = Contact.EntityLogicalName }; - var response = orgAdminUIService.Execute(request) as SendEmailFromTemplateResponse; + [Fact] + public void TestSendEmailFromTemplateCreatesAndSendsEmail() + { + var contact = CreateRecipient(); + var template = CreateContactTemplate(); + + var response = orgAdminUIService.Execute(BuildRequest(template, contact)) as SendEmailFromTemplateResponse; Assert.NotNull(response); Assert.NotEqual(Guid.Empty, response.Id); @@ -135,51 +139,27 @@ public void TestSendEmailFromTemplateRendersTemplateContent() }; contact.Id = orgAdminUIService.Create(contact); - var request = new SendEmailFromTemplateRequest - { - Target = BuildEmail(contact), - TemplateId = template.Id, - RegardingId = contact.Id, - RegardingType = Contact.EntityLogicalName - }; - - var response = orgAdminUIService.Execute(request) as SendEmailFromTemplateResponse; + var response = orgAdminUIService.Execute(BuildRequest(template, contact)) as SendEmailFromTemplateResponse; Assert.NotNull(response); - Assert.NotEqual(Guid.Empty, response.Id); var email = orgAdminService - .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("subject", "description", "statecode")) + .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("subject", "description")) .ToEntity(); - // Subject and body were rendered from the template, overriding the caller's subject. + // The template replaces the caller's subject, and the body is fully determined by it. Assert.Equal("Thank you for registering with us", email.Subject); - Assert.Contains("Dear", email.Description); - Assert.Contains("Smith", email.Description); - Assert.Contains("smith@test.com", email.Description); - Assert.Equal(email_statecode.Completed, email.StateCode); + Assert.Equal("

Dear Smith, your e-mail is smith@test.com.

", email.Description); } [Fact] public void TestSendEmailFromTemplateMergesSenderFields() { - // Give the user that orgAdminUIService runs as a known, mergeable value, then verify - // it flows through the sender side of the render context (not the regarding record). - orgAdminService.Update(new Entity("systemuser", crm.AdminUser.Id) { ["firstname"] = "Sender" }); - - var contact = new Contact { FirstName = "Test", EMailAddress1 = "sender@test.com" }; - contact.Id = orgAdminUIService.Create(contact); + orgAdminService.Update(new SystemUser { Id = crm.AdminUser.Id, FirstName = "Sender" }); + var contact = CreateRecipient("sender@test.com"); var template = CreateContactTemplate(SubjectXslt, SenderBodyXslt); - var request = new SendEmailFromTemplateRequest - { - Target = BuildEmail(contact), - TemplateId = template.Id, - RegardingId = contact.Id, - RegardingType = Contact.EntityLogicalName - }; - - var response = orgAdminUIService.Execute(request) as SendEmailFromTemplateResponse; + var response = orgAdminUIService.Execute(BuildRequest(template, contact)) as SendEmailFromTemplateResponse; Assert.NotNull(response); var email = orgAdminService @@ -192,25 +172,20 @@ public void TestSendEmailFromTemplateMergesSenderFields() [Fact] public void TestSendEmailFromTemplateRegardingUserWinsOverSender() { - // Regarding record and sender share the systemuser key in the render context. The - // regarding user must win, otherwise a user template silently merges the caller. - orgAdminService.Update(new Entity("systemuser", crm.AdminUser.Id) { ["firstname"] = "Caller" }); - orgAdminService.Update(new Entity("systemuser", testUser1.Id) { ["firstname"] = "Regarding" }); - - var contact = new Contact { FirstName = "Test", EMailAddress1 = "user@test.com" }; - contact.Id = orgAdminUIService.Create(contact); + // Regarding record and sender compete for the systemuser key in the render context. + orgAdminService.Update(new SystemUser { Id = crm.AdminUser.Id, FirstName = "Caller" }); + orgAdminService.Update(new SystemUser { Id = testUser1.Id, FirstName = "Regarding" }); - var template = CreateTemplate(SubjectXslt, SenderBodyXslt, "systemuser"); + var contact = CreateRecipient("user@test.com"); + var template = CreateTemplate(SubjectXslt, SenderBodyXslt, SystemUser.EntityLogicalName); - var request = new SendEmailFromTemplateRequest + var response = orgAdminUIService.Execute(new SendEmailFromTemplateRequest { Target = BuildEmail(contact), TemplateId = template.Id, RegardingId = testUser1.Id, - RegardingType = "systemuser" - }; - - var response = orgAdminUIService.Execute(request) as SendEmailFromTemplateResponse; + RegardingType = SystemUser.EntityLogicalName + }) as SendEmailFromTemplateResponse; Assert.NotNull(response); var email = orgAdminService @@ -223,21 +198,10 @@ public void TestSendEmailFromTemplateRegardingUserWinsOverSender() [Fact] public void TestSendEmailFromTemplateRendersPlainTextTemplate() { - var contact = new Contact { FirstName = "Test", EMailAddress1 = "plain@test.com" }; - contact.Id = orgAdminUIService.Create(contact); - - // Not every template is an XSLT stylesheet; literal text must pass through unchanged. + var contact = CreateRecipient("plain@test.com"); var template = CreateContactTemplate("Plain subject", "Plain body text"); - var request = new SendEmailFromTemplateRequest - { - Target = BuildEmail(contact), - TemplateId = template.Id, - RegardingId = contact.Id, - RegardingType = Contact.EntityLogicalName - }; - - var response = orgAdminUIService.Execute(request) as SendEmailFromTemplateResponse; + var response = orgAdminUIService.Execute(BuildRequest(template, contact)) as SendEmailFromTemplateResponse; Assert.NotNull(response); var email = orgAdminService @@ -248,111 +212,153 @@ public void TestSendEmailFromTemplateRendersPlainTextTemplate() Assert.Equal("Plain body text", email.Description); } + [Fact] + public void TestSendEmailFromTemplateSendsWhenTemplateHasNoTypeCode() + { + var contact = CreateRecipient("notype@test.com"); + + // Without a templatetypecode there is nothing to compare the regarding type against, + // so the send proceeds rather than faulting. + var template = NewTemplate(SubjectXslt, BodyXslt); + template.Id = orgAdminService.Create(template); + + var response = orgAdminUIService.Execute(BuildRequest(template, contact)) as SendEmailFromTemplateResponse; + + Assert.NotNull(response); + Assert.NotEqual(Guid.Empty, response.Id); + } + [Fact] public void TestSendEmailFromTemplateThrowsWhenTemplateIdMissing() { - var contact = new Contact { FirstName = "Test", EMailAddress1 = "test@test.com" }; - contact.Id = orgAdminUIService.Create(contact); + var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { + Target = new Email(), + RegardingId = Guid.NewGuid(), + RegardingType = Contact.EntityLogicalName + })); + + Assert.Equal("Template id should be set.", ex.Message); + } - var request = new SendEmailFromTemplateRequest + [Fact] + public void TestSendEmailFromTemplateThrowsWhenTargetMissing() + { + var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest { - Target = BuildEmail(contact), - RegardingId = contact.Id, + TemplateId = Guid.NewGuid(), + RegardingId = Guid.NewGuid(), RegardingType = Contact.EntityLogicalName - }; + })); - Assert.Throws(() => orgAdminUIService.Execute(request)); + Assert.Equal("Target email is missing.", ex.Message); } [Fact] - public void TestSendEmailFromTemplateThrowsWhenRegardingMissing() + public void TestSendEmailFromTemplateThrowsWhenTargetIsNotAnEmail() { - var contact = new Contact { FirstName = "Test", EMailAddress1 = "test@test.com" }; - contact.Id = orgAdminUIService.Create(contact); + var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { + Target = new Contact(), + TemplateId = Guid.NewGuid(), + RegardingId = Guid.NewGuid(), + RegardingType = Contact.EntityLogicalName + })); + + Assert.Equal("Target must be an email entity.", ex.Message); + } - var request = new SendEmailFromTemplateRequest + [Fact] + public void TestSendEmailFromTemplateThrowsWhenRegardingIdMissing() + { + var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest { - Target = BuildEmail(contact), - TemplateId = Guid.NewGuid() - }; + Target = new Email(), + TemplateId = Guid.NewGuid(), + RegardingType = Contact.EntityLogicalName + })); + + Assert.Equal("Regarding id should be set.", ex.Message); + } + + [Fact] + public void TestSendEmailFromTemplateThrowsWhenRegardingTypeMissing() + { + var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { + Target = new Email(), + TemplateId = Guid.NewGuid(), + RegardingId = Guid.NewGuid() + })); - Assert.Throws(() => orgAdminUIService.Execute(request)); + Assert.Equal("Regarding type should be set.", ex.Message); } [Fact] public void TestSendEmailFromTemplateThrowsWhenTemplateDoesNotExist() { - var contact = new Contact { FirstName = "Test", EMailAddress1 = "test@test.com" }; - contact.Id = orgAdminUIService.Create(contact); + var contact = CreateRecipient(); - var request = new SendEmailFromTemplateRequest + var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest { Target = BuildEmail(contact), TemplateId = Guid.NewGuid(), RegardingId = contact.Id, RegardingType = Contact.EntityLogicalName - }; + })); - Assert.Throws(() => orgAdminUIService.Execute(request)); + Assert.Contains("template With Id =", ex.Message); } [Fact] - public void TestSendEmailFromTemplateThrowsWhenTemplateTypeMismatch() + public void TestSendEmailFromTemplateThrowsWhenRegardingDoesNotExist() { - var contact = new Contact { FirstName = "Test", EMailAddress1 = "test@test.com" }; - contact.Id = orgAdminUIService.Create(contact); - - var template = CreateTemplate(SubjectXslt, BodyXslt, Account.EntityLogicalName); + var contact = CreateRecipient(); + var template = CreateContactTemplate(); - var request = new SendEmailFromTemplateRequest + var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest { Target = BuildEmail(contact), TemplateId = template.Id, - RegardingId = contact.Id, + RegardingId = Guid.NewGuid(), RegardingType = Contact.EntityLogicalName - }; + })); - Assert.Throws(() => orgAdminUIService.Execute(request)); + Assert.Contains("contact With Id =", ex.Message); } [Fact] - public void TestSendEmailFromTemplateThrowsWhenTemplateDoesNotCompile() + public void TestSendEmailFromTemplateThrowsWhenTemplateTypeMismatch() { - var contact = new Contact { FirstName = "Test", EMailAddress1 = "broken@test.com" }; - contact.Id = orgAdminUIService.Create(contact); + var contact = CreateRecipient(); + var template = CreateTemplate(SubjectXslt, BodyXslt, Account.EntityLogicalName); + + var ex = Assert.Throws(() => orgAdminUIService.Execute(BuildRequest(template, contact))); - // A broken stylesheet must fault, not put raw XSLT markup in the sent e-mail. + Assert.Contains("template type does not match", ex.Message); + } + + [Fact] + public void TestSendEmailFromTemplateThrowsWhenTemplateDoesNotCompile() + { + var contact = CreateRecipient("broken@test.com"); var template = CreateContactTemplate(SubjectXslt, MalformedXslt); - var request = new SendEmailFromTemplateRequest - { - Target = BuildEmail(contact), - TemplateId = template.Id, - RegardingId = contact.Id, - RegardingType = Contact.EntityLogicalName - }; + var ex = Assert.Throws(() => orgAdminUIService.Execute(BuildRequest(template, contact))); - Assert.Throws(() => orgAdminUIService.Execute(request)); + // The render fault must surface, not be swallowed somewhere in the pipeline. + Assert.Contains("could not be rendered", ex.Message); } [Fact] public void TestSendEmailFromTemplateThrowsWhenCallerCannotReadTemplate() { - var contact = new Contact { FirstName = "Test", EMailAddress1 = "denied@test.com" }; - contact.Id = orgAdminUIService.Create(contact); - + var contact = CreateRecipient("denied@test.com"); var template = CreateContactTemplate(); - var request = new SendEmailFromTemplateRequest - { - Target = BuildEmail(contact), - TemplateId = template.Id, - RegardingId = contact.Id, - RegardingType = Contact.EntityLogicalName - }; + var ex = Assert.Throws(() => testUser1Service.Execute(BuildRequest(template, contact))); - var ex = Assert.Throws(() => testUser1Service.Execute(request)); - Assert.Contains("template", ex.Message); + Assert.Contains("does not have permission to read entity 'template'", ex.Message); } } } From 6650ac01c5f4404a574b4bc2871c9478736a6a5c Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Thu, 3 Sep 2026 10:32:46 +0200 Subject: [PATCH 11/14] Consolidate SendEmailFromTemplate tests 26 tests was disproportionate for one request handler. Down to 13 with no behaviour left uncovered: * The five argument guards shared one test. Each case still asserts its own message, so it still proves which guard fired. * The template-missing and regarding-missing cases share one test - both are the same RetrieveOrThrow path. * Lookup and scalar merge formatting share one test; they were two tests asserting the same thing, that our output matches the platform's. * Missing and empty attribute defaults share one test. * Dropped the plain-text and malformed-stylesheet tests at handler level - both duplicated the renderer unit tests - along with the static-subject, no-records and no-templatetypecode cases. 677 tests pass, net462 builds clean. --- .../TestEmailTemplateRenderer.cs | 88 ++------ .../TestSendEmailFromTemplate.cs | 191 +++++------------- 2 files changed, 65 insertions(+), 214 deletions(-) diff --git a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs index 108e77cd..4326a991 100644 --- a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs +++ b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs @@ -8,16 +8,11 @@ namespace DG.XrmMockupTest { /// - /// Tests the XSLT rendering behind SendEmailFromTemplate. The subject and body below are the - /// actual stylesheets of the built-in "Thank you for registering with us" contact template. + /// Tests the XSLT rendering behind SendEmailFromTemplate. The body below is the actual + /// stylesheet of the built-in "Thank you for registering with us" contact template. /// public class TestEmailTemplateRenderer { - private const string SubjectXslt = - "" + - "" + - ""; - private const string BodyXslt = "" + "" + @@ -28,15 +23,11 @@ public class TestEmailTemplateRenderer "E-mail Address: ]]>" + "]]>"; - private const string LookupXslt = - "" + - "" + - ""; - - private const string ScalarsXslt = + private const string ValuesXslt = "" + "" + - "" + + "" + + "" + "" + "" + "" + @@ -57,14 +48,6 @@ private static Dictionary Context(Entity contact, Entity user = return entities; } - [Fact] - public void RendersStaticSubject() - { - var result = EmailTemplateRenderer.Render(SubjectXslt, Context(new Entity("contact"))); - - Assert.Equal("Thank you for registering with us", result); - } - [Fact] public void RendersBodyWithRegardingAndSenderValues() { @@ -88,9 +71,11 @@ public void RendersBodyWithRegardingAndSenderValues() } [Fact] - public void UsesXsltDefaultsWhenAttributesMissing() + public void UsesXsltDefaultsWhenAttributeIsMissingOrEmpty() { - var contact = new Entity("contact") { ["salutation"] = "Ms" }; + // An empty value must be omitted from the document rather than written as an empty + // element, or xsl:when would match it and suppress the default. + var contact = new Entity("contact") { ["salutation"] = "Ms", ["lastname"] = "" }; var result = EmailTemplateRenderer.Render(BodyXslt, Context(contact)); @@ -100,37 +85,12 @@ public void UsesXsltDefaultsWhenAttributesMissing() } [Fact] - public void UsesXsltDefaultsWhenAttributeIsEmpty() - { - // An empty value must be omitted from the document, not written as an empty element, - // or xsl:when would match it and suppress the default. - var contact = new Entity("contact") { ["salutation"] = "Ms", ["lastname"] = "" }; - - var result = EmailTemplateRenderer.Render(BodyXslt, Context(contact)); - - Assert.Contains("Valued Customer", result); - } - - [Fact] - public void MergesLookupAsRecordId() - { - var accountId = new Guid("3c2e0869-d1a6-f111-b8de-70a8a57d382b"); - // The name is populated to prove it is deliberately not what gets merged. - var contact = new Entity("contact") - { - ["parentcustomerid"] = new EntityReference("account", accountId) { Name = "Probe Account A/S" } - }; - - var result = EmailTemplateRenderer.Render(LookupXslt, Context(contact)); - - Assert.Equal("company={3C2E0869-D1A6-F111-B8DE-70A8A57D382B}", result); - } - - [Fact] - public void MergesScalarAttributesInvariantly() + public void MergesValuesTheWayDataverseDoes() { var contact = new Entity("contact") { + // The lookup name is populated to prove the id, not the name, is what merges. + ["parentcustomerid"] = new EntityReference("account", new Guid("3c2e0869-d1a6-f111-b8de-70a8a57d382b")) { Name = "Probe Account A/S" }, ["gendercode"] = new OptionSetValue(1), ["creditlimit"] = new Money(1234.5m), ["donotemail"] = true, @@ -139,31 +99,19 @@ public void MergesScalarAttributesInvariantly() ["exchangerate"] = 3.5m }; - var result = EmailTemplateRenderer.Render(ScalarsXslt, Context(contact)); + var result = EmailTemplateRenderer.Render(ValuesXslt, Context(contact)); Assert.Equal( - "option=1|money=1234.5|flag=True|date=01/02/2026 03:04:05|int=42|decimal=3.5", + "lookup={3C2E0869-D1A6-F111-B8DE-70A8A57D382B}|option=1|money=1234.5|flag=True|" + + "date=01/02/2026 03:04:05|int=42|decimal=3.5", result); } [Fact] - public void ReturnsPlainTextTemplatesUnchanged() - { - var result = EmailTemplateRenderer.Render("Just plain text", new Dictionary()); - - Assert.Equal("Just plain text", result); - } - - [Fact] - public void ReturnsNullForNullInput() - { - Assert.Null(EmailTemplateRenderer.Render(null, new Dictionary())); - } - - [Fact] - public void RendersWithoutAnyRecords() + public void ReturnsNonStylesheetValuesUnchanged() { - Assert.Equal("Thank you for registering with us", EmailTemplateRenderer.Render(SubjectXslt, null)); + Assert.Equal("Just plain text", EmailTemplateRenderer.Render("Just plain text", Context(new Entity("contact")))); + Assert.Null(EmailTemplateRenderer.Render(null, Context(new Entity("contact")))); } [Fact] diff --git a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs index b8a4142a..a88450f0 100644 --- a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs +++ b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs @@ -33,12 +33,6 @@ public TestSendEmailFromTemplate(XrmMockupFixture fixture) : base(fixture) { } "" + ""; - // Well-formed XML, but 'contact/' is not a valid XPath expression. - private const string MalformedXslt = - "" + - "" + - ""; - private Contact CreateRecipient(string email = "test@test.com") { var contact = new Contact { FirstName = "Test", EMailAddress1 = email }; @@ -79,7 +73,14 @@ private Template CreateContactTemplate(string subject, string body) => private Template CreateTemplate(string subject, string body, string boundTo) { - var template = NewTemplate(subject, body); + var template = new Template + { + Title = "Registration", + Subject = subject, + Body = body, + IsPersonal = false, + LanguageCode = 1033 + }; // Set late-bound: the generated TemplateTypeCode is a string and cannot hold the // integer object type code the database stores. template["templatetypecode"] = ObjectTypeCode(boundTo); @@ -87,15 +88,6 @@ private Template CreateTemplate(string subject, string body, string boundTo) return template; } - private static Template NewTemplate(string subject, string body) => new Template - { - Title = "Registration", - Subject = subject, - Body = body, - IsPersonal = false, - LanguageCode = 1033 - }; - private SendEmailFromTemplateRequest BuildRequest(Template template, Contact regarding) => new SendEmailFromTemplateRequest { @@ -196,135 +188,58 @@ public void TestSendEmailFromTemplateRegardingUserWinsOverSender() } [Fact] - public void TestSendEmailFromTemplateRendersPlainTextTemplate() - { - var contact = CreateRecipient("plain@test.com"); - var template = CreateContactTemplate("Plain subject", "Plain body text"); - - var response = orgAdminUIService.Execute(BuildRequest(template, contact)) as SendEmailFromTemplateResponse; - Assert.NotNull(response); - - var email = orgAdminService - .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("subject", "description")) - .ToEntity(); - - Assert.Equal("Plain subject", email.Subject); - Assert.Equal("Plain body text", email.Description); - } - - [Fact] - public void TestSendEmailFromTemplateSendsWhenTemplateHasNoTypeCode() - { - var contact = CreateRecipient("notype@test.com"); - - // Without a templatetypecode there is nothing to compare the regarding type against, - // so the send proceeds rather than faulting. - var template = NewTemplate(SubjectXslt, BodyXslt); - template.Id = orgAdminService.Create(template); - - var response = orgAdminUIService.Execute(BuildRequest(template, contact)) as SendEmailFromTemplateResponse; - - Assert.NotNull(response); - Assert.NotEqual(Guid.Empty, response.Id); - } - - [Fact] - public void TestSendEmailFromTemplateThrowsWhenTemplateIdMissing() - { - var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest - { - Target = new Email(), - RegardingId = Guid.NewGuid(), - RegardingType = Contact.EntityLogicalName - })); - - Assert.Equal("Template id should be set.", ex.Message); - } - - [Fact] - public void TestSendEmailFromTemplateThrowsWhenTargetMissing() - { - var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest - { - TemplateId = Guid.NewGuid(), - RegardingId = Guid.NewGuid(), - RegardingType = Contact.EntityLogicalName - })); - - Assert.Equal("Target email is missing.", ex.Message); - } - - [Fact] - public void TestSendEmailFromTemplateThrowsWhenTargetIsNotAnEmail() + public void TestSendEmailFromTemplateValidatesRequest() { - var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest - { - Target = new Contact(), - TemplateId = Guid.NewGuid(), - RegardingId = Guid.NewGuid(), - RegardingType = Contact.EntityLogicalName - })); + // All five guards raise FaultException, so each case asserts the message to prove the + // guard it names is the one that fired. + var id = Guid.NewGuid(); - Assert.Equal("Target must be an email entity.", ex.Message); - } + Assert.Equal("Template id should be set.", Assert.Throws(() => + orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { Target = new Email(), RegardingId = id, RegardingType = Contact.EntityLogicalName })).Message); - [Fact] - public void TestSendEmailFromTemplateThrowsWhenRegardingIdMissing() - { - var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest - { - Target = new Email(), - TemplateId = Guid.NewGuid(), - RegardingType = Contact.EntityLogicalName - })); + Assert.Equal("Target email is missing.", Assert.Throws(() => + orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { TemplateId = id, RegardingId = id, RegardingType = Contact.EntityLogicalName })).Message); - Assert.Equal("Regarding id should be set.", ex.Message); - } + Assert.Equal("Target must be an email entity.", Assert.Throws(() => + orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { Target = new Contact(), TemplateId = id, RegardingId = id, RegardingType = Contact.EntityLogicalName })).Message); - [Fact] - public void TestSendEmailFromTemplateThrowsWhenRegardingTypeMissing() - { - var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest - { - Target = new Email(), - TemplateId = Guid.NewGuid(), - RegardingId = Guid.NewGuid() - })); + Assert.Equal("Regarding id should be set.", Assert.Throws(() => + orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { Target = new Email(), TemplateId = id, RegardingType = Contact.EntityLogicalName })).Message); - Assert.Equal("Regarding type should be set.", ex.Message); + Assert.Equal("Regarding type should be set.", Assert.Throws(() => + orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { Target = new Email(), TemplateId = id, RegardingId = id })).Message); } [Fact] - public void TestSendEmailFromTemplateThrowsWhenTemplateDoesNotExist() - { - var contact = CreateRecipient(); - - var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest - { - Target = BuildEmail(contact), - TemplateId = Guid.NewGuid(), - RegardingId = contact.Id, - RegardingType = Contact.EntityLogicalName - })); - - Assert.Contains("template With Id =", ex.Message); - } - - [Fact] - public void TestSendEmailFromTemplateThrowsWhenRegardingDoesNotExist() + public void TestSendEmailFromTemplateThrowsWhenReferencedRecordDoesNotExist() { var contact = CreateRecipient(); var template = CreateContactTemplate(); - var ex = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest - { - Target = BuildEmail(contact), - TemplateId = template.Id, - RegardingId = Guid.NewGuid(), - RegardingType = Contact.EntityLogicalName - })); - - Assert.Contains("contact With Id =", ex.Message); + var missingTemplate = Assert.Throws(() => + orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = Guid.NewGuid(), + RegardingId = contact.Id, + RegardingType = Contact.EntityLogicalName + })); + Assert.Contains("template With Id =", missingTemplate.Message); + + var missingRegarding = Assert.Throws(() => + orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = template.Id, + RegardingId = Guid.NewGuid(), + RegardingType = Contact.EntityLogicalName + })); + Assert.Contains("contact With Id =", missingRegarding.Message); } [Fact] @@ -338,18 +253,6 @@ public void TestSendEmailFromTemplateThrowsWhenTemplateTypeMismatch() Assert.Contains("template type does not match", ex.Message); } - [Fact] - public void TestSendEmailFromTemplateThrowsWhenTemplateDoesNotCompile() - { - var contact = CreateRecipient("broken@test.com"); - var template = CreateContactTemplate(SubjectXslt, MalformedXslt); - - var ex = Assert.Throws(() => orgAdminUIService.Execute(BuildRequest(template, contact))); - - // The render fault must surface, not be swallowed somewhere in the pipeline. - Assert.Contains("could not be rendered", ex.Message); - } - [Fact] public void TestSendEmailFromTemplateThrowsWhenCallerCannotReadTemplate() { From 4f054b174be11de5ed605ede0ff1c6726c38449d Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Thu, 3 Sep 2026 10:40:45 +0200 Subject: [PATCH 12/14] Return the merged body in Dataverse's HTML envelope SendEmailFromTemplate wrote the merged body to email.description as bare text, where a live org returns it wrapped in a minimal HTML document with LF line breaks and a trailing newline. Shipping a new handler with a known-wrong output defeats the point of the mock, so it belongs here rather than in a follow-up. Not reproduced: Dataverse also appends a tracking token to the subject. That is org-configurable, so doing it unconditionally would be wrong. --- .../SendEmailFromTemplateRequestHandler.cs | 15 ++++++++++++++- .../XrmMockup365Test/TestSendEmailFromTemplate.cs | 12 +++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs index e26afd9f..84bc45cd 100644 --- a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs +++ b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs @@ -54,6 +54,18 @@ private void ValidateTemplateType(Entity template, string regardingType) } } + // Dataverse returns the merged body wrapped in a minimal HTML document, with LF line + // breaks and a trailing newline, rather than as bare text. + private static string WrapInHtmlEnvelope(string body) + { + if (body == null) + return null; + + return "\n\n" + + "\n" + + "\n\n" + body + "\n\n\n"; + } + internal override OrganizationResponse Execute(OrganizationRequest orgRequest, EntityReference userRef) { var request = MakeRequest(orgRequest); @@ -89,7 +101,8 @@ internal override OrganizationResponse Execute(OrganizationRequest orgRequest, E var email = request.Target; email["regardingobjectid"] = regardingRef; email["subject"] = EmailTemplateRenderer.Render(template.GetAttributeValue("subject"), entities); - email["description"] = EmailTemplateRenderer.Render(template.GetAttributeValue("body"), entities); + email["description"] = WrapInHtmlEnvelope( + EmailTemplateRenderer.Render(template.GetAttributeValue("body"), entities)); // Going through Create and SendEmail keeps plugins, security and status consistent. var emailId = ((CreateResponse)core.Execute(new CreateRequest { Target = email }, userRef)).id; diff --git a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs index a88450f0..175c91b2 100644 --- a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs +++ b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs @@ -88,6 +88,12 @@ private Template CreateTemplate(string subject, string body, string boundTo) return template; } + // Dataverse wraps the merged body in this envelope: LF line breaks, trailing newline. + private static string HtmlEnvelope(string body) => + "\n\n" + + "\n" + + "\n\n" + body + "\n\n\n"; + private SendEmailFromTemplateRequest BuildRequest(Template template, Contact regarding) => new SendEmailFromTemplateRequest { @@ -140,7 +146,7 @@ public void TestSendEmailFromTemplateRendersTemplateContent() // The template replaces the caller's subject, and the body is fully determined by it. Assert.Equal("Thank you for registering with us", email.Subject); - Assert.Equal("

Dear Smith, your e-mail is smith@test.com.

", email.Description); + Assert.Equal(HtmlEnvelope("

Dear Smith, your e-mail is smith@test.com.

"), email.Description); } [Fact] @@ -158,7 +164,7 @@ public void TestSendEmailFromTemplateMergesSenderFields() .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("description")) .ToEntity(); - Assert.Equal("From: Sender", email.Description); + Assert.Equal(HtmlEnvelope("From: Sender"), email.Description); } [Fact] @@ -184,7 +190,7 @@ public void TestSendEmailFromTemplateRegardingUserWinsOverSender() .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("description")) .ToEntity(); - Assert.Equal("From: Regarding", email.Description); + Assert.Equal(HtmlEnvelope("From: Regarding"), email.Description); } [Fact] From 10a2f69d0a28868fd2d3324768b8594ab662e4e3 Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Thu, 3 Sep 2026 11:18:47 +0200 Subject: [PATCH 13/14] Match live Dataverse behaviour in SendEmailFromTemplate Probing a live org showed several places where the handler diverged: - A template regarding a systemuser merges the sender, not the regarding user, and regardingobjectid stays empty because the lookup cannot target systemuser. - A plain-text subject or body fails with an XmlException instead of passing through. - Booleans merge as 1/0; dates use the user's date and time format joined by a non-breaking space. - Guard messages and the order of the template-type check now follow Dataverse. - A missing sender defaults to the caller. - The caller's Target entity is cloned rather than mutated. Tests updated to match, with comments stating which formats were verified live and which are approximations. Claude-Session: https://claude.ai/code/session_014gKqFnQsbap92wRFrZu7u3 --- .../Internal/EmailTemplateRenderer.cs | 39 ++++--- .../SendEmailFromTemplateRequestHandler.cs | 110 +++++++++++++----- .../TestEmailTemplateRenderer.cs | 21 +++- .../TestSendEmailFromTemplate.cs | 87 ++++++++++---- 4 files changed, 186 insertions(+), 71 deletions(-) diff --git a/src/XrmMockup365/Internal/EmailTemplateRenderer.cs b/src/XrmMockup365/Internal/EmailTemplateRenderer.cs index ff426a18..ddf0427c 100644 --- a/src/XrmMockup365/Internal/EmailTemplateRenderer.cs +++ b/src/XrmMockup365/Internal/EmailTemplateRenderer.cs @@ -12,7 +12,7 @@ namespace DG.Tools.XrmMockup /// /// Renders an e-mail template's subject or body. Dataverse stores these as XSLT stylesheets /// that transform a <data> document built from the records the e-mail draws from. - /// Values that are not stylesheets are literal text and pass through unchanged. + /// A value that is not a stylesheet fails the send, as it does in Dataverse. /// internal static class EmailTemplateRenderer { @@ -22,10 +22,7 @@ internal static class EmailTemplateRenderer /// public static string Render(string templateField, IReadOnlyDictionary entitiesByLogicalName) { - if (string.IsNullOrWhiteSpace(templateField)) - return templateField; - - if (templateField.IndexOf("xsl:stylesheet", StringComparison.OrdinalIgnoreCase) < 0) + if (string.IsNullOrEmpty(templateField)) return templateField; try @@ -47,7 +44,15 @@ public static string Render(string templateField, IReadOnlyDictionary return document; } - /// Flattens an attribute to the text the stylesheet will select. + /// + /// Flattens an attribute to the text the stylesheet will select. Lookup, option set, boolean + /// and integer formats were checked against a live org. Dataverse formats dates, money and + /// floating point numbers per the user's settings and the currency, which the mock does not + /// model; those use Dataverse's 1033 defaults or the invariant culture. + /// private static string AttributeToString(object value) { switch (value) @@ -98,17 +108,20 @@ private static string AttributeToString(object value) case string s: return s; case EntityReference reference: - // Dataverse merges a lookup as the record id, not the display name. + // The record id, not the display name. return reference.Id.ToString("B").ToUpperInvariant(); case OptionSetValue optionSet: - // Likewise the raw value rather than the option label. + // The raw value, not the option label. return optionSet.Value.ToString(CultureInfo.InvariantCulture); - case Money money: - return money.Value.ToString(CultureInfo.InvariantCulture); case bool boolean: - return boolean ? "True" : "False"; + return boolean ? "1" : "0"; case DateTime dateTime: - return dateTime.ToString(CultureInfo.InvariantCulture); + // Dataverse joins the user's date and time formats with a non-breaking space. + return dateTime.ToString("M/d/yyyy", CultureInfo.InvariantCulture) + " " + + dateTime.ToString("h:mm tt", CultureInfo.InvariantCulture); + case Money money: + // Dataverse prefixes the currency symbol, e.g. "kr.1,234.50". + return money.Value.ToString("N2", CultureInfo.InvariantCulture); case IFormattable formattable: return formattable.ToString(null, CultureInfo.InvariantCulture); default: diff --git a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs index 84bc45cd..887107ba 100644 --- a/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs +++ b/src/XrmMockup365/Requests/SendEmailFromTemplateRequestHandler.cs @@ -1,9 +1,12 @@ using DG.Tools.XrmMockup.Database; +using DG.Tools.XrmMockup.Internal; using Microsoft.Crm.Sdk.Messages; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; +using Microsoft.Xrm.Sdk.Metadata; using System; using System.Collections.Generic; +using System.Linq; using System.ServiceModel; namespace DG.Tools.XrmMockup @@ -24,38 +27,65 @@ private Entity RetrieveOrThrow(EntityReference reference, EntityReference userRe return entity; } - // Dataverse rejects a regarding record whose type differs from the template's. Depending on - // the attribute's metadata (see DbAttributeTypeMap), templatetypecode arrives as an - // OptionSetValue, an int, or the logical name. - private void ValidateTemplateType(Entity template, string regardingType) + // Depending on the attribute's metadata (see DbAttributeTypeMap), templatetypecode is stored + // as an OptionSetValue, an int or the logical name. Dataverse itself returns the logical name. + private int? GetTemplateTypeCode(Entity template) { - if (!template.Attributes.TryGetValue("templatetypecode", out var rawTypeCode) || rawTypeCode == null) - return; + switch (template.GetAttributeValue("templatetypecode")) + { + case OptionSetValue optionSet: + return optionSet.Value; + case int typeCode: + return typeCode; + case string logicalName: + metadata.EntityMetadata.TryGetValue(logicalName, out var typeMetadata); + return typeMetadata?.ObjectTypeCode; + default: + return null; + } + } + // Dataverse rejects a regarding record whose type differs from the template's, and does so + // before it looks the regarding record up. + private void ValidateTemplateType(Entity template, string regardingType) + { + var templateTypeCode = GetTemplateTypeCode(template); metadata.EntityMetadata.TryGetValue(regardingType, out var regardingMetadata); var regardingTypeCode = regardingMetadata?.ObjectTypeCode; - if (regardingTypeCode == null) - return; - bool matches; - if (rawTypeCode is OptionSetValue optionSet) - matches = optionSet.Value == regardingTypeCode.Value; - else if (rawTypeCode is int typeCode) - matches = typeCode == regardingTypeCode.Value; - else if (rawTypeCode is string logicalName) - matches = logicalName == regardingType; - else + if (templateTypeCode == null || regardingTypeCode == null) return; - if (!matches) + if (templateTypeCode != regardingTypeCode) { throw new FaultException( - $"The template type does not match the regarding object type '{regardingType}'."); + $"Template type is incorrect for given objectType {regardingTypeCode} != {templateTypeCode} template.templatetypecode"); } } + // Dataverse leaves regardingobjectid empty when the lookup cannot target the regarding + // type, as with a systemuser template. + private bool CanBeRegarding(string logicalName) + { + if (!metadata.EntityMetadata.TryGetValue("email", out var emailMetadata)) + return true; + + var regarding = emailMetadata.Attributes? + .OfType() + .FirstOrDefault(a => a.LogicalName == "regardingobjectid"); + + return regarding?.Targets == null || regarding.Targets.Contains(logicalName); + } + + private static bool HasSender(Entity email) + { + return email.GetAttributeValue("from")?.Entities.Count > 0; + } + // Dataverse returns the merged body wrapped in a minimal HTML document, with LF line - // breaks and a trailing newline, rather than as bare text. + // breaks and a trailing newline, rather than as bare text. It also re-serialises the + // markup inside (lower-cased tags, line breaks around block elements), which the mock + // leaves as the stylesheet produced it. private static string WrapInHtmlEnvelope(string body) { if (body == null) @@ -70,36 +100,54 @@ internal override OrganizationResponse Execute(OrganizationRequest orgRequest, E { var request = MakeRequest(orgRequest); + // Messages and their order follow Dataverse. if (request.TemplateId == Guid.Empty) throw new FaultException("Template id should be set."); if (request.Target == null) - throw new FaultException("Target email is missing."); + throw new FaultException("Required field 'Target' is missing for RequestName='SendEmailFromTemplate'"); if (request.Target.LogicalName != "email") - throw new FaultException("Target must be an email entity."); + throw new FaultException($"Cannot merge 2 Business entities of different types. Current Entity Type: {request.Target.LogicalName}, Entity To Merge Type: email"); if (request.RegardingId == Guid.Empty) - throw new FaultException("Regarding id should be set."); + throw new FaultException("Object id should be set."); - if (string.IsNullOrEmpty(request.RegardingType)) - throw new FaultException("Regarding type should be set."); + if (request.RegardingType == null) + throw new FaultException("Required field 'RegardingType' is missing for RequestName='SendEmailFromTemplate'"); + + if (request.RegardingType.Length == 0) + throw new FaultException("Expected non-empty string."); var template = RetrieveOrThrow(new EntityReference("template", request.TemplateId), userRef); + ValidateTemplateType(template, request.RegardingType); + var regardingRef = new EntityReference(request.RegardingType, request.RegardingId); var regarding = RetrieveOrThrow(regardingRef, userRef); - ValidateTemplateType(template, request.RegardingType); - + // The stylesheet addresses the regarding record by its logical name and the sending + // user as "systemuser". When the regarding record is itself a systemuser, Dataverse + // still merges the sender, so the sender is added last and wins the key. var entities = new Dictionary { [request.RegardingType] = regarding }; - - // A template regarding a systemuser must merge that user, not the caller. var sender = db.GetEntityOrNull(userRef); - if (sender != null && !entities.ContainsKey(sender.LogicalName)) + if (sender != null) entities[sender.LogicalName] = sender; - var email = request.Target; - email["regardingobjectid"] = regardingRef; + // Dataverse works on its own copy and leaves the caller's Target untouched. + var email = request.Target.CloneEntity(); + + if (CanBeRegarding(request.RegardingType)) + email["regardingobjectid"] = regardingRef; + + // Dataverse sends from the caller when the e-mail names no sender. + if (!HasSender(email)) + { + email["from"] = new EntityCollection(new List + { + new Entity("activityparty") { ["partyid"] = userRef } + }); + } + email["subject"] = EmailTemplateRenderer.Render(template.GetAttributeValue("subject"), entities); email["description"] = WrapInHtmlEnvelope( EmailTemplateRenderer.Render(template.GetAttributeValue("body"), entities)); diff --git a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs index 4326a991..dc045faa 100644 --- a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs +++ b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs @@ -85,7 +85,7 @@ public void UsesXsltDefaultsWhenAttributeIsMissingOrEmpty() } [Fact] - public void MergesValuesTheWayDataverseDoes() + public void FlattensAttributeValuesForTheStylesheet() { var contact = new Entity("contact") { @@ -101,17 +101,28 @@ public void MergesValuesTheWayDataverseDoes() var result = EmailTemplateRenderer.Render(ValuesXslt, Context(contact)); + // Lookup, option set, boolean and integer match a live org. The date uses Dataverse's + // default user format; money lacks the currency symbol Dataverse prefixes. Assert.Equal( - "lookup={3C2E0869-D1A6-F111-B8DE-70A8A57D382B}|option=1|money=1234.5|flag=True|" + - "date=01/02/2026 03:04:05|int=42|decimal=3.5", + "lookup={3C2E0869-D1A6-F111-B8DE-70A8A57D382B}|option=1|money=1,234.50|flag=1|" + + "date=1/2/2026 3:04 AM|int=42|decimal=3.5", result); } [Fact] - public void ReturnsNonStylesheetValuesUnchanged() + public void PassesMissingValueThrough() { - Assert.Equal("Just plain text", EmailTemplateRenderer.Render("Just plain text", Context(new Entity("contact")))); Assert.Null(EmailTemplateRenderer.Render(null, Context(new Entity("contact")))); + Assert.Equal("", EmailTemplateRenderer.Render("", Context(new Entity("contact")))); + } + + [Fact] + public void ThrowsForPlainTextLikeDataverse() + { + var ex = Assert.Throws( + () => EmailTemplateRenderer.Render("Just plain text", Context(new Entity("contact")))); + + Assert.Contains("xslXml is Just plain text", ex.Message); } [Fact] diff --git a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs index 175c91b2..d92fd8c8 100644 --- a/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs +++ b/tests/XrmMockup365Test/TestSendEmailFromTemplate.cs @@ -81,8 +81,9 @@ private Template CreateTemplate(string subject, string body, string boundTo) IsPersonal = false, LanguageCode = 1033 }; - // Set late-bound: the generated TemplateTypeCode is a string and cannot hold the - // integer object type code the database stores. + // Dataverse returns templatetypecode as the logical name, but the test metadata gives + // the attribute an option set, so the mock only stores the integer object type code + // (see DbAttributeTypeMap). The generated string property therefore cannot be used. template["templatetypecode"] = ObjectTypeCode(boundTo); template.Id = orgAdminService.Create(template); return template; @@ -95,21 +96,28 @@ private static string HtmlEnvelope(string body) => "\n\n" + body + "\n\n\n"; private SendEmailFromTemplateRequest BuildRequest(Template template, Contact regarding) => + BuildRequest(BuildEmail(regarding), template, regarding); + + private SendEmailFromTemplateRequest BuildRequest(Email target, Template template, Contact regarding) => new SendEmailFromTemplateRequest { - Target = BuildEmail(regarding), + Target = target, TemplateId = template.Id, RegardingId = regarding.Id, RegardingType = Contact.EntityLogicalName }; + private Email RetrieveEmail(Guid id, params string[] columns) => + orgAdminService.Retrieve(Email.EntityLogicalName, id, new ColumnSet(columns)).ToEntity(); + [Fact] public void TestSendEmailFromTemplateCreatesAndSendsEmail() { var contact = CreateRecipient(); var template = CreateContactTemplate(); + var target = BuildEmail(contact); - var response = orgAdminUIService.Execute(BuildRequest(template, contact)) as SendEmailFromTemplateResponse; + var response = orgAdminUIService.Execute(BuildRequest(target, template, contact)) as SendEmailFromTemplateResponse; Assert.NotNull(response); Assert.NotEqual(Guid.Empty, response.Id); @@ -122,6 +130,11 @@ public void TestSendEmailFromTemplateCreatesAndSendsEmail() Assert.Equal(email_statuscode.PendingSend, email.StatusCode); Assert.Equal(contact.Id, email.RegardingObjectId.Id); } + + // The caller's entity is left as it was; Dataverse merges into its own copy. + Assert.Equal("Test Email From Template", target.Subject); + Assert.False(target.Contains("description")); + Assert.False(target.Contains("regardingobjectid")); } [Fact] @@ -140,11 +153,11 @@ public void TestSendEmailFromTemplateRendersTemplateContent() var response = orgAdminUIService.Execute(BuildRequest(template, contact)) as SendEmailFromTemplateResponse; Assert.NotNull(response); - var email = orgAdminService - .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("subject", "description")) - .ToEntity(); + var email = RetrieveEmail(response.Id, "subject", "description"); // The template replaces the caller's subject, and the body is fully determined by it. + // The envelope matches Dataverse byte for byte; the markup inside does not, since + // Dataverse re-serialises it (lower-cased tags, line breaks around block elements). Assert.Equal("Thank you for registering with us", email.Subject); Assert.Equal(HtmlEnvelope("

Dear Smith, your e-mail is smith@test.com.

"), email.Description); } @@ -160,17 +173,17 @@ public void TestSendEmailFromTemplateMergesSenderFields() var response = orgAdminUIService.Execute(BuildRequest(template, contact)) as SendEmailFromTemplateResponse; Assert.NotNull(response); - var email = orgAdminService - .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("description")) - .ToEntity(); + var email = RetrieveEmail(response.Id, "description"); Assert.Equal(HtmlEnvelope("From: Sender"), email.Description); } [Fact] - public void TestSendEmailFromTemplateRegardingUserWinsOverSender() + public void TestSendEmailFromTemplateSenderWinsOverRegardingUser() { // Regarding record and sender compete for the systemuser key in the render context. + // Dataverse merges the sender and leaves regardingobjectid empty, since the lookup + // cannot target a systemuser. orgAdminService.Update(new SystemUser { Id = crm.AdminUser.Id, FirstName = "Caller" }); orgAdminService.Update(new SystemUser { Id = testUser1.Id, FirstName = "Regarding" }); @@ -186,39 +199,59 @@ public void TestSendEmailFromTemplateRegardingUserWinsOverSender() }) as SendEmailFromTemplateResponse; Assert.NotNull(response); - var email = orgAdminService - .Retrieve(Email.EntityLogicalName, response.Id, new ColumnSet("description")) - .ToEntity(); + var email = RetrieveEmail(response.Id, "description", "regardingobjectid"); - Assert.Equal(HtmlEnvelope("From: Regarding"), email.Description); + Assert.Equal(HtmlEnvelope("From: Caller"), email.Description); + Assert.Null(email.RegardingObjectId); + } + + [Fact] + public void TestSendEmailFromTemplateSendsFromCallerWhenSenderIsMissing() + { + var contact = CreateRecipient("nosender@test.com"); + var template = CreateContactTemplate(); + var target = BuildEmail(contact); + target.from = null; + + var response = orgAdminUIService.Execute(BuildRequest(target, template, contact)) as SendEmailFromTemplateResponse; + Assert.NotNull(response); + + var email = RetrieveEmail(response.Id, "from", "statuscode"); + + Assert.Equal(crm.AdminUser.Id, Assert.Single(email.from).PartyId.Id); + Assert.Equal(email_statuscode.PendingSend, email.StatusCode); } [Fact] public void TestSendEmailFromTemplateValidatesRequest() { - // All five guards raise FaultException, so each case asserts the message to prove the - // guard it names is the one that fired. + // All guards raise FaultException, so each case asserts the message to prove the guard + // it names is the one that fired. The messages are Dataverse's own. var id = Guid.NewGuid(); Assert.Equal("Template id should be set.", Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest { Target = new Email(), RegardingId = id, RegardingType = Contact.EntityLogicalName })).Message); - Assert.Equal("Target email is missing.", Assert.Throws(() => + Assert.Equal("Required field 'Target' is missing for RequestName='SendEmailFromTemplate'", Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest { TemplateId = id, RegardingId = id, RegardingType = Contact.EntityLogicalName })).Message); - Assert.Equal("Target must be an email entity.", Assert.Throws(() => + Assert.Equal("Cannot merge 2 Business entities of different types. Current Entity Type: contact, Entity To Merge Type: email", Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest { Target = new Contact(), TemplateId = id, RegardingId = id, RegardingType = Contact.EntityLogicalName })).Message); - Assert.Equal("Regarding id should be set.", Assert.Throws(() => + Assert.Equal("Object id should be set.", Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest { Target = new Email(), TemplateId = id, RegardingType = Contact.EntityLogicalName })).Message); - Assert.Equal("Regarding type should be set.", Assert.Throws(() => + Assert.Equal("Required field 'RegardingType' is missing for RequestName='SendEmailFromTemplate'", Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest { Target = new Email(), TemplateId = id, RegardingId = id })).Message); + + Assert.Equal("Expected non-empty string.", Assert.Throws(() => + orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { Target = new Email(), TemplateId = id, RegardingId = id, RegardingType = "" })).Message); } [Fact] @@ -253,10 +286,20 @@ public void TestSendEmailFromTemplateThrowsWhenTemplateTypeMismatch() { var contact = CreateRecipient(); var template = CreateTemplate(SubjectXslt, BodyXslt, Account.EntityLogicalName); + var expected = $"Template type is incorrect for given objectType {ObjectTypeCode("contact")} != {ObjectTypeCode("account")} template.templatetypecode"; var ex = Assert.Throws(() => orgAdminUIService.Execute(BuildRequest(template, contact))); + Assert.Equal(expected, ex.Message); - Assert.Contains("template type does not match", ex.Message); + // The type is checked before the regarding record is looked up, as in Dataverse. + var missing = Assert.Throws(() => orgAdminUIService.Execute(new SendEmailFromTemplateRequest + { + Target = BuildEmail(contact), + TemplateId = template.Id, + RegardingId = Guid.NewGuid(), + RegardingType = Contact.EntityLogicalName + })); + Assert.Equal(expected, missing.Message); } [Fact] From 50edd483dd499c7ddef1c9111e04281d7710c9f2 Mon Sep 17 00:00:00 2001 From: Bircck <55695195+Bircck@users.noreply.github.com> Date: Thu, 3 Sep 2026 11:26:10 +0200 Subject: [PATCH 14/14] Merge dates with a plain space, as Dataverse does in subjects A live probe of a merged subject shows Dataverse joins date and time with an ordinary space. The   seen in bodies is added by Dataverse's HTML re-serialisation of the body, which the mock does not reproduce. Claude-Session: https://claude.ai/code/session_014gKqFnQsbap92wRFrZu7u3 --- src/XrmMockup365/Internal/EmailTemplateRenderer.cs | 7 ++++--- tests/XrmMockup365Test/TestEmailTemplateRenderer.cs | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/XrmMockup365/Internal/EmailTemplateRenderer.cs b/src/XrmMockup365/Internal/EmailTemplateRenderer.cs index ddf0427c..423a7f60 100644 --- a/src/XrmMockup365/Internal/EmailTemplateRenderer.cs +++ b/src/XrmMockup365/Internal/EmailTemplateRenderer.cs @@ -116,9 +116,10 @@ private static string AttributeToString(object value) case bool boolean: return boolean ? "1" : "0"; case DateTime dateTime: - // Dataverse joins the user's date and time formats with a non-breaking space. - return dateTime.ToString("M/d/yyyy", CultureInfo.InvariantCulture) + " " + - dateTime.ToString("h:mm tt", CultureInfo.InvariantCulture); + // Dataverse's 1033 defaults, in the user's time zone. The mock formats the + // value as stored. (In a body the space arrives as  , added by Dataverse's + // HTML re-serialisation rather than by the merge itself.) + return dateTime.ToString("M/d/yyyy h:mm tt", CultureInfo.InvariantCulture); case Money money: // Dataverse prefixes the currency symbol, e.g. "kr.1,234.50". return money.Value.ToString("N2", CultureInfo.InvariantCulture); diff --git a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs index dc045faa..cb695fc9 100644 --- a/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs +++ b/tests/XrmMockup365Test/TestEmailTemplateRenderer.cs @@ -102,10 +102,10 @@ public void FlattensAttributeValuesForTheStylesheet() var result = EmailTemplateRenderer.Render(ValuesXslt, Context(contact)); // Lookup, option set, boolean and integer match a live org. The date uses Dataverse's - // default user format; money lacks the currency symbol Dataverse prefixes. + // default user format without the time zone shift; money lacks the currency symbol. Assert.Equal( "lookup={3C2E0869-D1A6-F111-B8DE-70A8A57D382B}|option=1|money=1,234.50|flag=1|" + - "date=1/2/2026 3:04 AM|int=42|decimal=3.5", + "date=1/2/2026 3:04 AM|int=42|decimal=3.5", result); }