Skip to content

2.2. Official plugins

Stratis Dermanoutsos edited this page Jun 22, 2026 · 1 revision

Official plugins are first-party packages maintained alongside the core library. Each one ships as a separate NuGet package and adds one placeholder source. Install the ones you need and register them through the AddPlugins callback.

Package Plugin Tag Kind Input
StringTemplates.Configuration ConfigurationTemplatePlugin Configuration Tag-only
StringTemplates.MailKit MimeMessageTemplatePlugin MimeMessage Input-driven MimeMessage

StringTemplates.Configuration

Resolves values from the application's IConfiguration (appsettings, environment variables, secrets, etc.).

1. Installation

dotnet add package StringTemplates.Configuration

For more information, visit nuget.org/StringTemplates.Configuration.

2. Registration

ConfigurationTemplatePlugin is a tag-only plugin whose constructor takes an IConfiguration (supplied automatically by the DI container):

using StringTemplates;
using StringTemplates.Plugins;

builder.Services.AddStringTemplates(options => options.AddPlugins(opts => opts
    .AddPluginSingleton<ConfigurationTemplatePlugin>()));

3. Usage

Keys map onto configuration sections. A dot (.) in a placeholder key is translated into the configuration separator (:), so ConnectionStrings.Database reads ConnectionStrings:Database.

var result = templateService.ReplacePlaceholders(
    "DB: {{#Configuration#ConnectionStrings.Database#Configuration#}}");

Other examples:

  • {{#Configuration#ConnectionStrings.Database#Configuration#}}
  • {{#Configuration#KeyVault.Auth.ClientId#Configuration#}}

A key that does not exist in configuration is left untouched.

⚠️ Security note

This plugin can read any configuration value, including environment variables. It is intended for internal use only.

Do not expose it to untrusted input or end users, as it could be used to leak secrets and environment variables.


StringTemplates.MailKit

Resolves values from a MailKit / MimeKit MimeMessage — its subject, recipients, sender, etc. It is an input-driven plugin, so you pass the MimeMessage to ReplacePlaceholders.

1. Installation

dotnet add package StringTemplates.MailKit

For more information, visit nuget.org/StringTemplates.MailKit.

2. Registration

using MimeKit;
using StringTemplates;
using StringTemplates.Plugins;

builder.Services.AddStringTemplates(options => options.AddPlugins(opts => opts
    .AddPluginSingleton<MimeMessageTemplatePlugin, MimeMessage>()));

3. Usage

var message = new MimeMessage();
message.Subject = "Welcome";
message.From.Add(new MailboxAddress("Stratis", "stratis@example.com"));
message.To.Add(new MailboxAddress("Alice", "alice@example.com"));

var result = templateService.ReplacePlaceholders(
    "Hi {{#MimeMessage#To.First.Name#MimeMessage#}}, "
    + "your message \"{{#MimeMessage#Subject#MimeMessage#}}\" "
    + "was sent from {{#MimeMessage#From.First.UserName#MimeMessage#}}.",
    message);

Result:

Hi Alice, your message "Welcome" was sent from stratis.

Supported keys

The same set of keys is available for the From, To, Cc and Bcc address lists. Replace <List> with one of From / To / Cc / Bcc:

Placeholder Resolves to
{{#MimeMessage#<List>#MimeMessage#}} All addresses, comma-joined (e.g. "Alice" <alice@example.com>, ...)
{{#MimeMessage#<List>.Count#MimeMessage#}} Number of addresses
{{#MimeMessage#<List>.First#MimeMessage#}} First full address
{{#MimeMessage#<List>.First.Name#MimeMessage#}} First address' display name
{{#MimeMessage#<List>.First.UserName#MimeMessage#}} First address' local part (before @)
{{#MimeMessage#<List>.Last#MimeMessage#}} Last full address
{{#MimeMessage#<List>.Last.Name#MimeMessage#}} Last address' display name
{{#MimeMessage#<List>.Last.UserName#MimeMessage#}} Last address' local part (before @)
{{#MimeMessage#<List>.Names#MimeMessage#}} All display names, comma-joined

Plus the subject:

Placeholder Resolves to
{{#MimeMessage#Subject#MimeMessage#}} The message subject
{{#MimeMessage#Subject.Length#MimeMessage#}} The subject's length

Notes

  • An empty address list yields an empty string (and Count yields 0).
  • An unknown key, e.g. {{#MimeMessage#Does.Not.Exist#MimeMessage#}}, is left untouched.

References:

Clone this wiki locally