115 lines
4.5 KiB
Rust
115 lines
4.5 KiB
Rust
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<SmtpTransport> {
|
|
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 <noreply@brasiwa-leipzig.de>".parse().unwrap())
|
|
.reply_to("noreply <noreply@brasiwa-leipzig.de>".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##"<p>Hallo {},</p>
|
|
|
|
<p>du hast angefordert, dein Passwort zurückzusetzen. Klicke dafür <a href="{reset_url}" target="_blank">hier</a> oder kopiere folgenden Link in deinen Browser:</p>
|
|
|
|
<p>{reset_url}</p>
|
|
|
|
<p>Bitte beachte, dass der Link <b>nur 24 Stunden gültig</b> ist. Solltest du nichts angefordert haben, dann musst du nichts weiter tun.</p>
|
|
|
|
<p>Viele Grüße</p>"##, user.name))
|
|
))
|
|
.unwrap();
|
|
|
|
return message;
|
|
}
|
|
|
|
pub fn build_registration_message(user: &User, token: &str) -> Result<Message, ApplicationError> {
|
|
let hostname = env::var("HOSTNAME")?;
|
|
let register_url = format!("https://{hostname}/register?token={token}");
|
|
|
|
let message = Message::builder()
|
|
.from("noreply <noreply@brasiwa-leipzig.de>".parse()?)
|
|
.reply_to("noreply <noreply@brasiwa-leipzig.de>".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##"<p>Hallo {},</p>
|
|
|
|
<p>dein Account für <a href="https:://{hostname}" target="_blank">https://{hostname}</a> wurde erstellt. Du musst nur noch ein Passwort festlegen. Klicke dafür <a href="{register_url}" target="_blank">hier</a> oder kopiere folgenden Link in deinen Browser:</p>
|
|
|
|
<p>{register_url}</p>
|
|
|
|
<p>Bitte beachte, dass der Link <b>nur 24 Stunden gültig</b> ist.</p>
|
|
|
|
<p>Viele Grüße</p>"##, user.name))
|
|
))
|
|
?;
|
|
|
|
Ok(message)
|
|
}
|