Hulaki.Email
0.1.0-alpha.2
dotnet add package Hulaki.Email --version 0.1.0-alpha.2
NuGet\Install-Package Hulaki.Email -Version 0.1.0-alpha.2
<PackageReference Include="Hulaki.Email" Version="0.1.0-alpha.2" />
<PackageVersion Include="Hulaki.Email" Version="0.1.0-alpha.2" />
<PackageReference Include="Hulaki.Email" />
paket add Hulaki.Email --version 0.1.0-alpha.2
#r "nuget: Hulaki.Email, 0.1.0-alpha.2"
#:package Hulaki.Email@0.1.0-alpha.2
#addin nuget:?package=Hulaki.Email&version=0.1.0-alpha.2&prerelease
#tool nuget:?package=Hulaki.Email&version=0.1.0-alpha.2&prerelease
Hulaki.Email
Hulaki provider for email, through FreeTierMail.
Status: in development. The API can change until 1.0.
The channel works in one of two modes, set by UseFreeTierMail.
One SMTP server (the default). Set Host, Port, Username and Password:
{
"Hulaki": {
"Channels": {
"email": {
"Host": "smtp.example.org",
"Username": "alerts@example.org",
"Password": "from user secrets",
"From": "Route alerts <alerts@example.org>"
}
}
}
}
Through FreeTierMail. Set UseFreeTierMail to true and configure the accounts once, in the
FreeTierMail section. The mailer picks an account by the quota each has left and fails over
when one is throttled, used up or down. Switch accounts per environment with Enabled, for
example a local Mailpit inbox in development and a paid Resend
plan in production:
builder.Services.AddFreeTierMail(builder.Configuration.GetSection("FreeTierMail"))
.AddResend()
.AddSmtp("inbox");
builder.Services.AddHulaki()
.AddEmail("email", builder.Configuration.GetSection("Hulaki:Channels:email"));
{
"FreeTierMail": {
"Providers": {
"resend": { "PreferForCritical": true },
"inbox": { "Enabled": false }
}
},
"Hulaki": {
"Channels": {
"email": { "UseFreeTierMail": true, "From": "Route alerts <alerts@example.org>" }
}
}
}
| Fact | Value |
|---|---|
| Recipient | an email address |
| SMTP transport | port 587 with STARTTLS required; 465 with TLS from the start; on a loopback host no login is needed and STARTTLS is used when offered |
| Body | a plain text part and an HTML part; markup is rendered into the HTML part |
| Subject | the title, or the first line of the text cut to 78 characters |
| Priority | High and Urgent are critical mail: providers marked PreferForCritical first, and the quota reserve |
| Outcome | Accepted with the provider's message id: the provider queued it, delivery happens later |
A refused recipient is RecipientNotFound and an address on the suppression list is
RecipientBlocked; neither is retried. Throttles, used-up quotas and outages are retried after a
delay, once the mailer has tried every account. When an answer was lost the outcome is Unknown
and nothing is resent.
Password and every provider key are secrets: keep them in user secrets or the environment.
Source, issues and license (MIT): https://github.com/sanamhub/hulaki
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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. |
-
net10.0
- FreeTierMail.Smtp (>= 0.1.0-alpha.2)
- Hulaki (>= 0.1.0-alpha.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0-alpha.2 | 555 | 10/15/2026 |
| 0.1.0-alpha.1 | 217 | 10/8/2026 |