Skip to content
Tech News
← Back to articles

Show HN: Posthorn, self-hosted mail without the mail server

read original get Posthorn Email Client → more articles
Why This Matters

Posthorn simplifies self-hosted email management by providing a unified gateway that connects various applications to popular transactional email providers, eliminating the need for individual integrations and handling common email challenges. This streamlines deployment, enhances security, and improves deliverability for self-hosted projects, especially in environments with outbound SMTP restrictions. Its modular design and support for multiple ingress methods make it a valuable tool for developers seeking reliable email workflows without managing complex mail servers.

Key Takeaways

Posthorn

The unified outbound mail layer for self-hosted projects. One gateway between every app you self-host and the transactional mail provider you've already picked. Three ingress shapes (HTTP form, HTTP API, SMTP), five transports (Postmark, Resend, Mailgun, AWS SES, outbound-SMTP relay), single Go binary, single TOML config.

Real-world stacks: Hugo + Comentario · Ghost · Gitea · Umami digest cron · Cloudflare Worker

Why

Nobody wants to run a mail server in 2026. Self-hosted operators use Postmark, Resend, Mailgun, or AWS SES because they're cheap, they handle deliverability properly, and someone else worries about SPF / DKIM / DMARC / bounces / sender reputation.

But every app you self-host has to integrate with that service independently. Your contact form. Your Ghost blog's admin emails. Your Gitea magic links. Your Mastodon notifications. The Cloudflare Worker that fires a password-reset email when someone clicks the link. Each one needs its own copy of the API key, its own integration code, its own quirks around retry and bounce handling. The same outbound concern duplicated across your stack.

And on cloud hosts that block outbound SMTP — DigitalOcean, AWS Lightsail, Linode, Vultr — the SMTP-only apps don't work at all without a workaround.

Posthorn is the bridge. One container, one config, one set of credentials. Your apps point at Posthorn. Posthorn talks to your provider.

Where your app connects What Posthorn does HTTP form (contact forms, signups, alert webhooks) Honeypot + Origin/Referer + rate limit + optional CSRF; templates the email; sends HTTP API mode (workers, cron, payment handlers, internal services) Authorization: Bearer auth; JSON body; idempotent retries; per-request to_override for transactional sends SMTP listener (Ghost, Gitea, Mastodon, Matrix, NextCloud, Authentik, anything that emits SMTP) AUTH PLAIN or client-cert; STARTTLS-required; sender + recipient allowlists; parses MIME; forwards via HTTP API transport

All three ingresses converge on one transport.Message and one outbound provider — pick from Postmark, Resend, Mailgun, AWS SES, or an outbound-SMTP relay.

... continue reading