Skip to content

Security ​

Security best practices for running MXHook in production.

Authentication ​

API Key ​

Protect the REST API with an API key:

bash
MXHOOK_API_KEY=your-secret-key ./mxhook start

All API endpoints (except /health and /openapi.yaml) require the X-API-Key header when a key is configured. Always set an API key in production.

Webhook Signing ​

Configure a webhook_secret on each route to enable HMAC-SHA256 payload signing. Your application should verify the signature on every request and reject unsigned or incorrectly signed payloads.

Network Security ​

TLS ​

  • API: Place the REST API behind a reverse proxy (nginx, Caddy, Traefik) with TLS termination. Do not expose the API over plain HTTP in production.
  • SMTP: MXHook supports STARTTLS for encrypted SMTP connections. TLS 1.2+ is enforced.

Firewall ​

PortProtocolSourcePurpose
25TCPInternetInbound SMTP
8080TCPInternalREST API (behind reverse proxy)
5432TCPInternalPostgreSQL (MXHook only)
  • Expose port 25 to the internet for receiving email.
  • Restrict API access to internal networks or authenticated clients.
  • Never expose PostgreSQL to the public internet.

Rate Limiting ​

MXHook enforces inbound SMTP rate limiting at 100 messages per hour per source IP. This protects against abuse and spam floods.

Input Validation ​

  • Email parsing is handled by the battle-tested enmime library with hardened defaults
  • Webhook URLs are validated before route creation
  • SQL injection is prevented through parameterized queries (pgx)
  • Maximum message size is enforced at the SMTP level (default: 10 MB)

Data Isolation ​

In multi-tenant deployments, data is isolated per domain. Messages, routes, and DLQ entries are scoped to the domains registered in MXHook.

Released under the Apache 2.0 License.