diff --git a/README.md b/README.md index 591054a..eaed242 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,21 @@ CLI to synchronize, backup and restore emails, based on [`email-lib`](https://cr ![screenshot](https://pimalaya.org/neverest/cli/latest/screenshot.jpeg) -*Disclaimer: the project is under active development, do not use in production before the final `v1.0.0`.* +*The project is under active development, do not use in production before the final `v1.0.0` (or at least do some backups).* ## Features -- [IMAP](https://pimalaya.org/neverest/cli/latest/configuration/imap.html) support -- [Maildir](https://pimalaya.org/neverest/cli/latest/configuration/maildir.html) and [Notmuch](https://pimalaya.org/neverest/cli/latest/configuration/notmuch.html) support -- Synchronization of two backends together (folders and emails) -- Partial sync based on filters (folders name and envelopes date) -- Restricted sync based on permissions (folder/flag/message create/update/delete) +- Backends configuration via interactive [wizard](https://pimalaya.org/neverest/cli/latest/configuration/index.html#automatically-using-the-wizard). +- Sync pairs of backend together ([IMAP](https://pimalaya.org/neverest/cli/latest/configuration/imap.html), [Maildir](https://pimalaya.org/neverest/cli/latest/configuration/maildir.html) and [Notmuch](https://pimalaya.org/neverest/cli/latest/configuration/notmuch.html) supported). +- Partial sync based on [filters](https://pimalaya.org/neverest/cli/latest/configuration/index.html#folderfilter) (folder name, envelope date). +- Restricted sync based on [permissions](https://pimalaya.org/neverest/cli/latest/configuration/index.html#leftrightfolderpermissions) (create/delete folder, update flag, create/update message). +- Backup and restore using the [Maildir](https://pimalaya.org/neverest/cli/latest/configuration/maildir.html) backend. + +*Coming soon:* + +- *POP, JMAP and mbox support.* +- *Editing configuration via wizard.* +- *Native backup and restore support.* ## Installation @@ -33,7 +39,7 @@ $ cargo install neverest $ nix-env -i neverest ``` -*See the [documentation](https://pimalaya.org/neverest/cli/latest/installation.html) for other installation methods.* +*Please read the [documentation](https://pimalaya.org/neverest/cli/latest/installation.html) for other installation methods.* @@ -41,7 +47,81 @@ $ nix-env -i neverest ## Configuration -*Please read the [documentation](https://pimalaya.org/neverest/cli/latest/configuration/).* +Just run `neverest`, the wizard will help you to configure your default account. You can also manually edit your configuration at `~/.config/neverest/config.toml`: + +
+ config.sample.toml + + ```toml + [accounts.example] + + # The current `example` account will be used by default. + default = true + + # Filter folders according to the given rules. + # + # folder.filter.include = ["INBOX", "Sent"] + # folder.filter.exclude = ["All Mails"] + folder.filter = "all" + + # Filter envelopes according to the given rules. + # + # envelope.filter.before = "1990-12-31T23:59:60Z" + # envelope.filter.after = "1990-12-31T23:59:60Z" + + # The left backend configuration. + # + # In this example, the left side acts as our local cache. + left.backend.type = "maildir" + left.backend.root-dir = "/tmp/example" + + # The left backend permissions. + # + # Example of a full permissive backend (default behaviour): + left.folder.permissions.create = true + left.folder.permissions.delete = true + left.flag.permissions.update = true + left.message.permissions.create = true + left.message.permissions.delete = true + + # The right backend configuration. + # + # In this example, the right side acts as our remote. + right.backend.type = "imap" + right.backend.host = "localhost" + right.backend.port = 3143 + right.backend.login = "alice@localhost" + + # The right backend password. + # + # right.backend.passwd.cmd = "echo password" + # right.backend.passwd.keyring = "password-keyring-entry" + right.backend.passwd.raw = "password" + + # The right backend encryption. + # + # right.backend.encryption = "tls" # or true + # right.backend.encryption = "start-tls" + right.backend.encryption = "none" # or false + + # The right backend permissions. + # + # In this example, we set up safe permissions by denying deletions + # remote side. + right.folder.permissions.delete = false + right.message.permissions.delete = false + + # The right folder aliases + # + # In this example, we define custom folder aliases for the right + # side. They are useful when you need to map left and right folders + # together. + right.folder.aliases.inbox = "Inbox" + right.folder.aliases.sent = "Sent Mails" + ``` +
+ +*Please read the [documentation](https://pimalaya.org/neverest/cli/latest/configuration/) for more detailed information.* ## Contributing @@ -51,6 +131,8 @@ If you want to **propose a feature** or **fix a bug**, please send a patch to th If you just want to **discuss** about the project, feel free to join the [Matrix](https://matrix.org/) workspace [#pimalaya.neverest](https://matrix.to/#/#pimalaya.neverest:matrix.org) or contact me directly [@soywod](https://matrix.to/#/@soywod:matrix.org). You can also [subscribe](mailto:~soywod/pimalaya+subscribe@lists.sr.ht) or [unsubscribe](mailto:~soywod/pimalaya+unsubscribe@lists.sr.ht) to the [mailing list](https://lists.sr.ht/~soywod/pimalaya). +*Please read the [contributing guide](https://pimalaya.org/neverest/cli/latest/contributing.html) for more detailed information.* + ## Sponsoring [![nlnet](https://nlnet.nl/logo/banner-160x60.png)](https://nlnet.nl/project/Neverest/index.html) diff --git a/config.sample.toml b/config.sample.toml index 6bc7bed..738995f 100644 --- a/config.sample.toml +++ b/config.sample.toml @@ -55,3 +55,11 @@ right.backend.encryption = "none" # or false # remote side. right.folder.permissions.delete = false right.message.permissions.delete = false + +# The right folder aliases +# +# In this example, we define custom folder aliases for the right +# side. They are useful when you need to map left and right folders +# together. +right.folder.aliases.inbox = "Inbox" +right.folder.aliases.sent = "Sent Mails" diff --git a/src/backend/config.rs b/src/backend/config.rs index d61e37b..84ad181 100644 --- a/src/backend/config.rs +++ b/src/backend/config.rs @@ -46,7 +46,7 @@ impl BackendGlobalConfig { Arc::new(email::account::config::AccountConfig { name, folder: Some(email::folder::config::FolderConfig { - aliases: self.folder.clone().map(|c| c.aliases), + aliases: self.folder.clone().and_then(|c| c.aliases), sync: Some(email::folder::sync::config::FolderSyncConfig { filter: folder_filter, permissions: self.folder.map(|c| c.permissions).unwrap_or_default(), @@ -102,8 +102,7 @@ pub enum BackendConfig { pub struct FolderBackendConfig { #[serde(default)] pub permissions: FolderSyncPermissions, - #[serde(default)] - pub aliases: HashMap, + pub aliases: Option>, } #[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] diff --git a/src/config/mod.rs b/src/config/mod.rs index f18322d..f528789 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -83,7 +83,7 @@ impl Config { use crate::{wizard_prompt, wizard_warn}; - wizard_warn!("Cannot find existing configuration at {path:?}."); + wizard_warn!("Cannot find configuration at {}", path.display()); let confirm = Confirm::new() .with_prompt(wizard_prompt!( diff --git a/src/config/wizard.rs b/src/config/wizard.rs index 0c6dede..c9ad6f5 100644 --- a/src/config/wizard.rs +++ b/src/config/wizard.rs @@ -136,6 +136,7 @@ mod test { ..Default::default() }), folder: Some(FolderBackendConfig { + aliases: Default::default(), permissions: FolderSyncPermissions { create: true, delete: false,