Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
e142700
feat(core): built-in SMTP email transport for generic SMTP credentials
swissky Jul 20, 2026
854f2b8
style: format
emdashbot[bot] Jul 20, 2026
c64a20b
feat(core): SMTP email transport with admin UI configuration
swissky Jul 21, 2026
7d3d6c6
style: format
emdashbot[bot] Jul 21, 2026
348260a
feat(core): email settings UI with SMTP + Cloudflare Email providers
swissky Jul 21, 2026
a657f84
i18n(fr): translate 138 missing keys + consistency around media libra…
ArmandPhilippot Jul 20, 2026
c8a5ac8
feat(seo): getSeoMeta accepts defaultTitle/defaultDescription (#1518)…
swissky Jul 20, 2026
918bffc
feat(mcp): add media_upload tool for programmatic media management (#…
swissky Jul 20, 2026
b4035ac
fix(core): surface missing deleted_at column in admin content list (#…
eyupcanakman Jul 20, 2026
ebed9fb
fix(core): draft-only saves no longer bump updated_at on published en…
swissky Jul 20, 2026
2971102
docs: strengthen agent guidance on logged-out query counts, comments,…
ascorbic Jul 20, 2026
cf670e0
Update admin navigation icon vocabulary (#2151)
khoinguyenpham04 Jul 20, 2026
26a021b
chore: extract locale catalogs [skip ci]
emdashbot[bot] Jul 20, 2026
d86e9c1
fix seed setup query budget (#2128)
jcheese1 Jul 20, 2026
3c5d9d1
fix(core): include success field in API responses (#2098)
yannicktf Jul 21, 2026
7a98d23
test: add visual regression suite for the admin UI (#2147)
ascorbic Jul 21, 2026
51cefbc
chore: extract locale catalogs [skip ci]
emdashbot[bot] Jul 21, 2026
df9873f
feat(plugins): auto-generate admin settings UI from settingsSchema (#…
swissky Jul 21, 2026
c28fbda
chore: extract locale catalogs [skip ci]
emdashbot[bot] Jul 21, 2026
1153ef8
fix(admin): isolate plugin block modal saves (#2160)
saariuslystoned Jul 21, 2026
eeb872c
fix(core): compare plugin-storage numeric filters/order numerically o…
vedanshujain Jul 21, 2026
3c9c029
chore: extract locale catalogs [skip ci]
emdashbot[bot] Jul 21, 2026
d2cb611
feat(plugins): allow explicit MCP tool declarations (#2002)
jcheese1 Jul 21, 2026
7e8cdf8
chore: extract locale catalogs [skip ci]
emdashbot[bot] Jul 21, 2026
beb7bc0
Expose Astro's trailingSlash config to plugins via ctx.site (#2122)
bimsonz Jul 21, 2026
5dcf482
test: add initial visual regression baselines (#2165)
ascorbic Jul 21, 2026
782d1c0
fix(admin): keep rich-text toolbar states visible and accurate (#2158)
khoinguyenpham04 Jul 21, 2026
79dbff2
chore: extract locale catalogs [skip ci]
emdashbot[bot] Jul 21, 2026
cb05d09
ci: release (#1930)
emdashbot[bot] Jul 21, 2026
6d7d7ba
ci: accept visual baselines via /accept-baselines comment (#2171)
ascorbic Jul 21, 2026
473e92e
fix(core): race SMTP timeout against delivery, surface SMTP errors in…
swissky Jul 21, 2026
4411d34
Merge remote-tracking branch 'upstream/main' into feat/smtp-transport
swissky Jul 22, 2026
474bb85
fix(core): address emdashbot review findings on SMTP transport
swissky Jul 22, 2026
2826cc7
fix(core): move regex to module scope for oxlint prefer-static-regex
swissky Jul 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/smtp-email-transport.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"emdash": minor
---

Adds a built-in SMTP email transport for generic SMTP credentials (Brevo relay, Office365, Fastmail, Amazon SES, self-hosted Postfix). Configure via `EMAIL_SMTP_HOST`, `EMAIL_SMTP_PORT`, `EMAIL_SMTP_USER`, `EMAIL_SMTP_PASS`, and optional `EMAIL_SMTP_FROM` env vars, or via the new Settings → Email admin UI (password stored encrypted). Supports STARTTLS (port 587) and implicit TLS (port 465); port 25 is refused with a clear error. Works on Cloudflare Workers and Node.
38 changes: 38 additions & 0 deletions docs/src/content/docs/deployment/cloudflare.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,44 @@ the provider under **Settings → Email**.
Email.
</Aside>

### Built-in SMTP transport

If you don't want to use Cloudflare Email Sending (e.g. you already have SMTP
credentials for Brevo relay, Office365, Fastmail, Amazon SES, or a self-hosted
Postfix relay), EmDash includes a built-in SMTP transport that works with any
standard SMTP server. Sandboxed plugins cannot open TCP sockets, so this lives
in core and uses `cloudflare:sockets` on Workers or `node:net`/`node:tls` on
Node.

Configure via environment variables:

```bash title=".env"
EMAIL_SMTP_HOST=smtp-relay.brevo.com
EMAIL_SMTP_PORT=587
EMAIL_SMTP_USER=you@example.com
EMAIL_SMTP_PASS=xsmtpsib-your-key-here
EMAIL_SMTP_FROM="My Site <noreply@example.com>"
```

| Variable | Example | Notes |
| ----------------- | ------------------------------ | --------------------------------------------------------- |
| `EMAIL_SMTP_HOST` | `smtp-relay.brevo.com` | Any SMTP server reachable from your deployment |
| `EMAIL_SMTP_PORT` | `587` or `465` | 587 = STARTTLS, 465 = implicit TLS. Port 25 is refused. |
| `EMAIL_SMTP_USER` | `you@example.com` | SMTP auth username |
| `EMAIL_SMTP_PASS` | `xsmtpsib-…` | SMTP auth password (store as a secret) |
| `EMAIL_SMTP_FROM` | `My Site <noreply@example.com>` | Optional default sender; falls back to `EMAIL_SMTP_USER` |

<Aside type="caution">
Cloudflare blocks outbound port 25. This transport only supports submission
ports 587 (STARTTLS) and 465 (implicit TLS), and refuses port 25 with a clear
error. TLS is always required — plaintext auth is never attempted.
</Aside>

When configured, the SMTP transport registers as a built-in `email:deliver`
provider. Explicitly selected plugin transports (like `cloudflareEmail()`) still
take precedence — the built-in SMTP provider only wins when it's the sole
registered provider or when you explicitly select it under **Settings → Email**.

## Environment Variables

### Recommended: encryption key
Expand Down
Loading
Loading