Outbound email reachable from scripts as email::send(#{...}) (plain
text) and email::send_html(#{...}) (multipart text + HTML). Backed by a
lettre SMTP relay configured from PICLOUD_SMTP_HOST/PORT/USER/PASSWORD/
TLS/TIMEOUT_SECS; if HOST/USER/PASSWORD aren't all set the service runs
in disabled mode (every send throws NotConfigured, warned at startup).
- EmailService trait + OutboundEmail DTO (picloud-shared);
EmailServiceImpl + EmailTransport seam + lettre transport
(manager-core), wired into the Services bundle and Rhai engine.
- Capability::AppEmailSend (→ script:write); seven-scope commitment held.
- Required-field + RFC5322-ish address validation; 25 MB per-message cap
(PICLOUD_EMAIL_MAX_MESSAGE_BYTES). reply_to defaults to from.
- Per-call connection (pooling deferred to v1.2); no per-app from
validation (operator's SMTP/SPF/DKIM concern).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
41 lines
889 B
TOML
41 lines
889 B
TOML
[package]
|
|
name = "picloud-manager-core"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
rust-version.workspace = true
|
|
license.workspace = true
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[dependencies]
|
|
picloud-shared.workspace = true
|
|
picloud-executor-core.workspace = true
|
|
picloud-orchestrator-core.workspace = true
|
|
|
|
async-trait.workspace = true
|
|
axum.workspace = true
|
|
rand.workspace = true
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
thiserror.workspace = true
|
|
tokio.workspace = true
|
|
tracing.workspace = true
|
|
uuid.workspace = true
|
|
chrono.workspace = true
|
|
chrono-tz.workspace = true
|
|
cron.workspace = true
|
|
sqlx.workspace = true
|
|
url.workspace = true
|
|
reqwest.workspace = true
|
|
|
|
argon2.workspace = true
|
|
sha2.workspace = true
|
|
base64.workspace = true
|
|
data-encoding.workspace = true
|
|
# Outbound SMTP email (v1.1.7 email::send / send_html).
|
|
lettre.workspace = true
|
|
|
|
[dev-dependencies]
|
|
tokio.workspace = true
|