use crate::settings::Settings; use lettre::{ smtp::{ authentication::{Credentials, Mechanism}, extension::ClientId, ConnectionReuseParameters, }, ClientSecurity, SmtpClient, Transport, }; use lettre_email::Email; pub fn send_email( subject: &str, to_email: &str, to_username: &str, html: &str, ) -> Result<(), String> { let email_config = Settings::get().email.ok_or("no_email_setup")?; let email = Email::builder() .to((to_email, to_username)) .from(email_config.smtp_from_address.to_owned()) .subject(subject) .html(html) .build() .unwrap(); let mailer = if email_config.use_tls { SmtpClient::new_simple(&email_config.smtp_server).unwrap() } else { SmtpClient::new(&email_config.smtp_server, ClientSecurity::None).unwrap() } .hello_name(ClientId::Domain(Settings::get().hostname)) .smtp_utf8(true) .authentication_mechanism(Mechanism::Plain) .connection_reuse(ConnectionReuseParameters::ReuseUnlimited); let mailer = if let (Some(login), Some(password)) = (&email_config.smtp_login, &email_config.smtp_password) { mailer.credentials(Credentials::new(login.to_owned(), password.to_owned())) } else { mailer }; let mut transport = mailer.transport(); let result = transport.send(email.into()); transport.close(); match result { Ok(_) => Ok(()), Err(e) => Err(e.to_string()), } }