Project

General

Profile

Actions

Sub-Task #195

open

Epic #188: Notification System

Feature #189: Email Notifications

User Story #193: As a system, I want to send emails on long-term events, so that users receive batch digests

Integrate SMTP provider

Sub-Task #195: Integrate SMTP provider

Added by Bricklou 6 months ago. Updated 18 days ago.

Status:
Done
Priority:
Normal
Assigned To:
Target version:
Start date:
09/07/2026
Due date:
% Done:

100%

Estimated time:

Description

The instance sends transactional emails (verification, password reset, notifications). The pipeline has two separate stages:

  1. Template rendering (see #194): the email body is authored in MJML and compiled to HTML via mrml, a pure-Rust MJML→HTML renderer. mrml only compiles static markup — it has no variable/conditional syntax of its own — so dynamic values (name, verification link, etc.) are injected by running the compiled HTML through Tera on top of it.
  2. Sending (this issue): the rendered HTML is handed to lettre, a Rust SMTP client crate, which delivers it over SMTP.

Scope of this issue is stage 2 only:

  • SMTP connection is configured entirely via environment variables: host, port, credentials, sender address, and encryption/TLS mode.
  • If no SMTP environment variables are set, sending is a no-op — callers must treat "no mail configured" as a valid state (e.g. accounts auto-verify at registration when no mail server is available, see #166).
  • For local development, a self-hosted mail-catching tool (Mailpit, replacing the now-deprecated MailHog) is provided so anyone can inspect sent emails without a real mailbox, deployed as a k3d manifest in the local dev environment.

Related issues 1 (1 open — 0 closed)

Blocks Server - Sub-Task #166: Send invitation email with tokenPlannedBricklou

Actions
Actions

Also available in: PDF Atom