common_uu/
mail.rs

1use crate::arg::get_arg;
2use crate::time::get_time;
3use crate::IResult;
4use once_cell::sync::Lazy;
5use std::sync::{Arc, Mutex};
6use std::thread::sleep;
7use std::time::Duration;
8
9/// 定时发邮件: 达到5封邮件, 或者时间达到1分钟
10static MSG_LIST: Lazy<Arc<Mutex<(Vec<String>, u128)>>> = Lazy::new(|| {
11    let v = Arc::new(Mutex::new((vec![], 0)));
12    let v2 = v.clone();
13    std::thread::spawn(move || loop {
14        sleep(Duration::from_millis(10 * 1000));
15        let (cur, _) = get_time();
16        let count = get_arg("mail.limit.count").as_u64().unwrap_or_else(|| 5) as usize;
17        if let Ok(mut lock) = v2.lock() {
18            if lock.0.len() >= count || (lock.1 != 0 && lock.1 <= cur) {
19                let mut content = String::default();
20                for x in lock.0.iter() {
21                    content.push_str(&format!("<br/><br/> {}", x));
22                }
23                lock.0.clear();
24                lock.1 = 0;
25                drop(lock);
26
27                let content = content.trim_start_matches("<br/><br/>");
28                if let Err(e) = send::send(content) {
29                    error!("发送邮件失败:{:?}", e);
30                };
31            }
32        }
33    });
34    v
35});
36
37pub mod send {
38    use crate::string::StringExentd;
39    use crate::{get_arg, IResult, JsonVExentd};
40    use lettre::{transport::smtp::authentication::Credentials, Message, Transport};
41
42    /// 发送邮件
43    pub fn send(content: impl Into<String>) -> IResult<()> {
44        let content = content.into();
45        let from_name = get_arg("mail.from_name").as_string2().ok_or("mail.from_name 配置为空")?;
46        let user_name = get_arg("mail.user_name").as_string2().ok_or("mail.user_name 配置为空")?;
47        let passpord = get_arg("mail.passpord").as_string2().ok_or("mail.passpord 配置为空")?;
48        let subject = get_arg("mail.subject").as_string2().unwrap_or_else(|| "未配置主题".into());
49        let to = get_arg("mail.to").as_string2().unwrap_or_default();
50
51        let to = to.split_char(",");
52        for x in to {
53            if x.trim() == "" {
54                continue;
55            }
56            send2(user_name.clone(), passpord.clone(), content.clone(), from_name.clone(), subject.clone(), x.to_string())?;
57        }
58        Ok(())
59    }
60
61    fn send2(user_name: String, passpord: String, content: String, from_name: String, subject: String, to: String) -> IResult<()> {
62        let email = Message::builder().from(from_name.parse()?).to(to.parse()?).subject(subject).body(content)?;
63
64        let creds = Credentials::new(user_name, passpord);
65        let mailer = lettre::SmtpTransport::relay("smtp.126.com")?.credentials(creds).build();
66        _ = mailer.send(&email).map_err(|e| format!("mailer.send {:?}", e))?;
67        Ok(())
68    }
69
70    #[test]
71    fn test_send() -> IResult {
72        send("下单成功")
73    }
74}
75
76pub fn send(content: impl Into<String>) -> IResult<()> {
77    let content = content.into();
78    let enable = get_arg("mail.enable").as_bool().unwrap_or_else(|| false);
79    if !enable {
80        return Ok(());
81    }
82    match MSG_LIST.lock() {
83        Ok(mut lock) => {
84            let wait = get_arg("mail.limit.wait").as_u64().unwrap_or_else(|| 60) as u128;
85            lock.0.push(content.to_string());
86            let (cur, _) = get_time();
87            if lock.1 == 0 {
88                lock.1 = cur + 1000 * wait;
89            }
90            drop(lock);
91        }
92        Err(e) => Err(e.to_string())?,
93    }
94    Ok(())
95}
96
97/**
98/// 发送邮件
99fn send0(content: &str) -> IResult<()> {
100    // let enable = get_arg("mail.enable").map(|v| v == "true").unwrap_or(false);
101    // if !enable {
102    //     return;
103    // }
104
105    let from_name = get_arg("mail.from_name").as_string2().ok_or("mail.from_name 配置为空")?;
106    let user_name = get_arg("mail.user_name").as_string2().ok_or("mail.user_name 配置为空")?;
107    let passpord = get_arg("mail.passpord").as_string2().ok_or("mail.passpord 配置为空")?;
108    let subject = get_arg("mail.subject").as_string2().ok_or("mail.subject 配置为空")?;
109
110    let to = get_arg("mail.to").as_string2().unwrap_or_default();
111    let to = to.split_arr(",");
112    for x in to.iter() {
113        if x.trim() == "" {
114            continue;
115        }
116        send2(content, from_name.clone(), user_name.clone(), passpord.clone(), subject.clone(), x.to_string())?;
117    }
118    Ok(())
119}
120fn send2(content: &str, from_name: String, user_name: String, passpord: String, subject: String, to: String) -> IResult<()> {
121    let email = EmailBuilder::new()
122        .from(Mailbox::new_with_name(from_name, user_name.clone()))
123        .to(Mailbox::new(to.clone()))
124        .subject(subject)
125        .html(content) //邮件标题 //邮件内容
126        .build()?;
127
128    //for example: xiaoming@163.com, password: 123456
129    //let creds = Credentials::new("xiaoming".to_string(), "123456".to_string());
130    let creds = Credentials::new(user_name, passpord);
131
132    //如163的邮箱就是smtp.163.com, 126的邮箱就是smtp.126.com
133    let mut mailer = SmtpClient::new_simple("smtp.126.com")?.credentials(creds).transport();
134
135    let result = mailer.send(email.into());
136
137    if result.is_ok() {
138        debug!("Email sent is ok: {}", to);
139        Ok(())
140    } else {
141        Err(format!("Could not send email({}): {:?}", to, result).into())
142    }
143}
144*/
145
146
147// #[test]
148// fn test_send() {
149//     let _ = crate::toml_read::run_watch("D:\\code_dsp\\etax\\config_rpa.toml");
150//     // crate::mylog::init_log("mailtest");
151//     error!("1111111");
152//     error!("222222");
153//     error!("33333333");
154//     error!("444444");
155//     error!("55555");
156//     error!("99999");
157
158//     // send("1111111");
159//     // send("222222");
160//     // send("33333333");
161//     // send("444444");
162//     // send("55555");
163
164//     sleep(Duration::from_millis(120 * 1000));
165// }
166fn _f(){}