#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TlsMode {
ImplicitTls,
StartTls,
Plain,
}
#[derive(Debug, Clone, Default)]
pub enum TlsVerify {
#[default]
Verify,
SkipVerify,
CustomCa(Vec<u8>),
}
#[derive(Debug, Clone)]
pub struct Credentials {
pub username: String,
pub password: String,
}
#[derive(Debug, Clone)]
pub struct SmtpConfig {
pub host: String,
pub port: u16,
pub tls_mode: TlsMode,
pub credentials: Option<Credentials>,
pub timeout_ms: u32,
pub tls_verify: TlsVerify,
}
impl SmtpConfig {
#[must_use]
pub fn new(host: &str, port: u16) -> Self {
Self {
host: host.to_string(),
port,
tls_mode: TlsMode::ImplicitTls,
credentials: None,
timeout_ms: 5000,
tls_verify: TlsVerify::default(),
}
}
#[must_use]
pub const fn tls_mode(mut self, mode: TlsMode) -> Self {
self.tls_mode = mode;
self
}
#[must_use]
pub fn credentials(mut self, username: &str, password: &str) -> Self {
self.credentials = Some(Credentials {
username: username.to_string(),
password: password.to_string(),
});
self
}
#[must_use]
pub const fn timeout_ms(mut self, ms: u32) -> Self {
self.timeout_ms = ms;
self
}
#[must_use]
pub fn verify_certs(mut self) -> Self {
self.tls_verify = TlsVerify::Verify;
self
}
#[must_use]
pub fn skip_cert_verification(mut self) -> Self {
self.tls_verify = TlsVerify::SkipVerify;
self
}
#[must_use]
pub fn ca_cert_pem(mut self, pem: &[u8]) -> Self {
self.tls_verify = TlsVerify::CustomCa(pem.to_vec());
self
}
}