An opt-in receive-only SMTP listener (PICLOUD_SMTP_BIND) so an MX can point straight at PiCloud. It speaks minimal SMTP (HELO/EHLO/MAIL/RCPT/DATA/RSET/ NOOP/QUIT), resolves each RCPT TO mailbox to the app-owned email trigger that claims it, and inserts an Email outbox row the dispatcher fires — the same tail as the HMAC webhook, unchanged. - migration 0076: email_trigger_details.inbound_address (case-insensitively unique among app triggers) + TriggerRepo::email_inbound_target_by_address / SmtpInboundTarget; the interactive create-email API accepts inbound_address. - crates/picloud/src/smtp.rs: a small tokio accept loop + session state machine + a testable deliver() core + a minimal RFC-5322 header/body split. DATA is size-capped with dot-unstuffing; no AUTH/STARTTLS (TLS terminates upstream — the recipient address + per-app isolation are the boundary). - spawned in run_server alongside axum::serve, sharing the pool, on the same shutdown signal. Pinned by a picloud integration test (deliver → one Email outbox row for a known mailbox, none for an unknown one) + smtp.rs unit tests (address parse, header/body split). Multipart/MIME decoding is a documented follow-up. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
50 lines
1.0 KiB
TOML
50 lines
1.0 KiB
TOML
[package]
|
|
name = "picloud"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
rust-version.workspace = true
|
|
license.workspace = true
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[lib]
|
|
path = "src/lib.rs"
|
|
|
|
[[bin]]
|
|
name = "picloud"
|
|
path = "src/main.rs"
|
|
|
|
[dependencies]
|
|
picloud-shared.workspace = true
|
|
picloud-executor-core.workspace = true
|
|
picloud-orchestrator-core.workspace = true
|
|
picloud-manager-core.workspace = true
|
|
|
|
tokio.workspace = true
|
|
async-trait.workspace = true
|
|
axum.workspace = true
|
|
tower.workspace = true
|
|
tower-http.workspace = true
|
|
sqlx.workspace = true
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
anyhow.workspace = true
|
|
thiserror.workspace = true
|
|
tracing.workspace = true
|
|
tracing-subscriber.workspace = true
|
|
figment.workspace = true
|
|
chrono.workspace = true
|
|
|
|
[dev-dependencies]
|
|
picloud-test-support.workspace = true
|
|
axum-test = "17"
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
uuid.workspace = true
|
|
chrono.workspace = true
|
|
# Compute inbound-email HMAC signatures in the e2e receiver tests.
|
|
hmac.workspace = true
|
|
sha2.workspace = true
|
|
hex.workspace = true
|