diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f2c162e..1cfa9526 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Blur in list msg screenshot [#181] +- Make inbox, sent and drafts folders customizable [#172] ## [0.5.1] - 2021-10-24 @@ -347,6 +348,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#160]: https://github.com/soywod/himalaya/issues/160 [#162]: https://github.com/soywod/himalaya/issues/162 [#176]: https://github.com/soywod/himalaya/issues/176 +[#172]: https://github.com/soywod/himalaya/issues/172 [#181]: https://github.com/soywod/himalaya/issues/181 [#185]: https://github.com/soywod/himalaya/issues/185 [#186]: https://github.com/soywod/himalaya/issues/186 diff --git a/src/config/account_entity.rs b/src/config/account_entity.rs index b3c2d661..fae37bb2 100644 --- a/src/config/account_entity.rs +++ b/src/config/account_entity.rs @@ -8,6 +8,10 @@ use crate::{ output::run_cmd, }; +pub const DEFAULT_INBOX_FOLDER: &str = "INBOX"; +pub const DEFAULT_SENT_FOLDER: &str = "Sent"; +pub const DEFAULT_DRAFT_FOLDER: &str = "Drafts"; + /// Represent a user account. #[derive(Debug, Default)] pub struct Account { @@ -16,6 +20,12 @@ pub struct Account { pub downloads_dir: PathBuf, pub sig: Option, pub default_page_size: usize, + /// Defines the inbox folder name for this account + pub inbox_folder: String, + /// Defines the sent folder name for this account + pub sent_folder: String, + /// Defines the draft folder name for this account + pub draft_folder: String, pub watch_cmds: Vec, pub default: bool, pub email: String, @@ -134,6 +144,27 @@ impl<'a> TryFrom<(&'a Config, Option<&str>)> for Account { downloads_dir, sig, default_page_size, + inbox_folder: account + .inbox_folder + .as_ref() + .map(|s| s.as_str()) + .or(config.inbox_folder.as_ref().map(|s| s.as_str())) + .unwrap_or(&DEFAULT_INBOX_FOLDER) + .to_string(), + sent_folder: account + .sent_folder + .as_ref() + .map(|s| s.as_str()) + .or(config.sent_folder.as_ref().map(|s| s.as_str())) + .unwrap_or(&DEFAULT_SENT_FOLDER) + .to_string(), + draft_folder: account + .draft_folder + .as_ref() + .map(|s| s.as_str()) + .or(config.draft_folder.as_ref().map(|s| s.as_str())) + .unwrap_or(&DEFAULT_DRAFT_FOLDER) + .to_string(), watch_cmds: account .watch_cmds .as_ref() @@ -142,12 +173,14 @@ impl<'a> TryFrom<(&'a Config, Option<&str>)> for Account { .to_owned(), default: account.default.unwrap_or(false), email: account.email.to_owned(), + imap_host: account.imap_host.to_owned(), imap_port: account.imap_port, imap_starttls: account.imap_starttls.unwrap_or_default(), imap_insecure: account.imap_insecure.unwrap_or_default(), imap_login: account.imap_login.to_owned(), imap_passwd_cmd: account.imap_passwd_cmd.to_owned(), + smtp_host: account.smtp_host.to_owned(), smtp_port: account.smtp_port, smtp_starttls: account.smtp_starttls.unwrap_or_default(), diff --git a/src/config/config_entity.rs b/src/config/config_entity.rs index 68016e03..44ffb34b 100644 --- a/src/config/config_entity.rs +++ b/src/config/config_entity.rs @@ -13,18 +13,27 @@ pub const DEFAULT_SIG_DELIM: &str = "-- \n"; #[derive(Debug, Default, Clone, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Config { - /// Define the full display name of the user. + /// Defines the full display name of the user. pub name: String, - /// Define the downloads directory (eg. for attachments). + /// Defines the downloads directory (eg. for attachments). pub downloads_dir: Option, - /// Override the default signature delimiter "`--\n `". + /// Overrides the default signature delimiter "`--\n `". pub signature_delimiter: Option, - /// Define the signature. + /// Defines the signature. pub signature: Option, - /// Define the default page size for listings. + /// Defines the default page size for listings. pub default_page_size: Option, + /// Defines the inbox folder name. + pub inbox_folder: Option, + /// Defines the sent folder name. + pub sent_folder: Option, + /// Defines the draft folder name. + pub draft_folder: Option, + /// Defines the notify command. pub notify_cmd: Option, + /// Defines the watch commands. pub watch_cmds: Option>, + #[serde(flatten)] pub accounts: ConfigAccountsMap, } @@ -41,15 +50,23 @@ pub struct ConfigAccountEntry { pub signature_delimiter: Option, pub signature: Option, pub default_page_size: Option, + /// Defines a specific inbox folder name for this account. + pub inbox_folder: Option, + /// Defines a specific sent folder name for this account. + pub sent_folder: Option, + /// Defines a specific draft folder name for this account. + pub draft_folder: Option, pub watch_cmds: Option>, pub default: Option, pub email: String, + pub imap_host: String, pub imap_port: u16, pub imap_starttls: Option, pub imap_insecure: Option, pub imap_login: String, pub imap_passwd_cmd: String, + pub smtp_host: String, pub smtp_port: u16, pub smtp_starttls: Option, diff --git a/src/domain/mbox/mbox_arg.rs b/src/domain/mbox/mbox_arg.rs index 5b4235d3..382cd343 100644 --- a/src/domain/mbox/mbox_arg.rs +++ b/src/domain/mbox/mbox_arg.rs @@ -47,7 +47,6 @@ pub fn source_arg<'a>() -> clap::Arg<'a, 'a> { .long("mailbox") .help("Specifies the source mailbox") .value_name("SOURCE") - .default_value("INBOX") } /// Defines the target mailbox argument. @@ -104,7 +103,7 @@ mod tests { } let app = get_matches_from![]; - assert_eq!(Some("INBOX"), app.value_of("mbox-source")); + assert_eq!(None, app.value_of("mbox-source")); let app = get_matches_from!["-m", "SOURCE"]; assert_eq!(Some("SOURCE"), app.value_of("mbox-source")); diff --git a/src/domain/msg/msg_entity.rs b/src/domain/msg/msg_entity.rs index edc60729..d051daeb 100644 --- a/src/domain/msg/msg_entity.rs +++ b/src/domain/msg/msg_entity.rs @@ -337,7 +337,7 @@ impl Msg { loop { match choice::post_edit() { Ok(PostEditChoice::Send) => { - let mbox = Mbox::new("Sent"); + let mbox = Mbox::new(&account.sent_folder); let sent_msg = smtp.send_msg(&self)?; let flags = Flags::try_from(vec![Flag::Seen])?; imap.append_raw_msg_with_flags(&mbox, &sent_msg.formatted(), flags)?; @@ -354,12 +354,15 @@ impl Msg { break; } Ok(PostEditChoice::RemoteDraft) => { - let mbox = Mbox::new("Drafts"); + let mbox = Mbox::new(&account.draft_folder); let flags = Flags::try_from(vec![Flag::Seen, Flag::Draft])?; let tpl = self.to_tpl(TplOverride::default(), account); imap.append_raw_msg_with_flags(&mbox, tpl.as_bytes(), flags)?; msg_utils::remove_local_draft()?; - printer.print("Message successfully saved to Drafts")?; + printer.print(format!( + "Message successfully saved to {}", + account.draft_folder + ))?; break; } Ok(PostEditChoice::Discard) => { diff --git a/src/domain/msg/msg_handler.rs b/src/domain/msg/msg_handler.rs index 88b152c2..41c70ba9 100644 --- a/src/domain/msg/msg_handler.rs +++ b/src/domain/msg/msg_handler.rs @@ -290,6 +290,7 @@ pub fn send< SmtpService: SmtpServiceInterface, >( raw_msg: &str, + account: &Account, printer: &mut Printer, imap: &mut ImapService, smtp: &mut SmtpService, @@ -312,7 +313,7 @@ pub fn send< debug!("message sent!"); // Save message to sent folder - let mbox = Mbox::new("Sent"); + let mbox = Mbox::new(&account.sent_folder); let flags = Flags::try_from(vec![Flag::Seen])?; imap.append_raw_msg_with_flags(&mbox, raw_msg.as_bytes(), flags) } diff --git a/src/main.rs b/src/main.rs index 2217de13..142d2028 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,9 +45,9 @@ fn main() -> Result<()> { // Check mailto command BEFORE app initialization. let raw_args: Vec = env::args().collect(); if raw_args.len() > 1 && raw_args[1].starts_with("mailto:") { - let mbox = Mbox::new("INBOX"); let config = Config::try_from(None)?; let account = Account::try_from((&config, None))?; + let mbox = Mbox::new(&account.inbox_folder); let mut printer = StdoutPrinter::from(OutputFmt::Plain); let url = Url::parse(&raw_args[1])?; let mut imap = ImapService::from((&account, &mbox)); @@ -68,9 +68,9 @@ fn main() -> Result<()> { } // Init entities and services. - let mbox = Mbox::new(m.value_of("mbox-source").unwrap()); let config = Config::try_from(m.value_of("config"))?; let account = Account::try_from((&config, m.value_of("account")))?; + let mbox = Mbox::new(m.value_of("mbox-source").unwrap_or(&account.inbox_folder)); let mut printer = StdoutPrinter::try_from(m.value_of("output"))?; let mut imap = ImapService::from((&account, &mbox)); let mut smtp = SmtpService::from(&account); @@ -150,7 +150,7 @@ fn main() -> Result<()> { ); } Some(msg_arg::Command::Send(raw_msg)) => { - return msg_handler::send(raw_msg, &mut printer, &mut imap, &mut smtp); + return msg_handler::send(raw_msg, &account, &mut printer, &mut imap, &mut smtp); } Some(msg_arg::Command::Write(atts)) => { return msg_handler::write(atts, &account, &mut printer, &mut imap, &mut smtp); diff --git a/wiki b/wiki index ab8a6a1c..3c74b676 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit ab8a6a1c408a8fe123c2b0c18ad5f949d79f0bac +Subproject commit 3c74b676f07f72c58c4107edef720c02b54c680e