Add asynchronous call to database.
[recipes.git] / backend / src / email.rs
index 9b095d5..b571a29 100644 (file)
@@ -1,7 +1,35 @@
+use std::time::Duration;
+use derive_more::Display;
 use lettre::{transport::smtp::authentication::Credentials, Message, SmtpTransport, Transport};
 
-///
-pub fn send_validation(site_url: &str, email: &str, token: &str, smtp_login: &str, smtp_password: &str) -> Result<(), Box<dyn std::error::Error>> {
+use crate::consts;
+
+#[derive(Debug, Display)]
+pub enum Error {
+    ParseError(lettre::address::AddressError),
+    SmtpError(lettre::transport::smtp::Error),
+    Email(lettre::error::Error),
+}
+
+impl From<lettre::address::AddressError> for Error {
+    fn from(error: lettre::address::AddressError) -> Self {
+        Error::ParseError(error)
+    }
+}
+
+impl From<lettre::transport::smtp::Error> for Error {
+    fn from(error: lettre::transport::smtp::Error) -> Self {
+        Error::SmtpError(error)
+    }
+}
+
+impl From<lettre::error::Error> for Error {
+    fn from(error: lettre::error::Error) -> Self {
+        Error::Email(error)
+    }
+}
+
+pub fn send_validation(site_url: &str, email: &str, token: &str, smtp_login: &str, smtp_password: &str) -> Result<(), Error> {
     let email = Message::builder()
         .message_id(None)
         .from("recipes@gburri.org".parse()?)
@@ -11,7 +39,7 @@ pub fn send_validation(site_url: &str, email: &str, token: &str, smtp_login: &st
 
     let credentials = Credentials::new(smtp_login.to_string(), smtp_password.to_string());
 
-    let mailer = SmtpTransport::relay("mail.gandi.net")?.credentials(credentials).build();
+    let mailer = SmtpTransport::relay("mail.gandi.net")?.credentials(credentials).timeout(Some(consts::SEND_EMAIL_TIMEOUT)).build();
 
     if let Err(error) = mailer.send(&email) {
         eprintln!("Error when sending E-mail:\n{:?}", &error);