Email Notifier Service
email-notifier-service resolves email destinations and delivers notifications
for the email channel. With app.sentinel, it also holds external watchdogs
and sends a Down or Recovered alert by email.
HTTP serves POST /watchdogs/{name}/heartbeat. Without app.sentinel that
route answers 404. Health in Compose stays the Kontiki registry live probe.
What it does
- Load email endpoints from YAML (
app.endpoints). - Expose the email channel catalog (RPC
get_notification_channel_catalog). - Consume
email.alerting.notification.requested. - Resolve destination using configured
endpoint_key. - Format alert notifications as multipart plain + HTML (same structured layout as Telegram: event_type banner, humanized attributes, Message when body adds info). Subject is the banner label.
- Send email through configured SMTP.
- When
app.sentinelis set, accept watchdog heartbeats and send a structured Down or Recovered mail on the watchdog’s endpoint. - Mark the instance degraded on repeated SMTP failures (
@degraded_on); alert-delivery failures surface through Kontiki exception / alerting.
Stack
- Config:
stack/notifiers/email.yaml(demo shipsapp.endpoints.inbox→ MailHog) - Local SMTP: MailHog (
mailhog:1025, UI http://127.0.0.1:8025) - Matching subscriptions:
stack/subscription.yaml(core) orstack/subscription.demo.yaml(demo).
Message formatting
Alert notifications (context.kind = alert or a non-empty category) are
rendered as multipart/alternative:
- Subject: humanized
event_type(falls back to last category segment) - text/plain: banner, attribute rows in producer insertion order, optional
Message:when body differs from title, optional Details link - text/html: same layout plus severity icon on the banner
Non-alert messages keep title as subject and title/body as content.
Shared parsing lives in boomerang.services.notifiers.common.structured_alert
(also used by the Telegram notifier).
Event flow
Consumes:
email.alerting.notification.requested
Behavior:
- parse payload as
NotificationRequest, - resolve address from configured endpoint,
- format plain + HTML body,
- send via SMTP (failures propagate as Kontiki exceptions).
External sentinel
Optional. POST /watchdogs/{name}/heartbeat with Authorization: Bearer <token>
refreshes one watchdog. A matching token on a known name answers 204. A missing
or wrong token answers 401. An unknown name, or no app.sentinel section,
answers 404.
Down and Recovered are structured alerts (category kontiki.sentinel).
The subject is Down (critical) or Recovered (low). The heartbeat name
is the Watchdog attribute. They are sent through the endpoint named by
endpoint_key. They do not go through the bus.
Keys and state machine: docs/configuration.md.
Metadata
Release files for boomerang-email-notifier 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| boomerang_email_notifier-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Release files / boomerang_email_notifier-1.0.0-py3-none-any.whl
| Download URL | boomerang_email_notifier-1.0.0-py3-none-any.whl |
|---|---|
| Size | 58.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5ec9d221ae6625ff295fe7cfd0d7e7c7026d52edffcc4d88085194068766122d
|
|
BLAKE2b-256 checksum How to use checksums |
9ad2e17be21a953107437b01137a25c1ba347f5356854f23099cd9e0ef8cd846
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency log