use std::env; use brass_config::{Config, SmtpTlsType}; use lettre::{ message::{header::ContentType, Mailbox, MultiPart, SinglePart}, transport::smtp::{authentication::Credentials, extension::ClientId}, Message, SmtpTransport, }; use crate::models::User; use super::ApplicationError; pub fn get_mailer(config: &Config) -> anyhow::Result { let mut builder = match config.smtp_tlstype { SmtpTlsType::StartTLS => SmtpTransport::starttls_relay(&config.smtp_server)?.port(config.smtp_port), SmtpTlsType::TLS => SmtpTransport::relay(&config.smtp_server)?.port(config.smtp_port), SmtpTlsType::NoTLS => SmtpTransport::builder_dangerous(&config.smtp_server).port(config.smtp_port), }; if let (Some(login), Some(password)) = (config.smtp_login.as_ref(), config.smtp_password.as_ref()) { builder = builder.credentials(Credentials::new(login.to_string(), password.to_string())); } let mailer = builder .hello_name(ClientId::Domain(config.hostname.clone())) .build(); Ok(mailer) } pub fn build_forgot_password_message(user: &User, token: &str) -> Message { let hostname = env::var("HOSTNAME").unwrap(); let reset_url = format!("https://{hostname}/reset-password?token={token}"); let message = Message::builder() .from("noreply ".parse().unwrap()) .reply_to("noreply ".parse().unwrap()) .to(format!("{} <{}>", user.name, user.email).parse().unwrap()) .subject("Brass: Zurücksetzen des Passworts angefordert") .multipart( MultiPart::alternative() .singlepart( SinglePart::builder() .header(ContentType::TEXT_PLAIN) .body(format!(r##"Hallo {}, du hast angefordert, dein Passwort zurückzusetzen. Kopiere dafür folgenden Link in deinen Browser: {reset_url} Bitte beachte, dass der Link nur 24 Stunden gültig ist. Solltest du nichts angefordert haben, dann musst du nichts weiter tun. Viele Grüße"##, user.name)) ) .singlepart( SinglePart::builder() .header(ContentType::TEXT_HTML) .body(format!(r##"

Hallo {},

du hast angefordert, dein Passwort zurückzusetzen. Klicke dafür hier oder kopiere folgenden Link in deinen Browser:

{reset_url}

Bitte beachte, dass der Link nur 24 Stunden gültig ist. Solltest du nichts angefordert haben, dann musst du nichts weiter tun.

Viele Grüße

"##, user.name)) )) .unwrap(); return message; } pub fn build_registration_message(user: &User, token: &str) -> Result { let hostname = env::var("HOSTNAME")?; let register_url = format!("https://{hostname}/register?token={token}"); let message = Message::builder() .from("noreply ".parse()?) .reply_to("noreply ".parse()?) .to(Mailbox::new(Some(user.name.clone()), user.email.parse()?)) .subject("Brass: Registrierung deines Accounts") .multipart( MultiPart::alternative() .singlepart( SinglePart::builder() .header(ContentType::TEXT_PLAIN) .body(format!(r##"Hallo {}, dein Account für https:://{hostname} wurde erstellt. Du musst nur noch ein Passwort festlegen. Kopiere dafür folgenden Link in deinen Browser: {register_url} Bitte beachte, dass der Link nur 24 Stunden gültig ist. Viele Grüße"##, user.name)) ) .singlepart( SinglePart::builder() .header(ContentType::TEXT_HTML) .body(format!(r##"

Hallo {},

dein Account für https://{hostname} wurde erstellt. Du musst nur noch ein Passwort festlegen. Klicke dafür hier oder kopiere folgenden Link in deinen Browser:

{register_url}

Bitte beachte, dass der Link nur 24 Stunden gültig ist.

Viele Grüße

"##, user.name)) )) ?; Ok(message) }