Coding

Custom Mail

Try it

Run the Custom Mail console locally with Docker — compose, preview, attachments, send history, and pluggable provider / theme / layout / logo.

What it does

Run the Custom Mail console locally with Docker — compose, preview, attachments, send history, and pluggable provider / theme / layout / logo.

The skill document

Custom Mail

What this skill does

Spin up a private web mail console in Docker. Compose mail, preview CommonMark/GFM as HTML, attach files, and browse send history — without running a mail server. Outbound send uses the provider plugin selected in config/mail.json (or MAIL_PROVIDER). Theme, layout, and logo are the same kind of plugin (MAIL_THEME, MAIL_LAYOUT, MAIL_LOGO).

Runtime is a Rust Cloudflare Worker (workers-rs → WASM) packaged with Wrangler for local use.

When to use this skill

Use it when the user wants to:

  • run Custom Mail locally or in Docker
  • send mail through Brevo, Resend, SendGrid, Mailgun, Postmark, MailerSend, SMTP2GO, or SparkPost
  • try the compose / preview / history UI before Cloudflare deploy
  • set up a lightweight mail workspace with one password login and their own brand

Trigger phrases (examples):

  • "start custom mail in docker"
  • "run the mail console locally"
  • "deploy custom-mail container"
  • "帮我本地跑一下 Custom Mail"
  • "用 Docker 启动发信控制台"

Docker Quick Start

1. Pull

docker pull xuxuclassmate/custom-mail:1.0.0

Or :latest. GHCR: ghcr.io/innonestx/custom-mail:1.0.0

2. Export secrets

export ADMIN_PASSWORD='choose-a-strong-password'
export BREVO_API_KEY='xkeysib-...'   # or another provider key; optional until send is needed
export PORT=8787

Other providers / theme / layout / logo without rebuilding the image:

export MAIL_PROVIDER=resend
export MAIL_THEME=nord
export MAIL_LAYOUT=compact
export MAIL_LOGO=monogram
export RESEND_API_KEY='re_...'

3. Run

docker run -d \
  --name custom-mail \
  -p 8787:8787 \
  -e ADMIN_PASSWORD="$ADMIN_PASSWORD" \
  -e BREVO_API_KEY="$BREVO_API_KEY" \
  xuxuclassmate/custom-mail:1.0.0

Open http://localhost:8787 — sign in with ADMIN_PASSWORD.

Verify:

curl -s http://localhost:8787/api/health

Health includes "plugins" (provider, theme, layout, logo) and "available" catalogs.

Docker Compose

git clone https://github.com/InnoNestX/Custom-Mail.git
cd Custom-Mail
export ADMIN_PASSWORD='choose-a-strong-password'
export BREVO_API_KEY='xkeysib-...'
docker compose up -d

Branding and default plugin ids are baked from config/mail.json and plugins/ at image build. Edit those files then docker compose build to add JSON/logo files. Slot env vars switch the active plugin without a rebuild.

Environment

VariableDefaultDescription
ADMIN_PASSWORD(required)Console login password
MAIL_PROVIDERemptyOverrides plugins.provider
MAIL_THEME / MAIL_LAYOUT / MAIL_LOGOemptyOverride theme, layout, logo slots
MAIL_CONFIG_JSONemptyRuntime JSON overlay on mail.json
BREVO_API_KEYemptyDefault provider key; UI loads without it, send needs a key
RESEND_API_KEY / SENDGRID_API_KEY / MAILGUN_API_KEY / POSTMARK_SERVER_TOKEN / MAILERSEND_API_KEY / SMTP2GO_API_KEY / SPARKPOST_API_KEYemptyProvider-specific keys
MAILGUN_DOMAINemptyRequired for Mailgun if mail.providerDomain is empty
MAIL_API_KEYemptyFallback API key
PORT8787Listen port

Example invocations

Pull and run Custom Mail on port 8787 with ADMIN_PASSWORD=dev-secret and my Brevo key.
Start the custom-mail Docker container with MAIL_PROVIDER=resend, MAIL_THEME=nord, and RESEND_API_KEY.
Clone InnoNestX/Custom-Mail and bring it up with docker compose.

Production (Cloudflare)

For edge deploy instead of Docker:

git clone https://github.com/InnoNestX/Custom-Mail.git
cd Custom-Mail
cargo test --lib && npm install
npx wrangler secret put ADMIN_PASSWORD
npx wrangler secret put BREVO_API_KEY   # or the key for plugins.provider
npm run deploy

Branding: config/mail.json · Docs: https://innonestx.github.io/Custom-Mail/

Related skills

Mailcoach (mailcoach.app). Use this skill for ANY Mailcoach request — reading, creating, updating, and deleting data. Whenever a task involves Mailcoach, use this skill instead of calling the API directly.

1 installs

Use when creating or sending Mailtrap-hosted email templates, Handlebars personalization, template UUID in API payloads, or debugging variables and preview. Use when separating email design from application code for transactional or bulk sends.

1 installs

Use when integrating, configuring, or troubleshooting Mailtrap live email sending (Email API or SMTP). Use when wiring outbound mail from an application or choosing how to send.

1 installs