Convert IMAP functions into ImapReader
Signed-off-by: Jacob Kiers <jacob@jacobkiers.net>
This commit is contained in:
parent
8f29b35ae7
commit
52ec0925f2
|
@ -30,11 +30,6 @@ fn main() {
|
||||||
std::fs::create_dir(&dir).expect("Could not create directory");
|
std::fs::create_dir(&dir).expect("Could not create directory");
|
||||||
}
|
}
|
||||||
|
|
||||||
// let messsages = messages_from_tests(&Path::new("tests/data")) //connect("my.kiers.eu", 993, "newsletters@kie.rs", "Jjkcloudron1!")
|
|
||||||
// .expect("A list of messages");
|
|
||||||
|
|
||||||
// for (uid, message) in messages {
|
|
||||||
|
|
||||||
let mut reader = TestMessagesReader::new((&Path::new("tests/data")).to_path_buf());
|
let mut reader = TestMessagesReader::new((&Path::new("tests/data")).to_path_buf());
|
||||||
|
|
||||||
for (uid, message) in reader.read_rfc822_messages() {
|
for (uid, message) in reader.read_rfc822_messages() {
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
use std::{
|
use std::{
|
||||||
|
collections::HashMap,
|
||||||
error::Error,
|
error::Error,
|
||||||
fs::{read_dir, DirEntry},
|
fs::{read_dir, DirEntry},
|
||||||
net::TcpStream,
|
net::TcpStream,
|
||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
vec::IntoIter, collections::HashMap,
|
vec::IntoIter,
|
||||||
};
|
};
|
||||||
|
|
||||||
use imap::Session;
|
use imap::Session;
|
||||||
|
@ -54,13 +55,25 @@ impl EmailReader for TestMessagesReader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn connect(
|
pub struct ImapReader {
|
||||||
server: &str,
|
host: String,
|
||||||
port: u16,
|
port: u16,
|
||||||
username: &str,
|
username: String,
|
||||||
password: &str,
|
password: String,
|
||||||
) -> Result<HashMap<String, Vec<u8>>, Box<dyn Error>> {
|
}
|
||||||
let mut session = open_session(server, port, username, password)?;
|
|
||||||
|
impl ImapReader {
|
||||||
|
pub fn new(host: String, port: u16, username: String, password: String) -> Self {
|
||||||
|
ImapReader {
|
||||||
|
host,
|
||||||
|
port,
|
||||||
|
username,
|
||||||
|
password,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn connect(&self) -> Result<HashMap<String, Vec<u8>>, Box<dyn Error>> {
|
||||||
|
let mut session = self.open_session()?;
|
||||||
|
|
||||||
session.examine("INBOX")?;
|
session.examine("INBOX")?;
|
||||||
|
|
||||||
|
@ -93,10 +106,7 @@ fn connect(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn open_session(
|
fn open_session(
|
||||||
server: &str,
|
&self,
|
||||||
port: u16,
|
|
||||||
username: &str,
|
|
||||||
password: &str,
|
|
||||||
) -> Result<
|
) -> Result<
|
||||||
Session<
|
Session<
|
||||||
rustls_connector::rustls::StreamOwned<
|
rustls_connector::rustls::StreamOwned<
|
||||||
|
@ -106,11 +116,31 @@ fn open_session(
|
||||||
>,
|
>,
|
||||||
Box<dyn Error + 'static>,
|
Box<dyn Error + 'static>,
|
||||||
> {
|
> {
|
||||||
let stream = TcpStream::connect((server, port))?;
|
let stream = TcpStream::connect((self.host.as_ref(), self.port))?;
|
||||||
let tls = RustlsConnector::new_with_webpki_roots_certs();
|
let tls = RustlsConnector::new_with_webpki_roots_certs();
|
||||||
let tls_stream = tls.connect(server, stream)?;
|
let tls_stream = tls.connect(&self.host, stream)?;
|
||||||
|
|
||||||
let client = imap::Client::new(tls_stream);
|
let client = imap::Client::new(tls_stream);
|
||||||
|
|
||||||
Ok(client.login(username, password).map_err(|e| e.0)?)
|
Ok(client
|
||||||
|
.login(&self.username, &self.password)
|
||||||
|
.map_err(|e| e.0)?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl EmailReader for ImapReader {
|
||||||
|
fn read_rfc822_messages(&mut self) -> Box<IntoIter<(String, Vec<u8>)>> {
|
||||||
|
let msgs = match self.connect() {
|
||||||
|
Ok(m) => m,
|
||||||
|
Err(_) => return Box::new(Vec::new().into_iter()),
|
||||||
|
};
|
||||||
|
|
||||||
|
let items = msgs
|
||||||
|
.iter()
|
||||||
|
.map(|i| (i.0.to_owned(), i.1.to_owned()));
|
||||||
|
|
||||||
|
let iter = items.collect::<Vec<(String, Vec<u8>)>>().into_iter();
|
||||||
|
|
||||||
|
Box::new(iter)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue