Eternals Mailer
Stable
Terminal window
Terminal window Terminal window Terminal window
Terminal window Terminal window Terminal window
Eternals Mailer is an email testing tool for developers. It captures emails sent by your application during development so you can inspect them in a clean web UI. Built with Go for SMTP capture, NestJS for the API, React for the web UI, PostgreSQL for persistence, and Redis for caching. Point your app’s SMTP config at Eternals Mailer, and every outgoing email lands in your local inbox — safely, instantly.
Tech Stack
Section titled “Tech Stack”| Layer | Technology |
|---|---|
| Web UI | React |
| API server | NestJS |
| SMTP / core | Go |
| Database | PostgreSQL |
| Cache | Redis |
Features
Section titled “Features”- Token-based authentication — Secure API access with JWT tokens
- Real-time email capture — Instant capture of all outgoing emails via SMTP
- Full message inspection — View HTML/text bodies, headers, and attachments
- Modern web UI — Clean React interface with dark mode support
Use Cases
Section titled “Use Cases”- Test email templates — Preview and validate email layouts before production
- Debug email delivery — Inspect headers, content, and attachments during development
- Verify SMTP integration — Confirm your app’s email functionality without sending real emails
- QA workflows — Review automated emails in a safe, isolated environment
Architecture Overview
Section titled “Architecture Overview”Your Application → SMTP (port 1025) → Go SMTP server → NestJS API → PostgreSQL ↓ ↓ React Web UI Redis (port 8502)Quick Start
Section titled “Quick Start”docker run -d \ --name ec-mailer \ --restart always \ -p 8502:8502 \ -p 1025:1025 \ -e POSTGRES_URL=postgresql://postgres:password@host:5432/mailer \ -v mailer:/app/attachments \ eternalscloud/mailer:latestOnce the container is running:
- Web UI: Open
http://localhost:8502in your browser - SMTP Server: Configure your application to send mail to
localhost:1025
services: ec-mailer: image: eternalscloud/mailer:latest container_name: ec-mailer restart: always ports: - "8502:8502" - "1025:1025" environment: - POSTGRES_URL=postgresql://postgres:password@db:5432/mailer volumes: - mailer:/app/attachments depends_on: - db
db: image: postgres:18.4 restart: always environment: POSTGRES_PASSWORD: password POSTGRES_DB: mailer volumes: - postgres:/var/lib/postgresql/data
volumes: mailer: postgres:Run with:
docker compose up -dConnecting Your Application
Section titled “Connecting Your Application”Configure your application’s SMTP settings to point to Eternals Mailer:
| Setting | Value |
|---|---|
| Host | localhost (or container name in Docker networks) |
| Port | 1025 |
const transporter = nodemailer.createTransport({ host: 'localhost', port: 1025, secure: false});import smtplib
with smtplib.SMTP('localhost', 1025) as server: server.sendmail(sender, recipient, message)err := smtp.SendMail( "localhost:1025", nil, sender, []string{recipient}, []byte(message),)Configuration
Section titled “Configuration”Environment Variables
Section titled “Environment Variables”| Variable | Required | Description |
|---|---|---|
POSTGRES_URL | Yes | PostgreSQL connection URL (e.g., postgresql://postgres:password@host:5432/mailer) |
Exposed Ports
Section titled “Exposed Ports”| Port | Description |
|---|---|
8502 | Web UI and REST API |
1025 | SMTP server |
Volumes
Section titled “Volumes”| Path | Description |
|---|---|
/app/attachments | Mail attachment storage |
Vision
Section titled “Vision”Eternals Mailer provides developers with a safe, self-hosted environment for testing email functionality. Catch every email, inspect it instantly, and ship with confidence — no emails ever leave your development environment.