diff --git a/src/config.rs b/src/config.rs index 1e0858a..0d1b786 100644 --- a/src/config.rs +++ b/src/config.rs @@ -74,6 +74,7 @@ type Result = result::Result; // Account #[derive(Debug, Deserialize)] +#[serde(rename_all = "kebab-case")] pub struct Account { // Override pub name: Option, @@ -85,16 +86,22 @@ pub struct Account { pub imap_host: String, pub imap_port: u16, + pub imap_starttls: Option, pub imap_login: String, pub imap_passwd_cmd: String, pub smtp_host: String, pub smtp_port: u16, + pub smtp_starttls: Option, pub smtp_login: String, pub smtp_passwd_cmd: String, } impl Account { + pub fn imap_addr(&self) -> (&str, u16) { + (&self.imap_host, self.imap_port) + } + pub fn imap_passwd(&self) -> Result { let passwd = run_cmd(&self.imap_passwd_cmd)?; let passwd = passwd.trim_end_matches("\n").to_owned(); @@ -108,15 +115,12 @@ impl Account { Ok(SmtpCredentials::new(self.smtp_login.to_owned(), passwd)) } - - pub fn imap_addr(&self) -> (&str, u16) { - (&self.imap_host, self.imap_port) - } } // Config #[derive(Debug, Deserialize)] +#[serde(rename_all = "kebab-case")] pub struct Config { pub name: String, pub downloads_dir: Option, diff --git a/src/imap.rs b/src/imap.rs index e311379..804dec0 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -80,7 +80,10 @@ pub struct ImapConnector<'a> { impl<'a> ImapConnector<'a> { pub fn new(account: &'a Account) -> Result { let tls = TlsConnector::new()?; - let client = imap::connect(account.imap_addr(), &account.imap_host, &tls)?; + let client = match account.imap_starttls { + Some(true) => imap::connect_starttls(account.imap_addr(), &account.imap_host, &tls), + _ => imap::connect(account.imap_addr(), &account.imap_host, &tls), + }?; let sess = client .login(&account.imap_login, &account.imap_passwd()?) .map_err(|res| res.0)?; @@ -107,8 +110,8 @@ impl<'a> ImapConnector<'a> { pub fn list_msgs(&mut self, mbox: &str, page_size: &u32, page: &u32) -> Result { let last_seq = self.sess.select(mbox)?.exists; - let begin = last_seq - (page * page_size); - let end = begin - (page_size - 1); + let begin = last_seq - page * page_size; + let end = begin - (begin - 1).min(page_size - 1); let range = format!("{}:{}", begin, end); let msgs = self