rs_mail/mods/
mail.rs

1//qq:smtp.qq.com 不是企业邮
2//ali:smtp.aliyun.com
3//google:smtp.gmail.com
4//126:smtp.126.com
5use 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}