feat: introduce SMTP env configurations (#2810)
Addresses #2601. `lettre` crate requires Rust `1.70+`. `ZO_SMTP_ENCRYPTION` env variable offers two important encryption method - `starttls` and `ssltls`.
This commit is contained in:
parent
b68ba66ea5
commit
8f1d5f7010
|
@ -9,7 +9,7 @@ OpenObserve uses Rust & embdeds sled db (For server) & VueJS (For Web UI)
|
||||||
You must have follwing installed:
|
You must have follwing installed:
|
||||||
|
|
||||||
1. Git
|
1. Git
|
||||||
2. Rust & Cargo 1.61.0 + (We recommend 1.66+),
|
2. Rust & Cargo 1.70+
|
||||||
3. nodejs v14+ and npm v6+
|
3. nodejs v14+ and npm v6+
|
||||||
|
|
||||||
Alternatively you can use pre-configured devcontainer in VS code to get up and running quickly.
|
Alternatively you can use pre-configured devcontainer in VS code to get up and running quickly.
|
||||||
|
|
|
@ -1181,7 +1181,7 @@ dependencies = [
|
||||||
"hyper-rustls",
|
"hyper-rustls",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rustls",
|
"rustls 0.21.10",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tower",
|
"tower",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
@ -1823,6 +1823,16 @@ dependencies = [
|
||||||
"phf_codegen",
|
"phf_codegen",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "chumsky"
|
||||||
|
version = "0.9.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9"
|
||||||
|
dependencies = [
|
||||||
|
"hashbrown 0.14.3",
|
||||||
|
"stacker",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ciborium"
|
name = "ciborium"
|
||||||
version = "0.2.2"
|
version = "0.2.2"
|
||||||
|
@ -2072,6 +2082,7 @@ dependencies = [
|
||||||
"hex",
|
"hex",
|
||||||
"indexmap 2.1.0",
|
"indexmap 2.1.0",
|
||||||
"itertools 0.12.1",
|
"itertools 0.12.1",
|
||||||
|
"lettre",
|
||||||
"log",
|
"log",
|
||||||
"memchr",
|
"memchr",
|
||||||
"murmur3",
|
"murmur3",
|
||||||
|
@ -2783,6 +2794,22 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "email-encoding"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dbfb21b9878cf7a348dcb8559109aabc0ec40d69924bd706fa5149846c4fef75"
|
||||||
|
dependencies = [
|
||||||
|
"base64 0.21.7",
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "email_address"
|
||||||
|
version = "0.2.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2153bd83ebc09db15bcbdc3e2194d901804952e3dc96967e1cd3b0c5c32d112"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ena"
|
name = "ena"
|
||||||
version = "0.14.2"
|
version = "0.14.2"
|
||||||
|
@ -3532,10 +3559,10 @@ dependencies = [
|
||||||
"http 0.2.11",
|
"http 0.2.11",
|
||||||
"hyper",
|
"hyper",
|
||||||
"log",
|
"log",
|
||||||
"rustls",
|
"rustls 0.21.10",
|
||||||
"rustls-native-certs",
|
"rustls-native-certs",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-rustls",
|
"tokio-rustls 0.24.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -3894,6 +3921,36 @@ dependencies = [
|
||||||
"spin 0.5.2",
|
"spin 0.5.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lettre"
|
||||||
|
version = "0.11.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "357ff5edb6d8326473a64c82cf41ddf78ab116f89668c50c4fac1b321e5e80f4"
|
||||||
|
dependencies = [
|
||||||
|
"async-trait",
|
||||||
|
"base64 0.21.7",
|
||||||
|
"chumsky",
|
||||||
|
"email-encoding",
|
||||||
|
"email_address",
|
||||||
|
"fastrand 2.0.1",
|
||||||
|
"futures-io",
|
||||||
|
"futures-util",
|
||||||
|
"hostname",
|
||||||
|
"httpdate",
|
||||||
|
"idna",
|
||||||
|
"mime",
|
||||||
|
"nom",
|
||||||
|
"percent-encoding",
|
||||||
|
"quoted_printable",
|
||||||
|
"rustls 0.22.2",
|
||||||
|
"rustls-pemfile 2.0.0",
|
||||||
|
"socket2",
|
||||||
|
"tokio",
|
||||||
|
"tokio-rustls 0.25.0",
|
||||||
|
"url",
|
||||||
|
"webpki-roots 0.26.1",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lexical-core"
|
name = "lexical-core"
|
||||||
version = "0.8.5"
|
version = "0.8.5"
|
||||||
|
@ -4671,6 +4728,7 @@ dependencies = [
|
||||||
"ipnetwork 0.20.0",
|
"ipnetwork 0.20.0",
|
||||||
"itertools 0.12.1",
|
"itertools 0.12.1",
|
||||||
"jsonwebtoken",
|
"jsonwebtoken",
|
||||||
|
"lettre",
|
||||||
"log",
|
"log",
|
||||||
"maxminddb",
|
"maxminddb",
|
||||||
"memory-stats",
|
"memory-stats",
|
||||||
|
@ -5483,6 +5541,15 @@ version = "2.28.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
|
checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "psm"
|
||||||
|
version = "0.1.21"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ptr_meta"
|
name = "ptr_meta"
|
||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
|
@ -5756,7 +5823,7 @@ dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rustls",
|
"rustls 0.21.10",
|
||||||
"rustls-native-certs",
|
"rustls-native-certs",
|
||||||
"rustls-pemfile 1.0.4",
|
"rustls-pemfile 1.0.4",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -5765,7 +5832,7 @@ dependencies = [
|
||||||
"sync_wrapper",
|
"sync_wrapper",
|
||||||
"system-configuration",
|
"system-configuration",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-rustls",
|
"tokio-rustls 0.24.1",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
"url",
|
"url",
|
||||||
|
@ -5773,7 +5840,7 @@ dependencies = [
|
||||||
"wasm-bindgen-futures",
|
"wasm-bindgen-futures",
|
||||||
"wasm-streams",
|
"wasm-streams",
|
||||||
"web-sys",
|
"web-sys",
|
||||||
"webpki-roots",
|
"webpki-roots 0.25.4",
|
||||||
"winreg",
|
"winreg",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -6013,10 +6080,24 @@ checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"ring 0.17.7",
|
"ring 0.17.7",
|
||||||
"rustls-webpki",
|
"rustls-webpki 0.101.7",
|
||||||
"sct",
|
"sct",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustls"
|
||||||
|
version = "0.22.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
"ring 0.17.7",
|
||||||
|
"rustls-pki-types",
|
||||||
|
"rustls-webpki 0.102.2",
|
||||||
|
"subtle",
|
||||||
|
"zeroize",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustls-native-certs"
|
name = "rustls-native-certs"
|
||||||
version = "0.6.3"
|
version = "0.6.3"
|
||||||
|
@ -6064,6 +6145,17 @@ dependencies = [
|
||||||
"untrusted 0.9.0",
|
"untrusted 0.9.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustls-webpki"
|
||||||
|
version = "0.102.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610"
|
||||||
|
dependencies = [
|
||||||
|
"ring 0.17.7",
|
||||||
|
"rustls-pki-types",
|
||||||
|
"untrusted 0.9.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustversion"
|
name = "rustversion"
|
||||||
version = "1.0.14"
|
version = "1.0.14"
|
||||||
|
@ -6590,7 +6682,7 @@ dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"paste",
|
"paste",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"rustls",
|
"rustls 0.21.10",
|
||||||
"rustls-pemfile 1.0.4",
|
"rustls-pemfile 1.0.4",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -6602,7 +6694,7 @@ dependencies = [
|
||||||
"tokio-stream",
|
"tokio-stream",
|
||||||
"tracing",
|
"tracing",
|
||||||
"url",
|
"url",
|
||||||
"webpki-roots",
|
"webpki-roots 0.25.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -6758,6 +6850,19 @@ version = "1.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
|
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "stacker"
|
||||||
|
version = "0.1.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
"cfg-if 1.0.0",
|
||||||
|
"libc",
|
||||||
|
"psm",
|
||||||
|
"winapi 0.3.9",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "static_assertions"
|
name = "static_assertions"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
@ -7191,7 +7296,18 @@ version = "0.24.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
|
checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rustls",
|
"rustls 0.21.10",
|
||||||
|
"tokio",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio-rustls"
|
||||||
|
version = "0.25.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f"
|
||||||
|
dependencies = [
|
||||||
|
"rustls 0.22.2",
|
||||||
|
"rustls-pki-types",
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -7296,10 +7412,10 @@ dependencies = [
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project",
|
"pin-project",
|
||||||
"prost 0.12.3",
|
"prost 0.12.3",
|
||||||
"rustls",
|
"rustls 0.21.10",
|
||||||
"rustls-pemfile 1.0.4",
|
"rustls-pemfile 1.0.4",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-rustls",
|
"tokio-rustls 0.24.1",
|
||||||
"tokio-stream",
|
"tokio-stream",
|
||||||
"tower",
|
"tower",
|
||||||
"tower-layer",
|
"tower-layer",
|
||||||
|
@ -7999,6 +8115,15 @@ version = "0.25.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
|
checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "webpki-roots"
|
||||||
|
version = "0.26.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009"
|
||||||
|
dependencies = [
|
||||||
|
"rustls-pki-types",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "which"
|
name = "which"
|
||||||
version = "4.4.2"
|
version = "4.4.2"
|
||||||
|
|
|
@ -152,6 +152,7 @@ zstd.workspace = true
|
||||||
config.workspace = true
|
config.workspace = true
|
||||||
infra.workspace = true
|
infra.workspace = true
|
||||||
ingester.workspace = true
|
ingester.workspace = true
|
||||||
|
lettre.workspace = true
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
chrono = { version = "0.4", default-features = false, features = ["clock"] }
|
chrono = { version = "0.4", default-features = false, features = ["clock"] }
|
||||||
|
@ -217,6 +218,14 @@ hex = "0.4"
|
||||||
indexmap = { version = "2.0", features = ["serde"] }
|
indexmap = { version = "2.0", features = ["serde"] }
|
||||||
ipnetwork = "0.20"
|
ipnetwork = "0.20"
|
||||||
itertools = "0.12"
|
itertools = "0.12"
|
||||||
|
lettre = { version = "0.11", default-features = false, features = [
|
||||||
|
"builder",
|
||||||
|
"hostname",
|
||||||
|
"smtp-transport",
|
||||||
|
"pool",
|
||||||
|
"tokio1",
|
||||||
|
"tokio1-rustls-tls",
|
||||||
|
] }
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
memchr = "2.5"
|
memchr = "2.5"
|
||||||
murmur3 = "0.5"
|
murmur3 = "0.5"
|
||||||
|
|
|
@ -47,3 +47,4 @@ tracing-log.workspace = true
|
||||||
tracing-subscriber.workspace = true
|
tracing-subscriber.workspace = true
|
||||||
utoipa.workspace = true
|
utoipa.workspace = true
|
||||||
walkdir.workspace = true
|
walkdir.workspace = true
|
||||||
|
lettre.workspace = true
|
|
@ -19,6 +19,13 @@ use dotenv_config::EnvConfig;
|
||||||
use dotenvy::dotenv;
|
use dotenvy::dotenv;
|
||||||
use hashbrown::{HashMap, HashSet};
|
use hashbrown::{HashMap, HashSet};
|
||||||
use itertools::chain;
|
use itertools::chain;
|
||||||
|
use lettre::{
|
||||||
|
transport::smtp::{
|
||||||
|
authentication::Credentials,
|
||||||
|
client::{Tls, TlsParameters},
|
||||||
|
},
|
||||||
|
AsyncSmtpTransport, Tokio1Executor,
|
||||||
|
};
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use reqwest::Client;
|
use reqwest::Client;
|
||||||
use sysinfo::{DiskExt, SystemExt};
|
use sysinfo::{DiskExt, SystemExt};
|
||||||
|
@ -139,6 +146,34 @@ pub static TELEMETRY_CLIENT: Lazy<segment::HttpClient> = Lazy::new(|| {
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
pub static SMTP_CLIENT: Lazy<Option<AsyncSmtpTransport<Tokio1Executor>>> = Lazy::new(|| {
|
||||||
|
if !CONFIG.smtp.smtp_enabled {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
let tls_parameters = TlsParameters::new(CONFIG.smtp.smtp_host.clone()).unwrap();
|
||||||
|
let mut transport_builder =
|
||||||
|
AsyncSmtpTransport::<Tokio1Executor>::builder_dangerous(&CONFIG.smtp.smtp_host)
|
||||||
|
.port(CONFIG.smtp.smtp_port);
|
||||||
|
|
||||||
|
let option = &CONFIG.smtp.smtp_encryption;
|
||||||
|
transport_builder = if option == "starttls" {
|
||||||
|
transport_builder.tls(Tls::Required(tls_parameters))
|
||||||
|
} else if option == "ssltls" {
|
||||||
|
transport_builder.tls(Tls::Wrapper(tls_parameters))
|
||||||
|
} else {
|
||||||
|
transport_builder
|
||||||
|
};
|
||||||
|
|
||||||
|
if !CONFIG.smtp.smtp_username.is_empty() && !CONFIG.smtp.smtp_password.is_empty() {
|
||||||
|
transport_builder = transport_builder.credentials(Credentials::new(
|
||||||
|
CONFIG.smtp.smtp_username.clone(),
|
||||||
|
CONFIG.smtp.smtp_password.clone(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
Some(transport_builder.build())
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
#[derive(EnvConfig)]
|
#[derive(EnvConfig)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub auth: Auth,
|
pub auth: Auth,
|
||||||
|
@ -158,6 +193,27 @@ pub struct Config {
|
||||||
pub tcp: TCP,
|
pub tcp: TCP,
|
||||||
pub prom: Prometheus,
|
pub prom: Prometheus,
|
||||||
pub profiling: Pyroscope,
|
pub profiling: Pyroscope,
|
||||||
|
pub smtp: Smtp,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(EnvConfig)]
|
||||||
|
pub struct Smtp {
|
||||||
|
#[env_config(name = "ZO_SMTP_ENABLED", default = false)]
|
||||||
|
pub smtp_enabled: bool,
|
||||||
|
#[env_config(name = "ZO_SMTP_HOST", default = "localhost")]
|
||||||
|
pub smtp_host: String,
|
||||||
|
#[env_config(name = "ZO_SMTP_PORT", default = 25)]
|
||||||
|
pub smtp_port: u16,
|
||||||
|
#[env_config(name = "ZO_SMTP_USER_NAME", default = "")]
|
||||||
|
pub smtp_username: String,
|
||||||
|
#[env_config(name = "ZO_SMTP_PASSWORD", default = "")]
|
||||||
|
pub smtp_password: String,
|
||||||
|
#[env_config(name = "ZO_SMTP_REPLY_TO", default = "")]
|
||||||
|
pub smtp_reply_to: String,
|
||||||
|
#[env_config(name = "ZO_SMTP_FROM_EMAIL", default = "")]
|
||||||
|
pub smtp_from_email: String,
|
||||||
|
#[env_config(name = "ZO_SMTP_ENCRYPTION", default = "")]
|
||||||
|
pub smtp_encryption: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(EnvConfig)]
|
#[derive(EnvConfig)]
|
||||||
|
|
Loading…
Reference in New Issue