-
-
Notifications
You must be signed in to change notification settings - Fork 0
2.2. Official plugins
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 |
Resolves values from the application's IConfiguration (appsettings, environment variables, secrets, etc.).
dotnet add package StringTemplates.ConfigurationFor more information, visit nuget.org/StringTemplates.Configuration.
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>()));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.
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.
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.
dotnet add package StringTemplates.MailKitFor more information, visit nuget.org/StringTemplates.MailKit.
using MimeKit;
using StringTemplates;
using StringTemplates.Plugins;
builder.Services.AddStringTemplates(options => options.AddPlugins(opts => opts
.AddPluginSingleton<MimeMessageTemplatePlugin, MimeMessage>()));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.
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 |
- An empty address list yields an empty string (and
Countyields0).- An unknown key, e.g.
{{#MimeMessage#Does.Not.Exist#MimeMessage#}}, is left untouched.
References:
Copyright © Stratis Dermanoutsos 2025-2026