PostalApiClient 1.2.1

dotnet add package PostalApiClient --version 1.2.1                
NuGet\Install-Package PostalApiClient -Version 1.2.1                
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="PostalApiClient" Version="1.2.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add PostalApiClient --version 1.2.1                
#r "nuget: PostalApiClient, 1.2.1"                
#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 PostalApiClient as a Cake Addin
#addin nuget:?package=PostalApiClient&version=1.2.1

// Install PostalApiClient as a Cake Tool
#tool nuget:?package=PostalApiClient&version=1.2.1                

PostalApiClient

.NET Core API client for postal mail delivery platform

Available on NuGet

Version

Usage

1. Register PostalClient in startup\builder

// Read configuration from default section "PostalClient"
builder.Services
    .AddPostalApiClient(builder.Configuration);

// or set options from action
builder.Services
    .AddPostalApiClient(opt =>
    {
        opt.Server = "http://mypostal.domain";
        opt.ApiKey = "Api-Credential-Key";
    });

// or read options from custom configuration section
builder.Services
    .AddPostalApiClient(builder.Configuration.GetSection("MyCustomSection"));

// or use combination from custom configuration section
// and action for override some options
builder.Services
    .AddPostalApiClient(builder.Configuration.GetSection("MyCustomSection"),
        options => { 
            options.ApiKey = "OtherApiKey"; 
        });

// Can use built-in extension methods for setting HttpClient
// e.g. add request handler or logger or retry policy and etc.
builder.Services
    .AddPostalApiClient(builder.Configuration)
    .AddLogger<CustomHttpLogger>()
    .AddHttpMessageHandler<MyRequestHandler>();

2. Get client from DI

// e.g. in controller
public class PostalController : ControllerBase
{
    private readonly PostalClient _postalClient;
    public PostalController(PostalClient client)
    {
        _postalClient = client;
    }
    
    // ... actions
}

3. Call API methods

var result = await _postalClient.GetMessageDeliveriesAsync(messageId); 

if (result.IsT1)
{
    // error handler
}
// continue code with success result

return result.Match<IActionResult>(
    response => Ok(response),
    error => BadRequest(error));

All methods always return type OneOf<TSuccess, TError>. Your can check result.IsT0 for make sure the operation is successful or result.IsT1 that operation error.

More details about OneOf

Samples

// Send message
var message = new PostalMessage()
{
    To = new List<string>
    {
        "example@example.com",
    },
    From = "admin@localhost.com",
    Subject = "Subject",
    PlainBody = "Message body text",
    Sender = "Sender email/name",
    Tag = "Custom message tag",
    ReplyTo = "replyTo@example.com",
    Attachments = new List<PostalMessageAttachment>
    {
        new PostalMessageAttachment()
        {
            Data = "ContentBse64string",
            Name = "Attachment №1",
            ContentType = "image/jpeg"
        }
    },
    Headers = new Dictionary<string, string>
    {
        {"CustomMessageHeader","HeaderValue"}
    }
};

var result = await _postalClient.SendMessageAsync(message); 

// Get message details
await _postalClient.GetMessageDetailsAsync(messageId, MessageExpansion.Status | MessageExpansion.PlainBody);

All available methods and description see in official docs or samples in Demo project

4. Webhooks

Simple usage

Create webhook in postal server and add POSTmethod in controller

[HttpPost]
public IActionResult ReceiveWebhook([FromBody] PostalWebhook payload)
{
    // ... 
    // Your webhook handler code
    
    return Ok();
}

PostalWebhook support payload for all events

Signature verification

You're can verification request signature for approval that request was sent by your postal server.

For this need get public key from server DKIM record and set option DkimP

# run on postal server machine 
# and copy the p=... part of the TXT record (without the semicolon at the end)
postal default-dkim-record
// Add public key to ApiClient option or in appsettings.json
builder.Services
    .AddPostalApiClient(opt =>
    {
        opt.DkimP = "p= part from drim TXT record";
    });

After can use service PostalWebhookVerifier for validate model PostalWebhook signature

[HttpPost]
public async Task<IActionResult> ReceiveWebhook([FromBody] PostalWebhook payload, 
    [FromServices] PostalWebhookVerifier signatureVerifier)
{
    // Check signature
    var isVerified = signatureVerifier.IsSignatureVerified(payload, Request.Headers);
    
    // !!IMPORTANT!! not use this method after request body already read.
    // This Request.Body usually is empty and verifier return always false
    var badUse = await signatureVerifier.IsSignatureVerifiedAsync(Request);
     
    // Your webhook handler code
    /// ...
    
    return Ok();
}

You're can install package PostalApiClient.Mvc.Extensions with mvc dependencies and use attribute for request signature automatic validation

[HttpPost]
[PostalSignatureVerify]
public IActionResult ReceiveWebhookWithSignatureVerify([FromBody] PostalWebhook payload)
{
    // ... 
    // Your webhook handler code

    return Ok();
}

or write custom middleware for verification with use extension method

// some code before verification

var isVerified = await context.HttpContext.CheckPostalSignatureAsync();

// some code after verification
Product Compatible and additional computed target framework versions.
.NET net7.0 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on PostalApiClient:

Package Downloads
PostalApiClient.Mvc.Extensions

Api client for mail delivery platform Postal. Extenions for MVC

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.2.1 1,445 6/10/2024
1.2.0 161 6/8/2024
1.1.0 145 4/17/2024
1.0.0 122 4/16/2024