PostalApiClient 1.2.1
dotnet add package PostalApiClient --version 1.2.1
NuGet\Install-Package PostalApiClient -Version 1.2.1
<PackageReference Include="PostalApiClient" Version="1.2.1" />
paket add PostalApiClient --version 1.2.1
#r "nuget: PostalApiClient, 1.2.1"
// 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
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.
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 POST
method 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 | Versions 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. |
-
net7.0
- Macross.Json.Extensions (>= 3.0.0)
- Microsoft.AspNetCore.Http.Abstractions (>= 2.2.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 7.0.0)
- Microsoft.Extensions.Http (>= 7.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 7.0.0)
- MyCSharp.HttpUserAgentParser (>= 3.0.2)
- OneOf (>= 3.0.271)
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.