From dfe4290713ba80ee1e5bdbb6bf3c71ae86878b2b Mon Sep 17 00:00:00 2001 From: Mo8it Date: Sat, 29 Oct 2022 00:41:18 +0200 Subject: [PATCH] Add mailer --- src/mailer.rs | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/mailer.rs diff --git a/src/mailer.rs b/src/mailer.rs new file mode 100644 index 0000000..b531c86 --- /dev/null +++ b/src/mailer.rs @@ -0,0 +1,75 @@ +use anyhow::{Context, Result}; +use lettre::address::Address; +use lettre::message::{Mailbox, MessageBuilder}; +use lettre::transport::smtp::authentication::Credentials; +use lettre::Transport; +use lettre::{Message, SmtpTransport}; + +use crate::config; + +pub struct Mailer { + mailer: SmtpTransport, + message_builder: MessageBuilder, +} + +impl Mailer { + pub fn new(config: &config::Config) -> Result { + let creds = Credentials::new( + config.email_server.email.clone(), + config.email_server.password.clone(), + ); + + let mailer = SmtpTransport::relay(&config.email_server.server_name) + .context("Failed to connect to the email server!")? + .credentials(creds) + .build(); + + let message_builder = Message::builder() + .from(Mailbox::new( + Some(config.email_from.name.clone()), + Address::new(&config.email_from.user, &config.email_from.domain) + .context("Failed to create the From email address!")?, + )) + .to(Mailbox::new( + Some(config.email_to.name.clone()), + Address::new(&config.email_to.user, &config.email_to.domain) + .context("Failed to create the To email address!")?, + )); + + Ok(Self { + mailer, + message_builder, + }) + } + + pub fn send(&self, name: &str, email: &str, telefon: &str, message: &str) -> Result<()> { + let name = name.trim().to_string(); + let telefon = telefon.trim(); + let message = message.trim().to_string(); + + let subject = "Message from ".to_string() + &name; + + let body = if telefon.len() > 0 { + message + "\n\nTelefon: " + &telefon + } else { + message + }; + + let email = self + .message_builder + .clone() + .reply_to(Mailbox::new( + Some(name), + email + .parse() + .context("Failed to parse the email from the form to an address!")?, + )) + .subject(subject) + .body(body) + .context("Failed to build email!")?; + + self.mailer.send(&email).context("Failed to send email!")?; + + Ok(()) + } +}