1use lettre::smtp::authentication::Credentials;
6use lettre::smtp::error::Error;
7use lettre::{SmtpClient, Transport};
8use lettre_email::{EmailBuilder, Mailbox};
9use serde::{Deserialize, Serialize};
10use std::fmt::Debug;
11use std::rc::Rc;
12
13#[derive(Debug, Serialize, Deserialize)]
14pub struct LoadEmail {
15 pub send_email: String,
16 pub send_password: String,
17 pub receive_email: String,
18 pub send_title: String,
19 pub send_msg: String,
20 pub smtp_service: String,
21}
22
23pub struct RcEmail {
24 pub send_email: Rc<String>,
25 pub receive_email: Rc<String>,
26 pub send_password: Rc<String>,
27 pub send_title: Rc<String>,
28 pub send_msg: Rc<String>,
29 pub smtp_service: Rc<String>,
30}
31
32pub trait Trim {
33 fn trim(&mut self) -> &mut Self;
34
35 fn trim_to_str(
36 send_email: String,
37 send_password: String,
38 receive_email: String,
39 send_title: String,
40 send_msg: String,
41 smtp_service: String,
42 ) -> Self;
43}
44
45pub trait RcMail<T> {
46 fn to_rc_ptr(&mut self) -> T;
47}
48
49pub trait SendEmail {
50 fn send(&mut self) -> String;
51}
52
53impl Trim for LoadEmail {
54 fn trim(&mut self) -> &mut Self {
55 self.send_email = self.send_email.trim().to_string();
56 self.send_password = self.send_password.trim().to_string();
57 self.receive_email = self.receive_email.trim().to_string();
58 self.send_title = self.send_title.trim().to_string();
59 self.send_msg = self.send_msg.trim().to_string();
60 self.smtp_service = self.smtp_service.trim().to_string();
61 self
62 }
63
64 fn trim_to_str(
65 send_email: String,
66 send_password: String,
67 receive_email: String,
68 send_title: String,
69 send_msg: String,
70 smtpservice: String,
71 ) -> Self {
72 LoadEmail {
73 send_email: send_email.trim().to_string(),
74 send_password: send_password.trim().to_string(),
75 receive_email: receive_email.trim().to_string(),
76 send_title: send_title.trim().to_string(),
77 send_msg: send_msg.trim().to_string(),
78 smtp_service: smtpservice.trim().to_string(),
79 }
80 }
81}
82
83impl RcMail<RcEmail> for LoadEmail {
84 fn to_rc_ptr(&mut self) -> RcEmail {
85 RcEmail {
86 send_email: Rc::new(self.send_email.trim().to_string()),
87 receive_email: Rc::new(self.receive_email.trim().to_string()),
88 send_password: Rc::new(self.send_password.trim().to_string()),
89 send_title: Rc::new(self.send_title.trim().to_string()),
90 send_msg: Rc::new(self.send_msg.trim().to_string()),
91 smtp_service: Rc::new(self.smtp_service.trim().to_string()),
92 }
93 }
94}
95
96impl SendEmail for RcEmail {
97 fn send(&mut self) -> String {
98 let email = EmailBuilder::new()
99 .from(Mailbox::new(Rc::clone(&self.send_email).to_string()))
100 .to(Mailbox::new(Rc::clone(&self.receive_email).to_string()))
101 .subject(self.send_title.as_str())
102 .body(self.send_msg.as_str())
103 .build()
104 .unwrap();
105
106 let creds = Credentials::new(
107 Rc::clone(&self.send_email).to_string(),
108 Rc::clone(&self.send_password).to_string(),
109 );
110
111 let mut mailer = SmtpClient::new_simple(&self.smtp_service)
112 .unwrap()
113 .credentials(creds)
114 .transport();
115
116 let result = mailer.send(email.into());
117 mailer.close();
118 match result {
119 Ok(_) => "Email Send Success".to_string(),
120 Err(e) => match e {
121 Error::Transient(err)=>err.message[0].to_string(),
122 Error::Permanent(err) => err.message[0].to_string(),
123 Error::Tls(_)=>"Tls error".to_string(),
124 Error::ResponseParsing(_)=>"Error parsing a response".to_string(),
125 Error::ChallengeParsing(_)=>"Error parsing a base64 string in response".to_string(),
126 Error::Utf8Parsing(_)=>"Error parsing UTF8in response".to_string(),
127 Error::Client(_)=>"Internal client error".to_string(),
128 Error::Resolution=>"DNS resolution error".to_string(),
129 Error::Io(_)=>"Io Error".to_string(),
130 Error::Parsing(_)=>"Parsing error".to_string()
131 },
132 }
133 }
134}