---
title: meli mail client - alpha release 0.4.1
ogTitle: meli mail client - alpha release 0.4.1
author: epilys
date: 2019-12-09 00:00:00
date_iso_8601: 2019-12-09T00:00:00+02:00
bees: What if bees could see the abyss of deep knees in a sea
left:
right:
updates:
---
>> **update**: _0.4.1 is supported for rust >= 1.39_ Checkout current master or latest release tag for bug fixes since 0.4.1.
## Summary
- New mail stores available: **IMAP**, **notmuch** join **Maildir** and **mbox**. _JMAP_ is partially supported but not shipped with the master branch release.
- **Tagging** (on IMAP & notmuch) with
- custom colours
- hiding unwanted tags
- use as search keyword
- **Embed your editor** in the composing tab without ever leaving meli. The editor runs in an embedded terminal emulator.
- **vCard support**, read-only from local storage.
- **Search**
- Full text search if _sqlite3_ cache selected
- _SEARCH_ in _IMAP_ without a cache
- _notmuch queries_ in _notmuch_ without a cache
- **GPG signatures**, signing and verifying
- **mailcap** support
- **format=flowed** support
and other smaller additions. Consult the [manpages](/documentation.html) for up-to-date information.
[Download](/download.html)
## stability
I use meli as my main client and though at times buggy, it is mostly stable enough to be usable. Data is treated immutably everywhere _except_ for when you explicitly ask for mutation, meaning I don't think data corruption is generally possible. I'd appreciate bug reports at this stage in order to start polishing it for a proper release.
## IMAP, notmuch and... JMAP?
>> _See example configuration files in [meli.conf.5](/documentation.html#meli.conf.5)_
_IMAP_ accounts are retrieved on startup without any local caching. It is easy to implement though and I expect to do it soonish.
_notmuch_ accounts don't support new mail notifications yet. I have to check if I should use _inotify_ just like in _Maildir_ or poll the database's _mtime_. notmuch search queries are passed to _libnotmuch_ unchanged, though the app's search syntax is quite similar.
_JMAP_ is at an early stage still and unless you are a dev in pertinent projects or just really want to try it you shouldn't care about it yet. I've written code using [jmap-proxy](https://github.com/jmapio/jmap-perl) for _IMAP_ written in _Perl_. Authentication is still an unclear subject in _JMAP_ and I haven't a way to implement how fastmail, the company behind _JMAP_, does it without an account.
_JMAP_ translates really well to Rust thanks to _serde\_json_. By modeling _JMAP Objects_ and methods as traits we can have some type safety in our queries:
```rust
trait Object {
const NAME: &'static str;
}
trait Response {
const NAME: &'static str;
}
trait Method: Serialize {
const NAME: &'static str;
}
struct Request {
using: &'static [&'static str],
/* Why is this Value instead of Box>? The Method trait cannot
be made into a Trait object because its serialize() will be generic.
Bummer! */
method_calls: Vec,
#[serde(skip)]
request_no: Arc>,
}
#[serde(rename_all = "camelCase")]
struct Get
where
OBJ: std::fmt::Debug + Serialize,
{
account_id: String,
#[serde(flatten)]
ids: Option>>,
properties: Option>,
#[serde(skip)]
_ph: PhantomData<*const OBJ>,
}
#[serde(rename_all = "camelCase")]
struct EmailGet {
#[serde(flatten)]
get_call: Get,
body_properties: Vec,
fetch_text_body_values: bool,
fetch_html_body_values: bool,
fetch_all_body_values: bool,
max_body_value_bytes: u64,
}
impl Method for EmailGet {
const NAME: &'static str = "Email/get";
}
```
One of _JMAP_'s features is the ability to reference the results of previous calls in the same request, thus preventing the need for round-trips:
```rust
#[serde(rename_all = "camelCase")]
enum JmapArgument {
Value(T),
ResultReference {
result_of: String,
name: String,
path: String,
},
}
```
## vCard
vCard is [haphazardly](https://git.meli.delivery/meli/meli/src/branch/master/melib/src/addressbook/vcard.rs#L75) parsed and available along with meli contacts. They are read-only for now, until a more standard-compliant parser and serializer is written.
## sqlite3
sqlite3 searching uses a simple query language based on the Gmail webclient one:
> ((from:unrealistic and (to:complex or not "query")) or flags:seen,draft)
You can also explore your data with SQL by loading the database (_$XDG_DATA\_HOME/meli/_) with the sqlite3 cli tool.
_IMAP_ searches are converted from this language to _SEARCH_ queries. _notmuch_ queries are not tampered with at all.
## quick unsubscribe
If a newsletter has a _List-Unsubscribe_ header, meli can send an unsubscribe request with the command _list-unsubscribe_. Other _List-*_ headers are also usable.
## mailcap
You can now open attachments using mailcap files. You can still open them with _xdg-open_ as well.
## account info
View supported mailstore features in the _status_ tab:
## vim-like motions
Prepend any move motion with a number _n_ to repeat it _n_ times.