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(){}