Add import mail action

jmap-eventsource
Manos Pitsidianakis 2020-10-09 11:56:50 +03:00
parent afe7eed9ef
commit 3ec1ecb349
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
5 changed files with 45 additions and 0 deletions

View File

@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Added
- Add import command to import email from files into accounts
## [alpha-0.6.2] - 2020-09-24 ## [alpha-0.6.2] - 2020-09-24
### Added ### Added

View File

@ -408,6 +408,8 @@ select threads matching
query. query.
.It Cm set seen, set unseen .It Cm set seen, set unseen
Set seen status of message. Set seen status of message.
.It Cm import Ar FILEPATH Ar MAILBOX_PATH
Import mail from file into given mailbox.
.It Cm copyto, moveto Ar MAILBOX_PATH .It Cm copyto, moveto Ar MAILBOX_PATH
Copy or move to other mailbox. Copy or move to other mailbox.
.It Cm copyto, moveto Ar ACCOUNT Ar MAILBOX_PATH .It Cm copyto, moveto Ar ACCOUNT Ar MAILBOX_PATH

View File

@ -303,6 +303,21 @@ define_commands!([
} }
) )
}, },
{ tags: ["import "],
desc: "import FILESYSTEM_PATH MAILBOX_PATH",
tokens: &[One(Literal("import")), One(Filepath), One(MailboxPath)],
parser:(
fn import(input: &[u8]) -> IResult<&[u8], Action> {
let (input, _) = tag("import")(input.trim())?;
let (input, _) = is_a(" ")(input)?;
let (input, file) = quoted_argument(input)?;
let (input, _) = is_a(" ")(input)?;
let (input, mailbox_path) = quoted_argument(input)?;
let (input, _) = eof(input)?;
Ok((input, Listing(Import(file.to_string().into(), mailbox_path.to_string()))))
}
)
},
{ tags: ["close"], { tags: ["close"],
desc: "close non-sticky tabs", desc: "close non-sticky tabs",
tokens: &[One(Literal("close"))], tokens: &[One(Literal("close"))],
@ -769,6 +784,7 @@ fn listing_action(input: &[u8]) -> IResult<&[u8], Action> {
seen_flag, seen_flag,
delete_message, delete_message,
copymove, copymove,
import,
search, search,
select, select,
toggle_thread_snooze, toggle_thread_snooze,

View File

@ -25,6 +25,7 @@
use crate::components::Component; use crate::components::Component;
pub use melib::thread::{SortField, SortOrder}; pub use melib::thread::{SortField, SortOrder};
use std::path::PathBuf;
extern crate uuid; extern crate uuid;
use uuid::Uuid; use uuid::Uuid;
@ -49,6 +50,7 @@ pub enum ListingAction {
CopyToOtherAccount(AccountName, MailboxPath), CopyToOtherAccount(AccountName, MailboxPath),
MoveTo(MailboxPath), MoveTo(MailboxPath),
MoveToOtherAccount(AccountName, MailboxPath), MoveToOtherAccount(AccountName, MailboxPath),
Import(PathBuf, MailboxPath),
Delete, Delete,
OpenInNewTab, OpenInNewTab,
Tag(TagAction), Tag(TagAction),

View File

@ -750,6 +750,28 @@ impl Component for Listing {
self.component.set_style(IndexStyle::Conversations); self.component.set_style(IndexStyle::Conversations);
return true; return true;
} }
Action::Listing(ListingAction::Import(file_path, mailbox_path)) => {
let account = &mut context.accounts[self.cursor_pos.0];
if let Err(err) = account
.mailbox_by_path(&mailbox_path)
.and_then(|mailbox_hash| {
Ok((
std::fs::read(&file_path).chain_err_summary(|| {
format!("Could not read {}", file_path.display())
})?,
mailbox_hash,
))
})
.and_then(|(bytes, mailbox_hash)| {
account.save(&bytes, mailbox_hash, None)
})
{
context.replies.push_back(UIEvent::StatusEvent(
StatusEvent::DisplayMessage(err.to_string()),
));
}
return true;
}
Action::Listing(a @ ListingAction::SetSeen) Action::Listing(a @ ListingAction::SetSeen)
| Action::Listing(a @ ListingAction::SetUnseen) | Action::Listing(a @ ListingAction::SetUnseen)
| Action::Listing(a @ ListingAction::Delete) | Action::Listing(a @ ListingAction::Delete)