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 " .parse() .unwrap(), ) .reply_to( "ASKÖ Ruderverein Donau Linz " .parse() .unwrap(), ) .to("ASKÖ Ruderverein Donau Linz " .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 } }