postmarkd

    Project

    Changelog

    All notable changes to this project are documented here. The format follows Keep a Changelog and the project uses Semantic Versioning.

    #Unreleased

    #Added

    • Install instructions for the release packages: one-step .deb and .rpm installs for amd64 and arm64, a binary-only install, checksum verification, and upgrade and uninstall steps.
    • Container docs list the image tags (X.Y.Z, X.Y, latest).
    • The docs site build fails when an install command or image tag points at an older release than the latest one in this changelog.

    #Changed

    • Examples use the 0.1 image tag instead of latest.
    • The sendmail symlink instructions work with the packages and no longer need a source checkout.

    #Fixed

    • The container image reports its version without a v prefix, matching the binaries and packages.

    #0.1.0 - 2026-10-13

    The first release: a small daemon that lets anything on a host or in a pod send mail through Postmark.

    #Sending

    • Postmark-compatible HTTP API: /email, /email/batch, /email/withTemplate and /email/batchWithTemplates. Existing Postmark SDKs work by changing their base URL.
    • SMTP server (POSTMARKD_SMTP_LISTEN) that converts MIME mail, including attachments, inline images and Postmark's X-PM-* headers.
    • sendmail compatibility: invoke the binary as sendmail and cron, mail, PHP mail() and friends deliver through Postmark.
    • postmarkd send for scripts: bodies from stdin or files, attachments, templates, streams, tags and metadata.
    • Default From and MessageStream, plus per-request stream selection (?stream=, X-Postmarkd-Stream).

    #Reliability and scale

    • Validation before Postmark sees a message; original bytes are forwarded untouched.
    • Pooled upstream connections, a concurrency limit, and retries only when Postmark cannot have accepted the message (no duplicate mail).
    • Optional async mode with a bounded in-memory queue, back-pressure and graceful drain on shutdown.

    #Operations

    • TCP and unix socket listeners (several at once), systemd socket activation (including SMTP on port 25 via postmarkd-smtp.socket), sd_notify readiness and watchdog, and a hardened unit.
    • Optional client token authentication; the Postmark token can be loaded as a systemd credential.
    • Prometheus metrics, /healthz and /readyz; postmarkd healthcheck.
    • postmarkd check-domain checks DKIM, Return-Path (SPF alignment) and DMARC records.
    • Blackhole mode (POSTMARKD_BLACKHOLE) for tests, with captured mail at /blackhole/messages.

    #Distribution

    • Linux binaries, .deb and .rpm packages for amd64 and arm64, and a multi-arch distroless container image at ghcr.io/rossedman/postmarkd.
    • Docker Compose, Kubernetes sidecar and GitHub Actions examples.
    • Documentation site at https://rossedman.io/postmarkd/.
    • Benchmarks for every component, run in CI with a regression gate.

    Edit this page on GitHub