Skyhop.Mail 2.0.0

There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package Skyhop.Mail --version 2.0.0
NuGet\Install-Package Skyhop.Mail -Version 2.0.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Skyhop.Mail" Version="2.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Skyhop.Mail --version 2.0.0
#r "nuget: Skyhop.Mail, 2.0.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Skyhop.Mail as a Cake Addin
#addin nuget:?package=Skyhop.Mail&version=2.0.0

// Install Skyhop.Mail as a Cake Tool
#tool nuget:?package=Skyhop.Mail&version=2.0.0

<a href="https://skyhop.org"><img src="https://app.skyhop.org/assets/images/skyhop.svg" width=200 alt="skyhop logo" /></a>


This .NET Core 3.1 library is an abstraction of the approach we use over at Skyhop to send transactional emails to our subscribers. We believe that having a flexible method is vital to the ability to flexibly send emails.

This core principle behind this library is based on several prior blog posts:

There is a blog post which extensively describes the approach and background of this library available over here.

Installation

The NuGet hosted package is available over here. Install it using the following commands:

Using the NuGet Package Manager

Install-Package Skyhop.Mail

Using the .NET CLI

dotnet add package Skyhop.Mail

You should reference this project on your template project (or at least the project which contains your views and view-models). After which there are two changes you will need to make to your .csproj file:

  1. Set the SDK target to Microsoft.NET.Sdk.Razor.
  2. Make sure you add the AddRazorSupportForMvc element to the file so that it looks like this:
<PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>

Samples which can be used as a reference can be found in this repository.

Usage

  1. Add the Skyhop.Mail project to your template project.
  2. Use the .AddMailDispatcher() extension method on your IServiceCollection as follows. Note that this library expects you to bring your own transport mechanism.
services.AddMailDispatcher(builder =>
{
    builder.DefaultFromAddress = new MimeKit.MailboxAddress("Email Support", "support@example.tld");
});
  1. Add an implementation of IMailSender to your IServiceCollection. In the example project a simple Smtp implementation is included.
  2. Add views and viewmodels to your templating project.
  3. Use the DI container to grab a MailDispatcher instance. Usage from code can be as follows. After this you can send an email based on the viewmodel as follows:
await _mailDispatcher.SendMail(
    data: new ServiceActionModel
    {
        ActionName = "Starting",
        Timestamp = DateTime.UtcNow
    },
    to: new[] { new MailboxAddress("John Doe", "john.doe@example.tld") });

Convention based view loading

If you would like to load all views in *.Views.dll's you can use an overload AddMailDispatcher, this overload enables the extension of IMvcCoreBuilder. We created an extension which will find and load all *.Views.dll files as application parts:

services.AddMailDispatcher(options =>
{
    options.DefaultFromAddress = new MailboxAddress("Email Support", "support@example.tld");
},
builder => builder.AddViewsApplicationParts());

Gotchas

The following limitations are currently available. Feel free to submit a PR to fix one or more of those ☺.

  • This library only works with projects which target netcoreapp3.1. This is a limitation based on the requirements of the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation dependency.
  • It is expected that a view-model is only used once within a view. The code will use the first view it encounters that has the chosen model.
  • If your implementation of IMailSender is scoped (uses a DbContext for example), you can also change the scope of the MailDispatcher as needed. By default the MailDispatcher is added as a singleton, but using an overload of the AddMailDispatcher you can set the ServiceLifetime as needed.
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  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 was computed.  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. 
.NET Core netcoreapp3.1 is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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
3.0.0-rc5 2,663 2/15/2021
3.0.0-rc4 3,959 4/14/2020
3.0.0-rc3 1,241 1/10/2020
3.0.0-rc2 881 1/10/2020
3.0.0-rc1 864 1/10/2020
2.0.0 3,300 1/9/2020

- Add bug fixed which resulted in email having no body,
     - Removed dependency on WebHostBuilder
     - Fixed a typo in AddMailDispatcher
     - Removed the need to load all assemblies when trying to find a model/identifier combination
     - Made MailSender awaitable
     - Moved MailDispatcherOptions to options folder
     - Moved IModelIdentifierLister to Abstractions folder
     - Refactored the MailSender delegate to an interface, so now DI can be used for the send part