66 lines
1.8 KiB
Rust
66 lines
1.8 KiB
Rust
|
use std::error::Error;
|
||
|
|
||
|
use lettre::{
|
||
|
message::{
|
||
|
header::{self, ContentType},
|
||
|
MultiPart, SinglePart,
|
||
|
},
|
||
|
transport::smtp::authentication::Credentials,
|
||
|
Message, SmtpTransport, Transport,
|
||
|
};
|
||
|
use sqlx::SqlitePool;
|
||
|
|
||
|
use crate::tera::admin::mail::MailToSend;
|
||
|
|
||
|
use super::role::Role;
|
||
|
|
||
|
pub struct Mail {}
|
||
|
|
||
|
impl Mail {
|
||
|
pub async fn send(db: &SqlitePool, data: MailToSend<'_>, smtp_pw: String) -> bool {
|
||
|
let mut email = Message::builder()
|
||
|
.from(
|
||
|
"ASKÖ Ruderverein Donau Linz <no-reply@rudernlinz.at>"
|
||
|
.parse()
|
||
|
.unwrap(),
|
||
|
)
|
||
|
.reply_to(
|
||
|
"ASKÖ Ruderverein Donau Linz <info@rudernlinz.at>"
|
||
|
.parse()
|
||
|
.unwrap(),
|
||
|
)
|
||
|
.to("ASKÖ Ruderverein Donau Linz <no-reply@rudernlinz.at>"
|
||
|
.parse()
|
||
|
.unwrap());
|
||
|
let role = Role::find_by_id(db, data.role_id).await.unwrap();
|
||
|
for rec in role.mails_from_role(db).await {
|
||
|
let splitted = rec.split(',');
|
||
|
for single_rec in splitted {
|
||
|
email = email.bcc(single_rec.parse().unwrap());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// TODO: handle attachments
|
||
|
|
||
|
let email = email
|
||
|
.subject(data.subject)
|
||
|
.header(ContentType::TEXT_PLAIN)
|
||
|
.body(String::from(data.body))
|
||
|
.unwrap();
|
||
|
|
||
|
let creds = Credentials::new("no-reply@rudernlinz.at".to_owned(), smtp_pw);
|
||
|
|
||
|
let mailer = SmtpTransport::relay("mail.your-server.de")
|
||
|
.unwrap()
|
||
|
.credentials(creds)
|
||
|
.build();
|
||
|
|
||
|
// Send the email
|
||
|
match mailer.send(&email) {
|
||
|
Ok(_) => return true,
|
||
|
Err(e) => println!("{:?}", e.source()),
|
||
|
};
|
||
|
false
|
||
|
}
|
||
|
}
|