Releases: soulteary/owlmail
Release list
v0.8.0
OwlMail 0.8.0 release notes
OwlMail 0.8.0 turns the project into a more complete email-testing gateway for
developers, CI pipelines, and coding agents. The release adds durable and
observable relay delivery, layered configuration, an optional SQLite mailbox
index, a read-only MCP stdio bridge, an opt-in MailCatcher REST facade, and a
safer, faster inbox workflow.
The commands below become valid after the v0.8.0 tag is published.
Highlights
Persistent relay jobs
Manual relay requests from the inbox and requests to the native
/api/v1/emails/:id/actions/relay endpoints now return an asynchronous job
ID. The retained unversioned /email/:id/relay compatibility routes keep
their historical HTTP 200 response and do not return a job ID. Accepted native
jobs are persisted under the mail directory, restored after restart, and
retried for bounded transient failures with safe status categories.
Source EML files remain protected while a relay job still needs them, and
startup orders SMTP, the Web API, storage cleanup, and relay recovery so queued
work is not exposed or deleted prematurely.
Outgoing runtime configuration now uses immutable per-job snapshots. Enabling,
disabling, updating credentials, enqueueing, and closing are coordinated without
data races or producer-side channel closes. Already accepted jobs drain with
their original configuration while new submissions receive deterministic
disabled, full, or closed errors.
Layered configuration and indexing
OwlMail can load a flat YAML or JSON configuration file through -config or
OWLMAIL_CONFIG_FILE. Precedence is explicit: CLI, MailDev environment
aliases, OwlMail environment, configuration file, then built-in defaults.
Unknown, duplicate, nested, null, oversized, and type-invalid values fail
closed.
An optional SQLite mailbox index accelerates restart and mailbox queries while
keeping stored EML and sidecar files authoritative. Prometheus metrics and
structured JSON logging are available for production-style test environments.
MCP stdio bridge and client compatibility
owlmail mcp-stdio exposes the existing read-only MCP tools, resources,
prompts, limits, and mailbox store over the official stdio transport. Protocol
frames stay on stdout and logs stay on stderr, making the command suitable for
local coding-agent configuration.
The default-off MailCatcher REST facade covers message list and detail, HTML,
plain text, source, EML, CID parts, and deletion routes while sharing OwlMail's
Basic Auth, HTTPS, storage, and base path. OwlMail IDs remain opaque strings,
and the facade does not emulate MailCatcher's WebSocket event bus.
Inbox and operator workflow
The inbox adds HTML, plain-text, header, and raw-source tabs, browser history,
keyboard navigation, and guarded manual relay controls. Relay actions show
their asynchronous job ID, suppress duplicate submission, and require explicit
confirmation before sending real mail.
SMTP greeting length, command length, recipients, message size, read timeout,
write timeout, and DATA concurrency are independently configurable. API list
queries and bulk mutations now reject malformed or oversized inputs instead of
silently normalizing them.
Security and performance
- Outbound SMTP uses explicit
plain, mandatorystarttls, or implicit
smtpstransport. STARTTLS and certificate failures never fall back to
plaintext, hostname verification is enabled by default, and credentials are
rejected on cleartext connections. - Potentially active HTML, SVG, XML, and JavaScript attachments are forced to
download withnosniffprotection and a sanitized filename. - Relay DATA and raw-source responses stream from validated EML paths instead
of allocating message-sized buffers. Filtered exports use lightweight
summaries and preserve the existing message-count and byte limits. - Relay configuration, queue submission, recovery, deletion protection, and
shutdown have race and failure-path coverage.
Upgrade notes
- Existing CLI and environment configuration remains supported. Configuration
files are optional and lower precedence than environment variables and CLI
arguments. - SQLite indexing, Prometheus metrics, the MailCatcher facade, and both MCP
transports remain opt-in. - Clients that relied on invalid list parameters being silently ignored must
send valid dates, read filters, sort fields, sort orders, and bounded ID
batches. - Persistent relay recovery is at-least-once. A crash after the remote SMTP
server accepts DATA but before OwlMail records completion can cause a
duplicate delivery. - Back up the complete mail directory before testing an upgrade with persistent
data.
Included pull requests
- #91 Web history and keyboard navigation
- #90 configurable SMTP protocol limits
- #89 source-pinned MailDev and MailCatcher comparison
- #93 asynchronous relay status
- #92 Prometheus metrics
- #94 optional SQLite mailbox index
- #97 lifecycle-safe outgoing configuration
- #95 streaming SMTP relay
- #96 fail-closed outbound SMTP TLS
- #98 attachment content isolation
- #100 streaming source and bounded exports
- #101 structured JSON logging
- #99 strict API query and bulk bounds
- #102 email content tabs
- #107 persistent relay jobs
- #106 layered YAML and JSON configuration
- #105 MailCatcher REST facade
- #104 read-only MCP stdio bridge
- #103 safe manual relay controls
Install
docker pull ghcr.io/soulteary/owlmail:0.8.0
docker run --rm \
-p 127.0.0.1:1025:1025 \
-p 127.0.0.1:1080:1080 \
-v owlmail-data:/app/mail \
ghcr.io/soulteary/owlmail:0.8.0For repeatable deployment, record the published manifest digest and use
ghcr.io/soulteary/owlmail@sha256:<digest>.
Release artifacts
checksums.txtchecksums.txt.sigstore.jsonowlmail-linux-amd64andowlmail-linux-amd64.spdx.jsonowlmail-linux-arm64andowlmail-linux-arm64.spdx.jsonowlmail-darwin-amd64andowlmail-darwin-amd64.spdx.jsonowlmail-darwin-arm64andowlmail-darwin-arm64.spdx.jsonowlmail-windows-amd64.exeand
owlmail-windows-amd64.exe.spdx.json
sha256sum -c checksums.txt
gh attestation verify owlmail-linux-amd64 --repo soulteary/owlmail
cosign verify-blob \
--bundle checksums.txt.sigstore.json \
--certificate-identity-regexp '^https://github.com/soulteary/owlmail/.github/workflows/release.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
checksums.txt
cosign verify \
--certificate-identity-regexp '^https://github.com/soulteary/owlmail/.github/workflows/release.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
ghcr.io/soulteary/owlmail:0.8.0Known limitations
- MCP remains read-only and does not delete, mark, or relay messages.
- The MailCatcher facade does not implement MailCatcher's WebSocket event bus.
- Relay recovery is at-least-once rather than exactly-once.
- The exact GHCR
0.8.0tag is immutable after publication; use a patch
release instead of deleting and reusing published artifacts.
What's Changed
- feat(web): add history and keyboard navigation by @soulteary in #91
- feat(smtp): make protocol limits configurable by @soulteary in #90
- docs: refresh MailDev and MailCatcher comparison by @soulteary in #89
- feat(relay): expose asynchronous delivery status by @soulteary in #93
- feat(observability): add Prometheus metrics by @soulteary in #92
- feat(storage): add optional SQLite mailbox index by @soulteary in #94
- fix(relay): make runtime configuration lifecycle-safe by @soulteary in #97
- perf(relay): stream EML during SMTP delivery by @soulteary in #95
- security(relay): make outbound SMTP TLS fail closed by @soulteary in #96
- security(api): isolate untrusted attachment content by @soulteary in #98
- perf(api): stream source and optimize bounded exports by @soulteary in #100
- feat(observability): add structured JSON logging by @soulteary in #101
- fix(api): validate queries and bound bulk mutations by @soulteary in #99
- feat(web): add email content view tabs by @soulteary in #102
- feat(relay): persist delivery jobs and status by @soulteary in #107
- feat(config): add layered YAML and JSON configuration by @soulteary in #106
- feat(compat): add an opt-in MailCatcher REST facade by @soulteary in #105
- feat(mcp)...
v0.7.0
What's Changed
- feat: add configurable SMTP limits and S3 attachments by @soulteary in #69
- feat(smtp): enforce AUTH and add NO AUTH mode by @soulteary in #70
- perf(web): use preview API for mailbox lists by @soulteary in #72
- perf(mailserver): paginate before cloning email bodies by @soulteary in #73
- perf(mailserver): stream MIME attachments to staging by @soulteary in #75
- perf(mailserver): paginate before cloning email bodies by @soulteary in #74
- security(smtp): optionally require TLS for AUTH by @soulteary in #76
- security(web): isolate HTML email previews by @soulteary in #77
- feat(web): add responsive email viewport presets by @soulteary in #79
- feat(storage): add S3 readiness checks by @soulteary in #80
- feat(storage): add resumable attachment migration by @soulteary in #82
- feat(web): support configurable base path by @soulteary in #81
- feat(mcp): add optional read-only MCP server by @soulteary in #83
- feat(smtp): add configurable DATA concurrency limit by @soulteary in #84
- feat(cli): add sendmail-compatible SMTP client by @soulteary in #87
- docs(api): add OpenAPI 3.1 contract by @soulteary in #86
- feat(compat): add optional MailDev REST facade by @soulteary in #85
- feat(mcp): add read-only testing workflows by @soulteary in #88
Full Changelog: v0.6.0...v0.7.0
v0.6.0
OwlMail 0.6.0 release notes
OwlMail 0.6.0 makes persisted mail and webhook delivery substantially safer.
The release adds atomic mailbox transactions and recovery, configurable storage
governance, durable webhook queue handoffs, Redis lease protection, and
mobile-compatible browser notifications. It also hardens authenticated origin
checks and the release supply chain.
Commands that reference v0.6.0 or the 0.6.0 container tag work only after
the release tag has been published.
Highlights
Atomic mailbox persistence and recovery
Raw messages and attachments are staged and synced before the final .eml
rename makes a message visible. Failures during parsing, attachment writes, or
the in-memory commit roll back the transaction. At startup, incomplete,
corrupt, and generated orphan artifacts move to <mail-directory>/quarantine/
while unrelated directories and existing evidence are preserved.
The store now indexes mail by ID and returns deep snapshots to API, WebSocket,
webhook, and event consumers. Read state is persisted atomically under
.owlmail-meta/, so restart no longer resets successfully recorded state.
Storage governance
Operators can combine independent limits:
owlmail \
-mail-retention-days 14 \
-mail-max-messages 10000 \
-mail-max-disk-mb 2048 \
-mail-cleanup-interval 10mAll three limits default to 0 and are therefore disabled. When enabled,
cleanup runs at startup and periodically removes the oldest mail until every
configured limit is satisfied. The stats API reports current disk use, cleanup
runs, deleted messages, reclaimed bytes, and the last cleanup error. ZIP export
streams data and is bounded to 1,000 source messages and 256 MiB of raw EML.
Durable webhook handoff and Redis delivery
Every accepted webhook event is first written to a local outbox under the mail
directory. The outbox survives temporary Redis or in-memory queue handoff
failure and is preserved by inbox clear operations. Use a persistent
-mail-directory if this recovery boundary matters.
With -webhook-redis-url, Redis Streams provide restart recovery, stable
delivery IDs, consumer-group pending recovery, dead-letter records, and active
lease renewal. Lease renewal atomically verifies ownership so a delayed worker
cannot steal an entry back from another consumer. Delivery remains at least
once; receivers should deduplicate X-OwlMail-Delivery-ID.
Shutdown stops new handoffs and drains the outbox, queued work, and active
requests for up to -webhook-shutdown-timeout. Without Redis, a job is no
longer durable after it has moved from the local outbox into the process-local
memory queue.
Webhook and browser correctness
- Concurrency applies to individual target requests instead of letting one
message monopolize capacity across unrelated targets. - Text glob rules match arbitrary strings, including URL-like values that
contain/, while retaining Go-style wildcard and character-range grammar. - HMAC nonce expiry is exclusive at the validity boundary.
- Browser notifications use an active service worker where supported, focus
only an inbox client, and preserve the selected email in a new-window deep
link. OWLMAIL_WEB_EXTERNAL_SCHEME=httpslets authenticated HTTP and WebSocket
origin checks use the browser-visible scheme behind trusted TLS termination.
Behavior to review before upgrading
| Area | 0.6.0 behavior | Operator action |
|---|---|---|
| Mail directory | OwlMail creates .owlmail-meta, .owlmail-webhook-outbox, and quarantine |
Back up and restore the complete directory, including hidden entries |
| Retention | Any non-zero limit can delete oldest messages at startup | Test policies against a copied mailbox before production use |
| Recovery | Damaged OwlMail artifacts are quarantined instead of silently skipped | Inspect quarantine evidence manually; do not move it directly into the live directory |
| Webhook delivery | Local handoff is durable; full restart-safe queued delivery requires Redis | Use a persistent mail directory and Redis where end-to-end restart recovery is required |
| Delivery semantics | Redis delivery is at least once | Deduplicate the stable delivery ID at receivers |
| Reverse proxy | Authenticated browser origins include the scheme | Set OWLMAIL_WEB_EXTERNAL_SCHEME=https when trusted TLS termination is external |
Installation after publication
Release binaries
curl -fLO https://github.com/soulteary/owlmail/releases/download/v0.6.0/owlmail-linux-amd64
curl -fLO https://github.com/soulteary/owlmail/releases/download/v0.6.0/checksums.txt
grep ' owlmail-linux-amd64$' checksums.txt | sha256sum -c -
chmod +x owlmail-linux-amd64
./owlmail-linux-amd64The release includes Linux amd64/arm64, macOS amd64/arm64, and Windows amd64
binaries. Each executable has an adjacent SPDX SBOM. The checksum manifest has
a Sigstore bundle, and GitHub provenance attestations cover the binaries and
SBOMs.
Go install
Source installation requires Go 1.27.0 or newer:
go install github.com/soulteary/owlmail/cmd/owlmail@v0.6.0Downloaded release binaries do not require Go, Bun, or Node.js at runtime.
Container image
docker pull ghcr.io/soulteary/owlmail:0.6.0
docker run -d \
--name owlmail \
-p 127.0.0.1:1025:1025 \
-p 127.0.0.1:1080:1080 \
-v owlmail-data:/app/mail \
ghcr.io/soulteary/owlmail:0.6.0The release workflow refuses to overwrite an existing 0.6.0 image, while
0.6, 0, main, and latest remain moving aliases. Registry tags are still
names rather than content identities. Pin the published manifest digest for a
cryptographically exact deployment:
ghcr.io/soulteary/owlmail@sha256:<digest>
Known limitations
- Incoming SMTP username/password settings still do not reject unauthenticated
senders. Keep SMTP on a trusted interface or behind network controls. - Without Redis, delivery is not restart-safe after a job leaves the local
outbox for the process-local memory queue. - Redis delivery is at least once and can produce duplicates around crashes.
- Health endpoints remain public when Web Basic Auth is enabled.
- Without
-mail-directory, the process-specific temporary mail directory is
not a durable archive.
Documentation
- Operations and troubleshooting
- Webhook forwarding reference
- Webhook scenarios
- API reference
- Release verification
- Full changelog
What's Changed
- docs: sync soulteary/webhook integration demo by @soulteary in #31
- fix(storage): commit incoming messages atomically by @soulteary in #32
- feat(webhook): add durable Redis delivery semantics by @soulteary in #34
- ci: separate validation snapshots and releases by @soulteary in #37
- ci: attest and sign release artifacts by @soulteary in #38
- fix(store): isolate mail snapshots and index by id by @soulteary in #33
- ci: consolidate coverage into one authoritative job by @soulteary in #36
- fix(web): tolerate missing email address values by @soulteary in #40
- docs: document the pinned Bun prerequisite by @soulteary in #41
- fix(web): preserve inbox language on help fallback by @soulteary in #43
- fix(release): prevent old retries from moving image aliases by @soulteary in #47
- test(mailserver): verify configured email ID formats by @soulteary in #48
- docs: bind webhook demo ports to loopback by @soulteary in #55
- fix(webhook): isolate target delivery schedules by @soulteary in #45
- fix(webhook): retain nonces for the full signature window by @soulteary in #46
- fix(webhook): renew leases during active deliveries by @soulteary in #62
- fix(storage): preserve quarantine when clearing inbox by @soulteary in #50
- fix(storage): continue recovery after quarantine failures by @soulteary in #51
- fix(api): validate the scheme for authenticated same-origin requests by @soulteary in #52
- fix(webhook): apply glob patterns to arbitrary strings by @soulteary in #53
- fix(web): deliver browser notifications through a service worker by @soulteary in #54
- fix(webhook): spool queue handoffs before delivery by @soulteary in #63
- feat(storage): carry storage governance forward onto main by @soulteary in #60
- fix(web): correct singular text and locale initialization by @soulteary in #49
- fix(release): revalidate moving image tags before publication by @soulteary in #64
- docs(demo): require network controls for SMTP by @soulteary in #65
- fix(release): protect exact image tags by @soulteary in #68
- fix(webhook): roll back mail when outbox handoff fails by @soulteary in #67
- docs(release): prepare OwlMail 0.6.0 by @soulteary in #66
**Full Change...
v0.5.0
OwlMail 0.5.0 release notes
OwlMail 0.5.0 expands the server from a local inbox into a more complete
integration endpoint while retaining its single-binary deployment model. The
release adds configurable outgoing webhooks, an embedded webhook configurator,
embedded help, opt-in browser notifications, explicit webhook capacity
controls, and safer partial Web Basic Auth behavior.
Commands that reference v0.5.0 or the 0.5.0 container tag work only after
the release tag has been published.
Highlights
Webhook forwarding
Newly stored messages can be delivered to generic HTTP endpoints. A version 1
configuration supports 1–32 named targets with:
- case-insensitive wildcard filters for sender, recipient, and subject;
- default, custom JSON-safe, or plain-text request bodies;
- values loaded from environment variables;
- configurable headers, HMAC-SHA256 signatures, timeouts, and retries;
- multiple independent targets; and
- a runnable
soulteary/webhookCompose integration.
Use -webhook-config or OWLMAIL_WEBHOOK_CONFIG to select the JSON file. The
process-wide -webhook-max-concurrency /
OWLMAIL_WEBHOOK_MAX_CONCURRENCY setting defaults to 8; set it to 0 only
when unlimited delivery is intentional.
Browser webhook configurator
The inbox links to an English/Chinese editor at /webhooks. It can build a new
version 1 configuration or import, validate, copy, and download an existing
one. All editing happens locally in the browser; OwlMail does not upload the
configuration or its secrets.
Downloading a configuration does not activate it. Mount or otherwise place the
JSON file where the server can read it, select it with -webhook-config or
OWLMAIL_WEBHOOK_CONFIG, and restart OwlMail. Runtime environment placeholders
are preserved and are checked only when OwlMail starts.
Embedded operator help
The inbox now links to a bilingual local guide at /help. The HTML, CSS, and
JavaScript are embedded in the executable, so binary and container deployments
do not need a separate web directory.
Browser notifications
Notifications remain off by default and require an explicit click in each
browser. They apply only to new messages received through the live WebSocket,
require HTTPS or a trusted local origin, and never include the message body.
Web authentication defaults
Partial Web Basic Auth configuration no longer disables authentication:
| Configured values | Effective behavior |
|---|---|
| neither | authentication disabled |
| username only | keep the username, generate a random 32-character password, and print it once to stderr |
| password only | use username admin and the configured password |
| both | use both configured values unchanged |
Authenticated requests carrying a browser Origin header must come from
OwlMail's own origin. Basic Auth should still be used only on localhost or over
HTTPS.
Behavior to review before upgrading
| Area | 0.5.0 behavior | Operator action |
|---|---|---|
| Webhook saturation | A finite limit applies backpressure before handler goroutines start and can delay SMTP DATA completion |
Start with 8; size timeouts, retries, and concurrency together |
| Webhook shutdown | In-flight delivery is not drained before process exit | Stop new SMTP traffic and allow the longest retry window before termination |
| Web credentials | One configured value now produces usable credentials instead of silently disabling auth | Read generated credentials from stderr or configure both values explicitly |
| Browser notifications | Permission and preference are browser-local | Enable per browser under HTTPS or localhost |
| MailDev clients | OwlMail keeps MailDev-style workflow routes but does not implement the current MailDev API or Socket.IO protocol exactly | Validate paths, payloads, read side effects, and WebSocket clients |
Back up the complete mail directory before changing versions. Test an important
archive against a copy first.
Installation after publication
Release binaries
The release workflow publishes five executables and checksums.txt:
| Platform | Asset |
|---|---|
| Linux amd64 | owlmail-linux-amd64 |
| Linux arm64 | owlmail-linux-arm64 |
| macOS amd64 | owlmail-darwin-amd64 |
| macOS arm64 | owlmail-darwin-arm64 |
| Windows amd64 | owlmail-windows-amd64.exe |
Linux amd64 example:
curl -fLO https://github.com/soulteary/owlmail/releases/download/v0.5.0/owlmail-linux-amd64
curl -fLO https://github.com/soulteary/owlmail/releases/download/v0.5.0/checksums.txt
grep ' owlmail-linux-amd64$' checksums.txt | sha256sum -c -
chmod +x owlmail-linux-amd64
./owlmail-linux-amd64Go install
Source installation requires Go 1.27.0 or newer:
go install github.com/soulteary/owlmail/cmd/owlmail@v0.5.0Downloaded release binaries do not require Go, Bun, or Node.js at runtime.
Release binaries and images embed version, commit, build_date, and the
source tag. Inspect them through GET /api/v1/version; the release workflow
repeats the Go and Bun test suites, runs govulncheck, and smoke-tests the
embedded version and commit before uploading assets.
Container image
Use the release tag for a release deployment:
docker pull ghcr.io/soulteary/owlmail:0.5.0
docker run -d \
--name owlmail \
-p 127.0.0.1:1025:1025 \
-p 127.0.0.1:1080:1080 \
ghcr.io/soulteary/owlmail:0.5.0The main and latest tags move whenever the default branch is built; they are
not stable-release selectors. 0.5.0 selects this release, while
sha-<short-commit> selects one repository commit.
Known limitations
- Incoming SMTP username/password settings are present but unauthenticated
senders are not rejected. Keep the SMTP listener on a trusted network. - Webhook forwarding is an integration notification mechanism, not a durable
queue. Receivers should be idempotent. - Health endpoints remain public when Web Basic Auth is enabled so probes can
run without credentials. - The compiled SMTP defaults are 1 MiB per message, 50 recipients, and
10-second read/write timeouts.
Documentation
- Webhook forwarding reference
- Webhook scenarios
- API reference
- Operations and troubleshooting
- MailDev comparison and migration guide
- Full changelog
What's Changed
- feat: migrate Fiber integration to v3 by @soulteary in #14
- feat: forward incoming emails to configurable webhooks by @soulteary in #15
- feat: add an embedded local help page by @soulteary in #16
- feat: add opt-in browser notifications by @soulteary in #17
- docs: expand webhook examples and local help by @soulteary in #18
- fix(webhook): reject empty environment values by @soulteary in #19
- fix(api): restrict authenticated browser origins by @soulteary in #20
- test(web): cover browser notification behavior by @soulteary in #21
- feat(webhook): bound concurrent deliveries by @soulteary in #22
- feat(auth): complete partial web credentials by @soulteary in #23
- docs: establish verified API and operations guides by @soulteary in #24
- chore: upgrade to Go 1.27.0 and refresh dependencies by @soulteary in #25
- ci: replace external Go Report Card with local report by @soulteary in #26
- release: prepare OwlMail 0.5.0 by @soulteary in #27
- feat(web): add webhook configuration builder by @soulteary in #28
- ci: migrate browser and documentation tests to Bun by @soulteary in #29
- release: finalize OwlMail 0.5.0 readiness by @soulteary in #30
Full Changelog: v0.4.0...v0.5.0
v0.4.0
What's Changed
- feat: use cli-kit by @soulteary in #13
Full Changelog: v0.3.0...v0.4.0
What's Changed
- feat: use cli-kit by @soulteary in #13
Full Changelog: v0.3.0...v0.4.0
v0.3.0
What's Changed
- docs: append i18n docs by @soulteary in #10
- docs: docker use by @soulteary in #11
Full Changelog: v0.2.1...v0.3.0
What's Changed
- docs: append i18n docs by @soulteary in #10
- docs: docker use by @soulteary in #11
Full Changelog: v0.2.1...v0.3.0
v0.2.1
What's Changed
- fix: resolve issues with multi-architecture Dockerfile support by @soulteary in #9
Full Changelog: v0.2.0...v0.2.1
What's Changed
- fix: resolve issues with multi-architecture Dockerfile support by @soulteary in #9
Full Changelog: v0.2.0...v0.2.1
v0.2.0
What's Changed
- feat: add support for UUIDs in email ID generation and configuration by @soulteary in #5
- docs: enhance README with UUID support for email IDs and usage by @soulteary in #6
- feat: implement internationalization support with language toggle and translations for English and Chinese by @soulteary in #7
Full Changelog: v0.1.1...v0.2.0
What's Changed
- feat: add support for UUIDs in email ID generation and configuration by @soulteary in #5
- docs: enhance README with UUID support for email IDs and usage by @soulteary in #6
- feat: implement internationalization support with language toggle and translations for English and Chinese by @soulteary in #7
Full Changelog: v0.1.1...v0.2.0
v0.1.1
What's Changed
- fix: improve email address formatting and handling of unknown values by @soulteary in #4
Full Changelog: v0.1.0...v0.1.1
What's Changed
- fix: improve email address formatting and handling of unknown values by @soulteary in #4
Full Changelog: v0.1.0...v0.1.1
v0.1.0
What's Changed
- fix: properly decode email subject by @JokerQyou in #2
- fix: Dockerfile healthcheck does not use HTTP basic auth causing container to show up as unhealthy. by @JokerQyou in #1
- fix: update Docker workflow to use 'sha-' prefix for versioning by @soulteary in #3
New Contributors
- @JokerQyou made their first contribution in #2
- @soulteary made their first contribution in #3
Full Changelog: https://github.com/soulteary/owlmail/commits/v0.1.0
What's Changed
- fix: properly decode email subject by @JokerQyou in #2
- fix: Dockerfile healthcheck does not use HTTP basic auth causing container to show up as unhealthy. by @JokerQyou in #1
- fix: update Docker workflow to use 'sha-' prefix for versioning by @soulteary in #3
New Contributors
- @JokerQyou made their first contribution in #2
- @soulteary made their first contribution in #3
Full Changelog: https://github.com/soulteary/owlmail/commits/v0.1.0