diff --git a/src/config/config_email.rs b/src/config/config_email.rs index c7619dc..c967998 100644 --- a/src/config/config_email.rs +++ b/src/config/config_email.rs @@ -5,6 +5,8 @@ use std::env; pub struct ConfigEmail { pub smtp_server: String, pub smtp_port: u16, + pub smtp_name: String, + pub smtp_email: String, pub smtp_username: String, pub smtp_password: String, } @@ -16,9 +18,14 @@ pub fn get_config_email() -> ConfigEmail { let username = env::var("SMTP_USERNAME").expect("SMTP_USERNAME must be set"); let password = env::var("SMTP_PASSWORD").expect("SMTP_PASSWORD must be set"); - ConfigEmail{ + let name = env::var("SMTP_NAME").expect("SMTP_NAME must be set"); + let email = env::var("SMTP_EMAIL").unwrap_or(username.clone()); + + ConfigEmail { smtp_server: server, smtp_port: port.parse::().unwrap(), + smtp_name: name, + smtp_email: email, smtp_username: username, smtp_password: password, } diff --git a/src/config/mod.rs b/src/config/mod.rs index 6b684ab..54585ba 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -1,3 +1,3 @@ pub mod config_auth; -pub mod config_server; pub mod config_email; +pub mod config_server; diff --git a/src/handler/message.rs b/src/handler/message.rs index 8fb4c42..3f51c15 100644 --- a/src/handler/message.rs +++ b/src/handler/message.rs @@ -1,13 +1,35 @@ +use crate::model::generic_response::GenericResponse; use crate::model::send_message::{MessageAuthor, SendMessage}; -use axum::extract::State; +use crate::service::email_service::EmailService; use axum::{http::StatusCode, response::IntoResponse, Extension, Json}; + pub async fn send_message( - Extension(auther): Extension, + Extension(email_service): Extension, + Extension(author): Extension, Json(payload): Json, ) -> impl IntoResponse { - let mut response = payload.clone(); - response.author = Some(auther).clone(); + let mut package = payload.clone(); + package.author = Some(author).clone(); - (StatusCode::OK, Json(response)) -} + match email_service.send_email_smtp(package).await { + Ok(_) => {}, + Err(e) => { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(GenericResponse { + status: StatusCode::INTERNAL_SERVER_ERROR.to_string(), + message: e.to_string(), + }), + ) + }, + }; + + return ( + StatusCode::OK, + Json(GenericResponse { + status: StatusCode::OK.to_string(), + message: "Message sent".to_string(), + }), + ); +} \ No newline at end of file diff --git a/src/route.rs b/src/route.rs index 0ea3f19..1f87b41 100644 --- a/src/route.rs +++ b/src/route.rs @@ -16,7 +16,9 @@ fn configure_message_endpoint(router: Router) -> Router { .route("/message", post(send_message)) .layer(middleware::from_fn(auth_middleware)) .layer(Extension(AuthService::new(config_auth::get_config_auth()))) - .layer(Extension(EmailService::new(config_email::get_config_email()))) + .layer(Extension(EmailService::new( + config_email::get_config_email(), + ))) } fn configure_health_endpoint(router: Router) -> Router { diff --git a/src/service/email_service.rs b/src/service/email_service.rs index 9e8a939..f16e056 100644 --- a/src/service/email_service.rs +++ b/src/service/email_service.rs @@ -1,41 +1,65 @@ -use lettre::{ - transport::smtp::authentication::Credentials, AsyncSmtpTransport, AsyncTransport, Message, - Tokio1Executor, -}; use crate::config::config_email::ConfigEmail; - +use crate::model::send_message::{MessageAuthor, SendMessage}; +use lettre::{transport::smtp::authentication::Credentials, AsyncSmtpTransport, AsyncTransport, Message, Tokio1Executor, Address}; +use lettre::message::Mailbox; #[derive(Clone)] pub struct EmailService { - mailer: AsyncSmtpTransport + name: String, + email: String, + mailer: AsyncSmtpTransport, } impl EmailService { pub fn new(config_email: ConfigEmail) -> Self { EmailService { - mailer: AsyncSmtpTransport::::relay(&config_email.smtp_server) + name: config_email.smtp_name.clone(), + email: config_email.smtp_email.clone(), + mailer: AsyncSmtpTransport::::starttls_relay(&config_email.smtp_server) .unwrap() - .credentials(Credentials::new(config_email.smtp_username, config_email.smtp_password)) + .credentials(Credentials::new( + config_email.smtp_username, + config_email.smtp_password, + )) .port(config_email.smtp_port) - .build() + .build(), } } - async fn send_email_smtp( - &self, - from: &str, - to: &str, - subject: &str, - body: String, - ) -> Result<(), Box> { + pub async fn send_email_smtp(&self, m: SendMessage) -> Result<(), Box> { + let sender = m.author.clone().unwrap(); + let sender_mailbox = Mailbox::new( + Some(sender.name), sender.email.parse::
().unwrap() + ); + + let recipient_mailbox = Mailbox::new( + Some(self.name.clone()), self.email.parse::
().unwrap() + ); + + let body = self.create_email_body(&m); + let email = Message::builder() - .from(from.parse()?) - .to(to.parse()?) - .subject(subject) + .from(sender_mailbox.clone()) + .to(recipient_mailbox.clone()) + .subject(m.subject) .body(body.to_string())?; self.mailer.send(email).await?; Ok(()) } + + fn create_email_body(&self, m: &SendMessage) -> String { + let sender = m.author.clone().unwrap(); + + format!( + "From: {} <{}>\nTo: {} <{}>\nSubject: {}\n\n{}", + sender.name, + sender.email, + self.name, + self.email, + m.subject, + m.message + ) + } }