100 lines
2.4 KiB
Rust
100 lines
2.4 KiB
Rust
use lettre::{
|
|
message::{Mailbox, MultiPart, SinglePart},
|
|
AsyncTransport, Message,
|
|
};
|
|
use askama::Template;
|
|
|
|
use crate::{models::User, utils::ApplicationError};
|
|
|
|
use super::Mailer;
|
|
|
|
impl Mailer {
|
|
pub async fn send_registration_mail(
|
|
&self,
|
|
user: &User,
|
|
token: &str,
|
|
) -> Result<(), ApplicationError> {
|
|
let message = build(&self.hostname, &user.name, &user.email, token)?;
|
|
self.transport.send(message).await?;
|
|
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
#[derive(Template)]
|
|
#[template(path = "emails/register.txt")]
|
|
struct RegisterMailTemplatePlain<'a> {
|
|
name: &'a str,
|
|
hostname: &'a str,
|
|
register_url: &'a str,
|
|
}
|
|
|
|
#[derive(Template)]
|
|
#[template(path = "emails/register.html")]
|
|
struct RegisterMailTemplateHtml<'a> {
|
|
name: &'a str,
|
|
hostname: &'a str,
|
|
register_url: &'a str,
|
|
}
|
|
|
|
fn build(
|
|
hostname: &str,
|
|
name: &str,
|
|
email: &str,
|
|
token: &str,
|
|
) -> Result<Message, ApplicationError> {
|
|
let register_url = format!("https://{hostname}/register?token={token}");
|
|
|
|
let plain = RegisterMailTemplatePlain {
|
|
name,
|
|
hostname,
|
|
register_url: ®ister_url,
|
|
}
|
|
.to_string();
|
|
|
|
let html = RegisterMailTemplateHtml {
|
|
name,
|
|
hostname,
|
|
register_url: ®ister_url,
|
|
}
|
|
.to_string();
|
|
|
|
let message = Message::builder()
|
|
.from("noreply <noreply@brasiwa-leipzig.de>".parse()?)
|
|
.reply_to("noreply <noreply@brasiwa-leipzig.de>".parse()?)
|
|
.to(Mailbox::new(Some(name.to_string()), email.parse()?))
|
|
.subject("Brass: Registrierung deines Accounts")
|
|
.multipart(
|
|
MultiPart::alternative()
|
|
.singlepart(SinglePart::plain(plain))
|
|
.singlepart(SinglePart::html(html)),
|
|
)?;
|
|
|
|
Ok(message)
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use crate::utils::test_helper::assert_mail_snapshot;
|
|
use lettre::{transport::stub::StubTransport, Transport};
|
|
|
|
#[test]
|
|
fn build_mail_snapshot() {
|
|
let message = build(
|
|
"brasiwa-leipzig.de",
|
|
"Max Mustermann",
|
|
"max@example.com",
|
|
"123456789",
|
|
)
|
|
.unwrap();
|
|
|
|
let sender = StubTransport::new_ok();
|
|
sender.send(&message).unwrap();
|
|
let messages = sender.messages();
|
|
let (_, sent_message) = messages.first().unwrap();
|
|
|
|
assert_mail_snapshot!(sent_message);
|
|
}
|
|
}
|