A minimal SMTP bridge that receives emails, selects the requested MIME part, and forwards it to Apprise destinations using configurable tags and keys. Written on Go memory footprint is as little as 3mb. It’s built for auditability, abuse resistance, and operational clarity: explicit SMTP auth, async dispatch with retries, and an admin GUI to manage mappings.
It was inspired by Authelia's lack of notification providers, so the available mail provider was taken as the base to have a notification freedom, so you may redirect notifications to any/multiple destinations you want. This service can be used as notification bridge for any SMTP notifier. It can separate multipart/MIME messages by parts and forwatd it to the Apprise endpoind according to configuration (currently text/plain, text/htmp and raw message can be chosen, accordint to Authelia's standard notification template). So you can easily configure forwarding raw message to your email, text message to any messenger.
- SMTP auth (PLAIN): Require ADMIN_USER and ADMIN_PASS to send.
- MIME routing: Choose text/plain or text/html parts per record.
- Apprise dispatch: Forward to AppriseURL/Key with optional tags.
- Async queue with retry: Non-blocking enqueue, exponential backoff, bounded queue with drop-on-full.
- Admin GUI: Manage records, search, sort, and modify, dark/light theme, automatically fits system setting.
- Structured logs (optional): Clear success/error paths for audit.
- Backend: Stores records mapping Email + MimeType -> Key + Tags.
- SMTP server: Authenticated relay that extracts MIME parts and passes jobs to the dispatcher.
- Dispatcher: Background worker(s) that POST payloads to Apprise with retry and backoff.
- Admin GUI: HTTP server for CRUD on records and operational feedback.
flowchart LR
SMTP[SMTP Client] -->|AUTH + DATA| Bridge[Smtprise]
Bridge -->|extract MIME| Dispatcher[Async Dispatcher]
Dispatcher -->|POST w/ retry| Apprise[Apprise Services]
Admin[Admin GUI] -->|CRUD| BackendDB[(DB)]
Bridge --> BackendDB
services:
smtprise:
image: fraddy/smtprise
ports:
- "8231:8080" # GUI
environment:
- ADMIN_USER=admin
- ADMIN_PASS=strongpassword
- GUI_ENABLED=true
- LISTEN_SMTP=25
- LISTEN_HTTP=8080
- STORE_FILE=records.db
- APPRISE_URL=http://apprise:8000/notify
volumes:
- ./data:/app/data/
depends_on:
- apprise
network:
- shim_network # Should share it with Apprise and AutheliaOpen http://server.local:8231
Enter preferred configuration

notifier:
smtp:
address: smtp://smtprise:25
username: 'admin'
password: 'strongpassword'
sender: "Authelia <authelia@example.com>"
disable_require_tls: true # Should be set to true as shim doesn't support tls
disable_starttls: false
disable_html_emails: falsealice,bob,tg=tgram://<API Key>/<Chat ID>/?overflow=split&format=text
alice,mail=mailto://alice:password@example.com
bob,mail=mailto://bob:password@example.com
admin=alice,carl,den- ADMIN_USER / ADMIN_PASS: SMTP PLAIN credentials required to send.
- APPRISE_URL: Base URL of Apprise (it's strongly recommended place container in common network with notifier+apprise, not exposing port) e.g., http://apprise:8000/notify.
- LISTEN_SMTP: Port the SMTP server listens on (e.g., 2525).
- LISTEN_HTTP: Port for the admin GUI (e.g., 8080).
- GUI_ENABLED: true to run the admin GUI.
- StoreFile: Filename under data/ for your SQLite store (from LoadConfig()).
notifier:
smtp:
address: smtp://shim-proxy:2525 # This should be targeted to container's port
timeout: '5s'
username: 'test' # ADMIN_USER value
password: 'password' # ADMIN_PASS value
sender: "Authelia <authelia@example.com>" # Is required by Authelia, though is dropped anyway
identifier: 'localhost' # Generally isn't used
subject: "[Authelia] {title}" # This will be treated as subject for Apprise
disable_require_tls: true # Should be set to true as shim doesn't support tls
disable_starttls: false
disable_html_emails: falseGui contains input form with:
- email - Authelia's destination email
- key - Apprise's config key
- tags - this will be forwarded to Apprise as is
- mime-type - type to be forwarded, if message is multipart/mime (as Authelia does it) one can choose desired part, e.g. Plain text (text/plain) will be extracted and sent to Apprise
Binary
- Build: go build -o smtprise ./cmd
- Run: Place the binary beside your data/ directory or let the app create it.
export ADMIN_USER="admin"
export ADMIN_PASS="secret"
export APPRISE_URL="http://apprise:8000/notify"
export LISTEN_SMTP="2525"
export GUI_ENABLED="true"
export LISTEN_HTTP="8080"
- Email: The recipient address that will be matched (e.g., alerts@example.com).
- Mime type: raw, text/plain or text/html to select which part to forward.
- Key: The Apprise notification key segment appended to APPRISE_URL.
- Tags: Comma/space separated list (e.g., admin,friends mail).
Record 1
- Email: alerts@example.com
- Mime type: text/html
- Key: apprise
- Tags: admin telegram,children discord
Record 2
- Email: alerts@example.com
- Mime type: Raw
- Key: apprise
- Tags: admin mail,friends mail
Record 3
- Email: server-events@example.com
- Mime type: Raw
- Key: apprise
- Tags: admin
Use any SMTP client authenticated with ADMIN_USER/ADMIN_PASS, sending to the mapped Email. The bridge will:
- Extract: The requested MIME part from the message.
- Format: Set payload title from Subject, body from the part, tag from record tags, format inferred (text for text/plain, html otherwise).
- Enqueue: Push a dispatch job to the bounded queue.
- Retry: Worker posts to Apprise with exponential backoff; drops if queue is full.
here (https://github.com/caronc/apprise/wiki/config)
here (https://github.com/caronc/apprise/wiki/config_text)
and here (https://github.com/caronc/apprise/wiki/config_text#text-based-apprise-configuration)
here (https://www.authelia.com/configuration/notifications/smtp/)




