Add Posta hosting integration - #1461
Merged
Merged
Conversation
- Introduced `CommunityToolkit.Aspire.Hosting.Posta` project for integrating Posta with PostgreSQL and Redis. - Added extension methods for configuring Posta containers, health checks, and resource dependencies. - Created test projects for validating Posta container configuration and health checks. - Added example projects under `examples/posta` showcasing Posta integration with PostgreSQL and Redis. - Updated solution file and package references to include the new Posta project.
- Introduced `CommunityToolkit.Aspire.Hosting.Posta` project for integrating Posta as a containerized resource. - Added extension methods for configuring Posta containers, including support for PostgreSQL, Redis, and advanced environment options. - Defined Posta resource options, container image tags, and health check configurations.
Contributor
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.sh | bash -s -- 1461Or
iex "& { $(irm https://raw.githubusercontent.com/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.ps1) } 1461" |
…ources to `AddPosta`. Refine README to reflect updated API and usage.
…nces - Introduced tests to validate `AddPosta` behavior with null database and Redis inputs, ensuring proper exception handling. - Added test to confirm PostgreSQL and Redis configuration via environment variables.
…dPosta` methods. Extend methods to support chained references.
… with improved configuration options.
… Remove redundant overloads in `PostaHostingExtensions`.
…d `RedisAddress`; refine README to clarify environment configuration usage.
…g additional expression types
…ble assignments with `Set` and `SetIfNotNull` methods for improved readability and consistency.
…r Redis authentication support.
…tion values, ensuring flexibility and enhanced security.
… and improve environment variable assertions.
…ve method null-checks and chaining logic.
…up by replacing `SetIfNotNull` with `SetParameter`, adding default values, and introducing `SetIfAbsent` to prevent overwrites.
… resource builders for improved flexibility and configurability.
- Introduced `PostaEmailVerificationOptions`, `PostaGoogleOAuthOptions`, `PostaInboundSmtpOptions`, `PostaS3BlobStorageOptions`, and `PostaSystemSmtpOptions` for parameterized configuration. - Added `PostaEnvironmentVariables` to define constants for environment variable keys. - Created `launchSettings.json` example for local hosting configuration.
…tion, enhance environment variable assertions, and streamline option setup.
…, improve secret handling, and streamline examples.
…constants, improve environment variable handling, and modularize configuration setup.
…types, add defaults, and improve XML summaries for configuration properties.
…3 storage, and email verification
…th, S3 storage, and email verification
- Introduced core model definitions for Posta API, including support for templates, emails, and applications. - Added project structure, including example, source, and test projects. - Configured dependency requirements, project references, and test configurations.
…ce and Posta test projects
…ents - Introduced `WithDataVolume` and `WithDataBindMount` extension methods to configure filesystem-backed attachment storage. - Updated `README.md` with examples and details for volume/bind mount usage. - Added unit tests to validate volume and bind mount behavior.
…and environment variables
…ion and environment variables
- Introduced `WithSmtpRelay` methods for parameterized SMTP relay setup. - Added `SmtpRelayEnabled`, `SmtpRelayHost`, `SmtpRelayPort`, and related options to `PostaOptions`. - Updated environment variables and resource builders to support SMTP relay. - Enhanced `README.md` with examples for using the new SMTP relay functionality. - Added unit tests to validate SMTP relay configuration and endpoint exposure.
Contributor
There was a problem hiding this comment.
Pull request overview
Adds a new Posta integration to the Aspire Community Toolkit, spanning both an AppHost hosting resource (CommunityToolkit.Aspire.Hosting.Posta) and a discoverable HTTP client integration (CommunityToolkit.Aspire.Posta) with examples and tests.
Changes:
- Introduces a Posta container-backed hosting resource with PostgreSQL/Redis reference wiring, environment/options configuration, and health checks.
- Adds a Posta HTTP API client with endpoint catalog, typed request/response models, and transport layer.
- Adds a runnable example AppHost and accompanying unit + Docker smoke tests, and updates the repo integration list.
Show a summary per file
| File | Description |
|---|---|
| README.md | Adds Posta integration entry + link refs. |
| CommunityToolkit.Aspire.slnx | Adds Posta projects to the solution. |
| src/CommunityToolkit.Aspire.Hosting.Posta/CommunityToolkit.Aspire.Hosting.Posta.csproj | Hosting integration package project. |
| src/CommunityToolkit.Aspire.Hosting.Posta/README.md | Hosting integration documentation. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaContainerImageTags.cs | Defines pinned Posta container image/tag. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaEmailVerificationOptions.cs | Parameter-based email verification options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaEnvironmentVariables.cs | Posta env-var constants. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaGoogleOAuthOptions.cs | Parameter-based Google OAuth options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaHostingExtensions.cs | AddPosta / WithReference / config extension methods. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaInboundSmtpOptions.cs | Parameter-based inbound SMTP options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaOptions.cs | Typed Posta container configuration options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaResource.cs | Posta resource model + connection properties. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaS3BlobStorageOptions.cs | Parameter-based S3 blob storage options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaSmtpRelayOptions.cs | Parameter-based SMTP relay options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaSystemSmtpOptions.cs | Parameter-based system SMTP options. |
| src/CommunityToolkit.Aspire.Posta/CommunityToolkit.Aspire.Posta.csproj | Client integration package project. |
| src/CommunityToolkit.Aspire.Posta/README.md | Client integration documentation. |
| src/CommunityToolkit.Aspire.Posta/Clients/IPostaClient.cs | Client root interface. |
| src/CommunityToolkit.Aspire.Posta/Clients/IPostaSectionClient.cs | Common section-client operations interface. |
| src/CommunityToolkit.Aspire.Posta/Clients/PostaClient.cs | Default client implementation. |
| src/CommunityToolkit.Aspire.Posta/Clients/PostaClientBuilderExtensions.cs | AddPostaClient DI registration extensions. |
| src/CommunityToolkit.Aspire.Posta/Clients/PostaClientSection.cs | Section client implementation wrapper. |
| src/CommunityToolkit.Aspire.Posta/Clients/PostaOperations.cs | Typed operations interfaces + implementations. |
| src/CommunityToolkit.Aspire.Posta/Clients/PostaSectionClient.cs | Base class for section clients. |
| src/CommunityToolkit.Aspire.Posta/Configuration/IPostaCredentialProvider.cs | Credential provider interface. |
| src/CommunityToolkit.Aspire.Posta/Configuration/PostaClientSettings.cs | Client settings model. |
| src/CommunityToolkit.Aspire.Posta/Configuration/PostaCredentialProvider.cs | Default credential provider. |
| src/CommunityToolkit.Aspire.Posta/Endpoints/IPostaEndpoints.cs | Endpoint catalog interface. |
| src/CommunityToolkit.Aspire.Posta/Endpoints/PostaEndpoint.cs | Endpoint + auth-mode types. |
| src/CommunityToolkit.Aspire.Posta/Endpoints/PostaEndpoints.cs | Default endpoint catalog implementation. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/GetEmailDeliveryStatusRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/GetEmailDeliveryStatusResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/GetEmailDetailsRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/GetEmailDetailsResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/PreviewEmailFromTemplateRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/PreviewEmailFromTemplateResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/RetryFailedEmailRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/RetryFailedEmailResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendAnEmailRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendAnEmailResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendBatchEmailsRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendBatchEmailsResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendEmailUsingTemplateRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendEmailUsingTemplateResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/VerifyAnEmailAddressRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/VerifyAnEmailAddressResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Health/LivenessProbeResponse.cs | Health API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Health/ReadinessProbeResponse.cs | Health API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Info/ApplicationInfoResponse.cs | Info API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/ReSubscribeAnEmailToAListRequest.cs | Subscriber list API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/ReSubscribeAnEmailToAListResponse.cs | Subscriber list API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/SubscribeAnEmailToAListRequest.cs | Subscriber list API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/SubscribeAnEmailToAListResponse.cs | Subscriber list API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/UnsubscribeAnEmailFromAListRequest.cs | Subscriber list API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/UnsubscribeAnEmailFromAListResponse.cs | Subscriber list API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/CreateTemplateRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/CreateTemplateResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/DeleteTemplateRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/DeleteTemplateResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/GetTemplateRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/GetTemplateResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/ListTemplatesRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/ListTemplatesResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/PreviewTemplateRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/PreviewTemplateResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/SendTestEmailRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/SendTestEmailResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/UpdateTemplateRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/UpdateTemplateResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ApplicationInfoResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseDataActiveVersion.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseDataActiveVersionLocalizationsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseDataActiveVersionStylesheet.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseDataCreatedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseDataLastEditedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetEmailDeliveryStatusResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetEmailDetailsResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseDataActiveVersion.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseDataActiveVersionLocalizationsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseDataActiveVersionStylesheet.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseDataCreatedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseDataLastEditedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItemActiveVersion.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItemActiveVersionLocalizationsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItemActiveVersionStylesheet.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItemCreatedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItemLastEditedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponsePageable.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/PreviewEmailFromTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/PreviewTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ReSubscribeAnEmailToAListResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/RetryFailedEmailResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendAnEmailRequestAttachmentsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendAnEmailRequestUnsubscribe.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendAnEmailResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendBatchEmailsRequestRecipientsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendBatchEmailsRequestUnsubscribe.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendBatchEmailsResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendBatchEmailsResponseDataResultsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendEmailUsingTemplateRequestAttachmentsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendEmailUsingTemplateRequestUnsubscribe.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendEmailUsingTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendTestEmailResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SubscribeAnEmailToAListResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UnsubscribeAnEmailFromAListResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseDataActiveVersion.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseDataActiveVersionLocalizationsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseDataActiveVersionStylesheet.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseDataCreatedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseDataLastEditedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/VerifyAnEmailAddressResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/VerifyAnEmailAddressResponseDataChecks.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Transport/PostaApiException.cs | Transport exception type. |
| src/CommunityToolkit.Aspire.Posta/Transport/PostaRequest.cs | Transport request envelope. |
| src/CommunityToolkit.Aspire.Posta/Transport/PostaStreamResponse.cs | Transport streaming response wrapper. |
| src/CommunityToolkit.Aspire.Posta/Transport/PostaTransport.cs | Transport implementation (HTTP + auth + serialization). |
| examples/posta/CommunityToolkit.Aspire.Hosting.Posta.AppHost/CommunityToolkit.Aspire.Hosting.Posta.AppHost.csproj | Example AppHost project. |
| examples/posta/CommunityToolkit.Aspire.Hosting.Posta.AppHost/Program.cs | Example AppHost wiring Posta/Postgres/Redis. |
| examples/posta/CommunityToolkit.Aspire.Hosting.Posta.AppHost/Properties/launchSettings.json | Example AppHost launch profiles. |
| examples/posta/CommunityToolkit.Aspire.Hosting.Posta.ApiService/CommunityToolkit.Aspire.Hosting.Posta.ApiService.csproj | Example API service project. |
| examples/posta/CommunityToolkit.Aspire.Hosting.Posta.ApiService/Program.cs | Example usage of the Posta client. |
| tests/CommunityToolkit.Aspire.Hosting.Posta.Tests/AppHostTests.cs | Docker smoke test for Posta resource. |
| tests/CommunityToolkit.Aspire.Hosting.Posta.Tests/CommunityToolkit.Aspire.Hosting.Posta.Tests.csproj | Hosting tests project. |
| tests/CommunityToolkit.Aspire.Hosting.Posta.Tests/ContainerResourceCreationTests.cs | Hosting resource/unit tests for env/endpoints/refs. |
| tests/CommunityToolkit.Aspire.Posta.Tests/CommunityToolkit.Aspire.Posta.Tests.csproj | Client tests project. |
| tests/CommunityToolkit.Aspire.Posta.Tests/PostaClientTests.cs | Client unit tests for transport/endpoints behavior. |
Review details
- Files reviewed: 130/130 changed files
- Comments generated: 5
- Review effort level: Lite
aaronpowell
requested changes
Aug 6, 2026
aaronpowell
left a comment
Member
There was a problem hiding this comment.
Some small nits and a merge conflict
aaronpowell
approved these changes
Aug 7, 2026
6 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds new Posta integrations for Posta, a self-hosted email delivery platform:
CommunityToolkit.Aspire.Hosting.Postamodels and orchestrates the Posta container.CommunityToolkit.Aspire.Postaprovides a discoverable typed HTTP client.This PR adds:
PostaResourcewith connection properties for the Posta HTTP API/dashboardAddPosta(...)for adding the Posta container resourceWithReference(...)support for connecting Posta to PostgreSQL and Redis resourcesPostaOptionsfor web URLs, rate limits, OAuth, blob storage, SMTP, inbound email, email verification, metrics, and advanced switches/healthzand/readyzexamples/postaThe container image is pinned to
jkaninda/posta:0.13.1.PR Checklist
mainValidation
Results: