Transmitly 0.4.2
dotnet add package Transmitly --version 0.4.2
NuGet\Install-Package Transmitly -Version 0.4.2
<PackageReference Include="Transmitly" Version="0.4.2" />
<PackageVersion Include="Transmitly" Version="0.4.2" />
<PackageReference Include="Transmitly" />
paket add Transmitly --version 0.4.2
#r "nuget: Transmitly, 0.4.2"
#:package Transmitly@0.4.2
#addin nuget:?package=Transmitly&version=0.4.2
#tool nuget:?package=Transmitly&version=0.4.2
Let your .NET application express it's intent to communicate without doing the work in your business logic.
Transmitly is an extensible transactional communications library for .NET. It keeps email, SMS, push, voice, message composition, provider configuration, and delivery handling out of your domain and application logic.
Your application expresses an intent:
var result = await _communicationsClient.DispatchAsync(
"WelcomeKit",
newAccount.EmailAddress,
new { firstName = newAccount.FirstName });
Elsewhere, Transmitly defines what WelcomeKit means: which channels are involved, how content is composed, which providers can deliver it, and how delivery events are handled.
Application
|
| Dispatch("WelcomeKit")
v
Pipeline: WelcomeKit
|
+-- Email ----> SMTP / SendGrid / Mailgun / Infobip
+-- SMS ------> Twilio / Infobip
+-- Push -----> Firebase
+-- Voice ----> Twilio / Infobip
That separation is the point of Transmitly.
When should I use it?
Transmitly is a good fit when:
- transactional communication is becoming infrastructure rather than a single
SendEmail(...)call - provider SDKs, templates, channel decisions, or webhook behavior are leaking into application code
- you have, or expect, multiple message types, channels, or providers
- you want composition and delivery behavior managed in one place
- you want provider or channel changes without rewriting the application workflow that requested the communication
When shouldn't I use it?
If your application sends one kind of email through one provider and that is unlikely to change, a small IEmailSender-style abstraction may be enough.
Three concepts to get started
- Pipeline — a domain-oriented communication intent such as
WelcomeKit,PasswordReset, orOrderProcessing - Channel — how the recipient can receive it: Email, SMS, Voice, or Push Notification
- Channel Provider — the infrastructure that delivers the channel, such as SMTP, SendGrid, Twilio, Infobip, Mailgun, or Firebase
The pipeline is the stable boundary your application talks to. Channels, providers, templates, and delivery behavior can evolve behind it.
Try Transmitly without a provider account
The core package includes simulation support, so your first dispatch does not require an SMTP server, API key, or third-party account.
dotnet add package Transmitly
using Transmitly;
var communicationsClient = new CommunicationsClientBuilder()
.AddSimulationSupport()
.AddPipeline("WelcomeKit", pipeline =>
{
pipeline.AddEmail(
"welcome@my.app".AsIdentityAddress("Welcome"),
email =>
{
email.Subject.AddStringTemplate("Thanks for signing up!");
email.TextBody.AddStringTemplate("Welcome to the app.");
});
})
.BuildClient();
var result = await communicationsClient.DispatchAsync(
"WelcomeKit",
"developer@example.com",
new { });
Console.WriteLine(result.IsSuccessful);
AddSimulationSupport() uses Transmitly's built-in simulation provider. By default, it returns a successful simulated dispatch result so you can exercise the same pipeline model without sending a real communication.
Send through a real provider
When you're ready for real delivery, install only the provider your application uses. For SMTP:
dotnet add package Transmitly.ChannelProvider.Smtp
var communicationsClient = new CommunicationsClientBuilder()
.AddSmtpSupport(options =>
{
options.Host = "smtp.example.com";
options.Port = 587;
options.UserName = "MySMTPUsername";
options.Password = "MyPassword";
})
.AddPipeline("WelcomeKit", pipeline =>
{
pipeline.AddEmail(
"welcome@my.app".AsIdentityAddress("Welcome"),
email => email.Subject.AddStringTemplate("Thanks for signing up!"));
})
.BuildClient();
Your application still dispatches WelcomeKit. It does not become SMTP-specific.
Change providers without changing application intent
Moving email delivery from SMTP to SendGrid is a provider configuration change:
- .AddSmtpSupport(options =>
- {
- options.Host = "smtp.example.com";
- options.Port = 587;
- })
+ .AddSendGridSupport(options =>
+ {
+ options.ApiKey = "MySendGridApi";
+ })
After installing Transmitly.ChannelProvider.SendGrid, the pipeline and calling application can remain unchanged.
The ecosystem is modular by design
Most applications need the Transmitly core package, one or more provider integrations, and optionally a template integration.
Channel providers
| Channel(s) | Integration | Package | |
|---|---|---|---|
| SMTP | Transmitly.ChannelProvider.Smtp | ||
| SendGrid | Transmitly.ChannelProvider.SendGrid | ||
| Mailgun | Transmitly.ChannelProvider.Mailgun | ||
| Email, SMS, Voice | Infobip | Transmitly.ChannelProvider.Infobip | |
| SMS, Voice | Twilio | Transmitly.ChannelProvider.Twilio | |
| Push Notifications | Firebase | Transmitly.ChannelProvider.Firebase |
Optional integrations
- Microsoft.Extensions.DependencyInjection
- ASP.NET Core MVC and AspNet.Mvc for provider webhook/delivery-report integration
- Fluid and Scriban for dynamic template rendering
Literal/string message content can be configured directly in core. Dynamic template rendering is deliberately pluggable so you can choose the engine that fits your application.
Delivery reports
Transmitly provides a consistent delivery-report model so application-level handling does not have to become provider-specific. Third-party providers commonly send later status updates through webhooks; the optional MVC integrations can route those provider-specific payloads into Transmitly's delivery-report handling.
Compatibility
The core project currently targets:
- .NET 10
- .NET 9
- .NET 8
- .NET 6
- .NET Standard 2.0
- .NET Framework 4.8 and 4.7.2
Project status
Transmitly 0.4.0 is production-ready and in production use.
There are additions and refinements planned before 1.0, and the project still reserves room for API evolution while that work lands.
Samples and documentation
Feedback wanted
If you try the quick start and something is confusing, overly abstract, missing, or simply not worth the ceremony, please tell us in GitHub Discussions. API criticism, onboarding friction, unsupported workflows, and "I stopped here because this didn't make sense" are all useful feedback.
For larger proposed changes, starting with a Discussion is the best way to align before implementation.
License
Licensed under the Apache License, Version 2.0.
Copyright (c) Code Impressions, LLC
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 is compatible. net48 is compatible. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.7.2
- No dependencies.
-
.NETFramework 4.8
- No dependencies.
-
.NETStandard 2.0
- No dependencies.
-
net10.0
- No dependencies.
-
net6.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages (22)
Showing the top 5 NuGet packages that depend on Transmitly:
| Package | Downloads |
|---|---|
|
Transmitly.ChannelProvider.Infobip
An Infobip channel provider for the Transmitly library. |
|
|
Transmitly.Microsoft.Extensions.DependencyInjection
A Microsoft dependency injection extension for the Transmitly library. |
|
|
Transmitly.ChannelProvider.Twilio
A channel provider for the Transmitly communications library. |
|
|
Transmitly.ChannelProvider.SendGrid
A channel provider for the Transmitly communications library. |
|
|
Transmitly.ChannelProvider.Infobip.Configuration
An Infobip channel provider configuration for the Transmitly library. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.4.2 | 83 | 10/3/2026 |
| 0.4.1 | 84 | 10/2/2026 |
| 0.4.1-9.ff30448 | 53 | 10/2/2026 |
| 0.4.0 | 1,299 | 7/26/2026 |
| 0.3.1-6.7ea7a14 | 134 | 4/18/2026 |
| 0.3.1-4.3eb4386 | 106 | 4/15/2026 |
| 0.3.1-3.7de1696 | 143 | 4/15/2026 |
| 0.3.0 | 1,519 | 3/25/2026 |
| 0.2.3-10.164330b | 90 | 3/24/2026 |
| 0.2.3-6.30853e7 | 135 | 3/4/2026 |
| 0.2.3-5.aafd9cd | 246 | 3/2/2026 |
| 0.2.3-4.d1db4d3 | 89 | 3/1/2026 |
| 0.2.2 | 167 | 2/21/2026 |
| 0.2.2-45.6d185e8 | 128 | 2/20/2026 |
| 0.2.2-43.80c3e4e | 100 | 2/17/2026 |
| 0.2.2-39.19f2783 | 440 | 1/17/2026 |
| 0.2.2-25.0c842ba | 211 | 12/14/2025 |
| 0.2.2-21.ee87b44 | 136 | 11/30/2025 |
| 0.2.2-17.481be94 | 214 | 8/17/2025 |
| 0.2.2-15.f253ede | 172 | 8/17/2025 |