use std::sync::Arc; use lettre::{AsyncSmtpTransport, AsyncTransport, Tokio1Executor}; pub use crate::error::EmailError; use crate::{ config::SmtpConfig, email_build::build_message_from_parts, pb::email::v1::SendEmailRequest, queue::EmailJob, }; pub(crate) type Mailer = AsyncSmtpTransport; #[derive(Clone)] pub struct EmailSender { config: Arc, mailer: Mailer, } impl EmailSender { pub fn new(config: SmtpConfig) -> Result { let mailer = crate::email_build::build_mailer(&config)?; Ok(Self { config: Arc::new(config), mailer, }) } pub async fn send(&self, request: &SendEmailRequest) -> Result<(), EmailError> { let message = build_message_from_parts(&self.config, request)?; self.mailer .send(message) .await .map_err(|e| EmailError::Send(e.to_string()))?; Ok(()) } pub async fn send_job(&self, job: &EmailJob) -> Result<(), EmailError> { self.send(&job.request).await } }