use std::io::{Read, Write};
use std::net::TcpStream;
use json::{JsonValue, object};
use crate::cryptos;
use crate::tools::{string};
pub struct Pop3 {
pop3_host: String,
pop3_port: String,
send_email: String,
send_pass: String,
}
impl Pop3 {
pub fn connect(config: JsonValue) -> Self {
let pop3_host = config["pop3_host"].to_string();
let pop3_port = config["pop3_port"].to_string();
let send_email = config["send_email"].to_string();
let send_pass = config["send_pass"].to_string();
Self {
pop3_host,
pop3_port,
send_email,
send_pass,
}
}
pub fn client(&mut self) {
let mut stream = TcpStream::connect((self.pop3_host.as_str(), self.pop3_port.parse::<u16>().unwrap())).unwrap();
let mut buffer = [0; 1024];
stream.read(&mut buffer).unwrap();
let text = std::str::from_utf8(&buffer).unwrap().trim_matches('\u{0}');
println!("{}", text);
stream.write(format!("USER {}\r\n", self.send_email).as_bytes()).unwrap();
let mut buffer = [0; 1024 * 2];
stream.read(&mut buffer).unwrap();
let text = std::str::from_utf8(&buffer).unwrap().trim_matches('\u{0}');
println!("{}", text);
stream.write(format!("PASS {}\r\n", self.send_pass).as_bytes()).unwrap();
let mut buffer = [0; 1024];
stream.read(&mut buffer).unwrap();
let text = std::str::from_utf8(&buffer).unwrap().trim_matches('\u{0}');
println!("{}", text);
stream.write(format!("STAT \r\n").as_bytes()).unwrap();
let mut buffer = [0; 1024];
stream.read(&mut buffer).unwrap();
let text = std::str::from_utf8(&buffer).unwrap().trim_matches('\u{0}');
println!(">>>{}", text);
stream.write(format!("RETR {}\r\n", 10600).as_bytes()).unwrap();
let mut buffer = [0; 1024 * 1024];
stream.read(&mut buffer).unwrap();
let text = std::str::from_utf8(&buffer).unwrap().trim_matches('\u{0}');
let data = self._qq(text.to_string());
println!("{:#}", data);
}
fn _qq(&mut self, data: String) -> JsonValue {
let data = string::split(data.clone(), "\r\n\r\n");
let heads = data[0].clone();
let mut body = String::new();
for index in 1..data.len() {
body = format!("{}{}", body.clone(), data[index]);
}
let body = string::split(body.clone(), "\r\n");
let body = body[0].to_string();
let mut list = string::split(heads.to_string().clone(), "\r\n");
let size = list[0].to_string()[4..list[0].to_string().len()].to_string();
let mut subject = String::new();
let mut from_name = String::new();
let mut from_mail = String::new();
let mut sender = String::new();
let mut encoding = String::new();
let mut to_name = String::new();
let mut to_mail = String::new();
let mut reply_to_name = String::new();
let mut reply_to_mail = String::new();
let mut date = String::new();
let mut content_type = String::new();
for item in list.members_mut() {
let text = item.to_string();
let ttt = string::search(text.as_str(), "Content-Type:");
if ttt {
let ttt = string::split(text.clone(), ": ");
let content_types = ttt[1].to_string();
let ttt = string::search(content_types.as_str(), "multipart/alternative");
if ttt {
content_type = "multipart/alternative".to_string();
} else {
content_type = "base64".to_string();
}
}
let ttt = string::search(text.as_str(), "Subject: ");
if ttt {
let ttt = string::split(text.clone(), ": ");
subject = ttt[1].to_string();
let ttt = string::search(text.as_str(), "b?");
if ttt {
let ttt = string::split(subject.clone(), "?");
subject = ttt[3].to_string();
subject = cryptos::base64::decode(subject.to_string()).clone();
}
}
if string::search(text.as_str().to_lowercase().as_str(), "sender: ") {
let ttt = string::split(text.clone(), ": ");
sender = ttt[1].to_string();
}
if string::search(text.as_str().to_lowercase().as_str(), "from: ") {
let (name, mail) = self._from(text.clone());
from_name = name.clone();
from_mail = mail.clone();
}
if string::search(text.as_str().to_lowercase().as_str(), "to: ") {
let (name, mail) = self._to(text.clone());
to_name = name.clone();
to_mail = mail.clone();
}
if string::search(text.as_str().to_lowercase().as_str(), "reply-to: ") {
let (name, mail) = self._to(text.clone());
reply_to_name = name.clone();
reply_to_mail = mail.clone();
}
if string::search(text.as_str().to_lowercase().as_str(), "date: ") {
let ttt = string::split(text.clone(), ": ");
date = ttt[1].to_string();
}
if string::search(text.as_str().to_lowercase().as_str(), "Content-Transfer-Encoding: ") {
let ttt = string::split(text.clone(), ": ");
encoding = ttt[1].to_string();
}
}
let info = object! {
size:size.parse::<u32>().unwrap().clone(),
subject:subject,
from_name:from_name.clone(),
from_mail:from_mail.clone(),
to_name:to_name.clone(),
to_mail:to_mail.clone(),
reply_to_name:reply_to_name.clone(),
reply_to_mail:reply_to_mail.clone(),
date:date.clone(),
body:cryptos::base64::decode(body.to_string()).clone().clone(),
content_type:content_type.clone(),
sender:sender.clone(),
encoding:encoding.clone()
};
println!("{:#}", list);
return info;
}
fn _from(&mut self, data: String) -> (String, String) {
let list = string::split(data.clone(), ": ");
let mail = list[1].to_string();
if string::search(mail.as_str(), "<") {
let list = string::split(mail.clone(), "<");
let from_name = list[0].to_string().trim().to_string();
let from_email = string::trim_end(list[1].as_str().unwrap(), ">");
(from_name, from_email)
} else {
("".to_string(), mail.to_string())
}
}
fn _to(&mut self, data: String) -> (String, String) {
let list = string::split(data.clone(), ": ");
let mail = list[1].to_string();
if string::search(mail.as_str(), "<") {
let list = string::split(mail.clone(), "<");
let mut name = list[0].to_string().trim().to_string();
let email = string::trim_end(list[1].as_str().unwrap(), ">");
if string::search(name.as_str(), "=?") && string::search(name.as_str(), "?=") {
let ttt = string::split(name.clone(), "?");
name = ttt[3].to_string();
name = cryptos::base64::decode(name).clone();
}
(name, email)
} else {
("".to_string(), mail.to_string())
}
}
}