Technical documentation: You can view the rustdoc generated documentation here

Quick start tutorial

Follow the installation instructions in the README.

Launch meli with no arguments, and you will be asked if you want to create a sample configuration.

The sample configuration (created by default in ~/.config/meli/config.toml) includes comments with the basic settings required for setting up accounts allowing you to copy and edit right away. See meli.conf(5) for the available configuration options.

The main screen when you launch meli is the INBOX of the first account you have configured.

At any time, you can press ? to show a list of all available actions and shortcuts, along with every possible setting and command that your version supports.

Press T to cycle between tabs or Alt + 19 to choose.

Press q to exit.


meli(1) [go back]

MELI(1) General Commands Manual MELI(1)

meliterminal e-mail client μέλι is the Greek word for honey

meli [--help | -h] [--version | -v] [--config path]
|
Show help message and exit.
|
Show version and exit.
path
Start meli with given configuration file.
[path]
Create configuration file in path if given, or at $XDG_CONFIG_HOME/meli/config.toml. If path is - the result is printed to the standard output stream.
[path]
Test a configuration for syntax issues or missing options. The configuration is read from path if given, or from $XDG_CONFIG_HOME/meli/config.toml. If path is - the configuration is read from the standard input stream.
[page]
Print documentation page and exit (Piping to a pager is recommended).
[path]
Install manual pages to the first location provided by MANPATH or manpath(1), unless you specify the directory as an argument.
Print compile time feature flags of this binary.
Edit configuration files with EDITOR or VISUAL.
Prints help information or the help of the given subcommand(s).
Print all directories that meli creates and uses.
Print location of configuration file that will be loaded on normal app startup.
Print default theme keys and values in TOML syntax, to be used as a blueprint.
Print all loaded themes in TOML syntax.
Print log file location.
View mail from input file.

TABLE OF CONTENTS

meli is a terminal mail client aiming for extensive and user-friendly configurability.

     ^^      .-=-=-=-.  ^^
 ^^        (`-=-=-=-=-`)         ^^
         (`-=-=-=-=-=-=-`)  ^^         ^^
   ^^   (`-=-=-=-=-=-=-=-`)   ^^
       ( `-=-=-=-(@)-=-=-` )      ^^
       (`-=-=-=-=-=-=-=-=-`)  ^^
       (`-=-=-=-=-=-=-=-=-`)          ^^
       (`-=-=-=-=-=-=-=-=-`)
^^     (`-=-=-=-=-=-=-=-=-`)  ^^
   ^^   (`-=-=-=-=-=-=-=-`)          ^^
         (`-=-=-=-=-=-=-`)  ^^
  ^^       (`-=-=-=-=-`)
            `-=-=-=-=-`          ^^

When launched for the first time, meli will search for its configuration directory, $XDG_CONFIG_HOME/meli/. If it doesn't exist, you will be asked if you want to create one and presented with a sample configuration file ($XDG_CONFIG_HOME/meli/config.toml) that includes the basic settings required for setting up accounts allowing you to copy and edit right away. See meli.conf(5) for the available configuration options.

At any time, you may press ? (shortcuts.general.) for a searchable list of all available actions and shortcuts, along with every possible setting and command that your version supports.

The main visual navigation tool, the left-side sidebar may be toggled with ` (shortcuts.listing.).

Each mailbox may be viewed in 4 modes:

  • views each mail individually,
  • shows their thread relationship visually,
  • collapses each thread of e-mails into a single entry,
  • shows one row per thread.

If you're using a light color palette in your terminal, you should set in the section of your configuration. See meli-themes(5) for complete documentation on user themes.

See meli(7) for a more detailed tutorial on using meli.

See meli.conf(5) SHORTCUTS for shortcuts and their default values.

Open attachments by typing their index in the attachments list and then a (shortcuts.envelope_view.). meli will attempt to open text inside its pager, and other content via xdg-open. Press m (shortcuts.envelope_view.) instead to use the mailcap entry for the MIME type of the attachment, if any. See FILES for the location of the mailcap files and mailcap(5) for their syntax. You can save individual attachments with the following command:

save-attachment INDEX path-to-file

INDEX is the attachment's index in the listing.

If the path provided is a directory, the attachment is saved with its filename set to the filename in the attachment, if any.
 
If the 0th index is provided, the entire message is saved.
 
If the path provided is a directory, the message is saved as an eml file with its filename set to the messages message-id.
 

You can pipe individual attachments to binaries with the following command:

pipe-attachment INDEX binary ARGS

Example usage with the less(1) pager:

pipe-attachment 0 less
If the binary does not wait for your input before exiting, you will probably not see its output since you will return back to the user interface immediately. You can write a wrapper script that pipes your binary's output to
less
or
less -r
if you want to preserve the ANSI escape codes in the pager's output.

Each e-mail storage backend has a default search method assigned. uses the SEARCH command, uses libnotmuch and Maildir/mbox performs a slow linear search. It is advised to use a search backend on Maildir/mbox accounts. meli, if built with sqlite3, includes the ability to perform full text search on the following fields: , , , , , , and . The message body (in plain text human readable form) and the flags can also be queried. To enable sqlite3 indexing for an account set search_backend to sqlite3 in the configuration file and to create the sqlite3 index issue command:

reindex ACCOUNT_NAME

To search in the message body type your keywords without any special formatting. To search in specific fields, prepend your search keyword with "field:" like so:

subject:helloooo or subject:"call for help" or "You remind me today of a small, Mexican chihuahua."

not ((from:unrealistic and (to:complex or not query )) or flags:seen,draft)

Boolean operators are , and not (alias: ) String keywords with spaces must be quoted. Quotes should always be escaped.

To prevent downloading all your messages from your IMAP/JMAP server, don't set search_backend to sqlite3. meli will relay your queries to the IMAP server. Expect a delay between query and response. Sqlite3 on the contrary at reasonable mailbox sizes should have a non noticeable delay.

meli supports the basic maildir flags: passed, replied, seen, trashed, draft and flagged. Flags can be searched with the ‘flags:’ prefix in a search query, and can be modified by

flag set FLAG

and

flag unset FLAG

meli supports tagging in notmuch and IMAP/JMAP backends. Tags can be searched with the ‘tags:’ or ‘flags:’ prefix in a search query, and can be modified by

tag add TAG

and

tag remove TAG

(see meli.conf(5) TAGS, settings colors and ignore_tags for how to set tag colors and tag visibility)

To create a new mail message, press m (shortcuts.listing.) while viewing a mailbox. To reply to a mail, press R (shortcuts.envelope_view.). Both these actions open the mail composer view in a new tab.

  • Edit the header fields by selecting with the arrow keys and pressing Enter (shortcuts.general.) to enter mode and Esc key to exit.
  • At any time you may press e (shortcuts.composing.) to launch your editor (see meli.conf(5) COMPOSING, setting editor_command for how to select which editor to launch).
  • Your editor can be used in meli's embed terminal emulator by setting embed to in your composing settings (You can return to meli at any time by pressing Ctrl-Z)
  • When launched, your editor captures all input until it exits or stops.
  • To stop your editor and return to meli press Ctrl-z and to resume editing press the edit command again.

Attachments may be handled with the add-attachment, remove-attachment commands (see below).

Finally, pressing s (shortcuts.composing.) will send your message according to your settings (see meli.conf(5) ACCOUNTS, setting name send_mail). With no Draft or Sent mailbox, meli tries first saving mail in your INBOX and then at any other mailbox. On complete failure to save your draft or sent message it will be saved in your directory instead and you will be notified of its location.

To save your draft without sending it, issue COMMAND close and select 'save as draft'.

To open a draft for further editing, select your draft in the mail listing and press edit.

meli supports three kinds of contact backends:

  1. an internal format that gets saved under $XDG_DATA_HOME/meli/account_name/contacts.
  2. vCard files (v3, v4) through the vcard_folder option in the account section. The path defined as vcard_folder can hold multiple vCards per file. They are loaded read only.
  3. a mutt(1) compatible alias file in the option mutt_alias_file

See meli.conf(5) ACCOUNTS for the complete account contact configuration values.

NORMAL
is the default mode
COMMAND
commands are issued in COMMAND mode, by default started with : (shortcuts.general.) and exited with Esc key.
EMBED
is the mode of the embed terminal emulator
INSERT
captures all input as text input, and is exited with Esc key.

plain | threaded | compact | conversations
set the way mailboxes are displayed
conversations shows one entry per thread
compact shows one row per thread
threaded shows threads as a tree structure
plain shows one row per mail, regardless of threading
[subject | date] asc | desc
sort mail listing
[subject | date] asc | desc
sorts only the first level of replies.
n
where n is a mailbox prefixed with the n number in the side menu for the current account
don't issue notifications for thread under cursor in thread listing
search mailbox with STRING query. Escape exits search results.
STRING
select threads matching STRING query.
Clear current selection.
seen | unseen
Set seen status of message.
FILEPATH MAILBOX_PATH
Import mail from file into given mailbox.
MAILBOX_PATH
Copy or move to other mailbox.
ACCOUNT MAILBOX_PATH
Copy or move to another account's mailbox.
Delete selected entries.
FILEPATH
Export selected threads to mboxcl2 file.
ACCOUNT MAILBOX_PATH
create mailbox with given path. Be careful with backends and separator sensitivity (eg IMAP)
ACCOUNT MAILBOX_PATH
subscribe to mailbox with given path
ACCOUNT MAILBOX_PATH
unsubscribe to mailbox with given path
ACCOUNT MAILBOX_PATH_SRC MAILBOX_PATH_DEST
rename mailbox
delete-mailbox ACCOUNT MAILBOX_PATH
deletes mailbox in the mail backend. This action is irreversible.

EXECUTABLE [ARGS]
pipe pager contents to binary
EXECUTABLE [ARGS]
filter and display pager contents through command
select a filter from pager.named_filters configuration value (See meli.conf(5) PAGER for its syntax)
post in list of viewed envelope
unsubscribe automatically from list of viewed envelope
open list archive with xdg-open

MAILTO_ADDRESS
Opens a composer tab with initial values parsed from the mailto: address.
PATH
in composer, add PATH as an attachment
CMD ARGS
in composer, pipe CMD ARGS output into an attachment
Launch command defined in the configuration value file_picker_command in meli.conf(5) TERMINAL
CMD ARGS
Launch command CMD ARGS. The command should print file paths in stdout, separated by NUL bytes. Example usage with fzf(1):
add-attachment-file-picker < fzf --print0
INDEX
remove attachment with given index
toggle between signing and not signing this message. If the gpg invocation fails then the mail won't be sent. See meli.conf(5) PGP for PGP configuration.
saves a copy of the draft in the Draft folder

opens envelope view in new tab
closes closeable tabs
KEY=VALUE
set environment variable KEY to VALUE
KEY
print environment variable KEY
Quits meli.
Reloads configuration but only if account configuration is unchanged. Useful if you want to reload some settings without restarting meli.
Inspect background jobs.
Inspect all mailboxes of an account, subscribed or not. Pressing the Enter (shortcuts.general.) shortcut allows you to rename, move, toggle subscription and delete the mailbox under the cursor.

meli exits with 0 on a successful run. Other exit statuses are:

1
catchall for general errors
101
process panic

Specifies the editor to use
Override the configuration file
When defined (regardless of its value), prevents the addition of color. The configuration value use_color overrides this.

meli uses the following parts of the XDG standard:

defaults to ~/.config/
defaults to ~/.cache/

and appropriates the following locations:

$XDG_CONFIG_HOME/meli/
User configuration directory
$XDG_CONFIG_HOME/meli/config.toml
User configuration file, see meli.conf(5) for its syntax and values.
$XDG_CACHE_HOME/meli/*
Internal cached data used by meli.
$XDG_DATA_HOME/meli/*
Internal data used by meli.
$XDG_DATA_HOME/meli/meli.log
Operation log.
/tmp/meli/*
Temporary files generated by meli.

Mailcap entries are searched for in the following files, in this order:

  1. $XDG_CONFIG_HOME/meli/mailcap
  2. $XDG_CONFIG_HOME/.mailcap
  3. $HOME/.mailcap
  4. /etc/mailcap
  5. /usr/etc/mailcap
  6. /usr/local/etc/mailcap

meli.conf(5), meli-themes(5), meli(7), xdg-open(1), mailcap(5)

Copyright 2017–2024 Manos Pitsidianakis <[email protected]>

Released under the GPL, version 3 or greater. This software carries no warranty of any kind. (See COPYING for full copyright and warranty notices.)

March 10, 2024 rendered by mandoc

meli.conf(5)

MELI.CONF(5) File Formats Manual MELI.CONF(5)

meli.confconfiguration file for the meli(1) terminal e-mail client

$XDG_CONFIG_HOME/meli/config.toml

TABLE OF CONTENTS

Configuration for meli is written in TOML which has a few things to consider (quoting the specification):

  • is case sensitive.
  • A TOML file must be a valid UTF-8 encoded Unicode document.
  • White-space means (0x09) or (0x20).
  • Newline means (0x0A) or (0x0D 0x0A).

Refer to TOML documentation for valid TOML syntax.

Though not part of TOML syntax, meli.conf can have nested configuration files by using the following m4(1) include macro:

include("/path/to/file")

The top level sections of the configuration are:

  • accounts
  • shortcuts
  • notifications
  • pager
  • listing
  • composing
  • pgp
  • terminal
  • log

An example configuration:

# Setting up a Maildir account
[accounts.account-name]
root_mailbox = "/path/to/root/folder"
format = "Maildir"
listing.index_style = "Compact"
identity="[email protected]"
subscribed_mailboxes = ["folder", "folder/Sent"] # or [ "*", ] for all mailboxes
display_name = "Name"
send_mail = 'msmtp --read-recipients --read-envelope-from'
#send_mail = { hostname = "smtp.example.com", port = 587, auth = { type = "auto", username = "user", password = { type = "command_eval", value = "gpg2 --no-tty -q -d ~/.passwords/user.gpg" } }, security = { type = "STARTTLS" } }

# Set mailbox-specific settings
  [accounts.account-name.mailboxes]
  "INBOX" = { alias="Inbox" } #inline table
  "drafts" = { alias="Drafts" } #inline table
  [accounts.account-name.mailboxes."foobar-devel"] # or a regular table
    ignore = true # don't show notifications for this mailbox

# Setting up an mbox account
[accounts.mbox]
root_mailbox = "/var/mail/username"
format = "mbox"
listing.index_style = "Compact"
identity="[email protected]"
send_mail = { hostname = "localhost", port = 25, auth = { type = "none" }, security = { type = "none" } }

[pager]
filter = "COLUMNS=72 /usr/local/bin/pygmentize -l email"
html_filter = "w3m -I utf-8 -T text/html"

[notifications]
script = "notify-send"

[composing]
editor_command = 'vim +/^$'

[shortcuts]
[shortcuts.composing]
edit = 'e'

[shortcuts.listing]
new_mail = 'm'
set_seen = 'n'

[terminal]
theme = "light"

Available options are listed below.

Default values are shown in parentheses.

String
The backend-specific path of the root_mailbox, usually .
String|SmtpServerConf
Command to pipe new mail to (exit code must be 0 for success) or settings for an SMTP server connection. See section SMTP Connections for its fields.
String
(optional) The mailbox that is the default to open or view for this account. Must be a valid mailbox path. If not specified, the default will be the root mailbox.
String [maildir mbox imap notmuch jmap]
The format of the mail backend.
[String,]
An array of mailbox paths to display in the UI. Paths are relative to the root mailbox (e.g. , not ). The glob wildcard can be used to match every mailbox name and path.
String
Your e-mail address that is inserted in the From: headers of outgoing mail.
[String,]
Extra e-mail address identities. When replying to an e-mail addressed to one of these identities, the From: header will be adjusted to its value instead of the default identity.
String
(optional) A name which can be combined with your address: "Name <[email protected]>".
boolean
Attempt to not make any changes to this account. (false)
boolean
(optional) If true, do not monitor account for changes (you can use shortcut listing.refresh). (false)
String
(optional) command to execute when manually refreshing (shortcut listing.refresh) (None)
String
(optional) Choose which search backend to use. Available options are "none" and "sqlite3". ("sqlite3")
String
(optional) Folder that contains files. They are parsed and imported read-only.
String
(optional) Path of mutt(1) compatible alias file in the option They are parsed and imported read-only.
String
(optional) Query passed to "notmuch address" to import contacts into meli. Contacts are parsed and imported read-only.
mailbox
(optional) Configuration for each mailbox. Its format is described below in mailboxes.

notmuch is supported by loading the dynamic library libnotmuch. If its location is missing from your library paths, you must add it yourself. Alternatively, you can specify its path by using a setting.

notmuch mailboxes are virtual, since they are defined by user-given notmuch queries. You must explicitly state the mailboxes you want in the mailboxes field and set the query property to each of them. To create a tree hierarchy with virtual mailboxes, define the parent property to a mailbox as the name of the parent mailbox you have used in your configuration.

Account properties:

points to the directory which contains the .notmuch/ subdirectory.
Path
Use an arbitrary location of libnotmuch by specifying its full filesystem path. (optional)
Mailbox properties:
String
The notmuch query that defines what content this virtual mailbox has. Refer to notmuch-search-terms(7) for notmuch's search syntax.
String
If you wish to build a mailbox hierarchy, define the name of a parent mailbox you have used in your configuration. (optional)

Example:

[accounts.notmuch]
format = "notmuch"
#library_file_path = "/opt/homebrew/lib/libnotmuch.5.dylib"
...
  [accounts.notmuch.mailboxes]
  "INBOX" = {  query="tag:inbox", subscribe = true }
  "Drafts" = {  query="tag:draft", subscribe = true }
  "Sent" = {  query="from:[email protected] from:[email protected]", subscribe = true }
  "Archives" = {  query="tag:archived", subscribe = true }
  "Archives/2019" = {  query="tag:archived date:01-2019..12-2019", parent="Archives", subscribe = true }

IMAP specific options are:

String
example: "mail.example.com"
String
Server username
String
Server password
String
(optional) Use instead of server_password
number
(optional) The port to connect to ()
boolean
(optional) If port is 993 and "use_starttls" is unspecified, it becomes false by default. (true)
boolean
(optional) Connect with TLS (or upgrade from plain connection to TLS if is set.) (true)
boolean
(optional) Do not validate TLS certificates. (false)
boolean
(optional) Keep mail headers in an sqlite3 database. (true)
boolean
(optional) Use extension. (true)
boolean
(optional) Use extension. (true)
boolean
(optional) Use extension (if built with support) (true)
boolean
(optional) Use OAUTH2 authentication. Can only be used with server_password_command which should return a base64-encoded OAUTH2 token ready to be passed to IMAP. For help on setup with Gmail, see Gmail section below. (false)
boolean
(optional) Use extension for authentication. (false)
boolean
(optional) Use extension to retrieve server metadata, viewable at the account status page. Enabling this does not send any information to the server. (false)
boolean
(optional) Use a connection pool of more than one server connections, to prevent time-outs when performing multiple operations. IMAP connections are stateful and can only operate on one mailbox at a time, thus using a connection requires locking. Having a pool of alternative connections created on demand in case they can be made available faster than the main connection can be unlocked might alleviate lock contention. (true)
integer
(optional) Timeout to use for server connections in seconds. A timeout of 0 seconds means there is no timeout. (16)

Gmail has non-standard IMAP behaviors that need to be worked around.

Option store_sent_mail should be disabled since Gmail auto-saves sent mail by its own.

To use OAUTH2, you must go through a process to register your own private "application" with Google that can use OAUTH2 tokens, and set the option use_oauth2 as ‘true’ in the account configuration section. For convenience in the meli repository under the contrib/ directory you can find a file named oauth2.py to generate and request the appropriate data to perform OAUTH2 authentication.

Steps:

  • In Google APIs, create a custom OAuth client ID and note down the Client ID and Client Secret. You may need to create a consent screen; follow the steps described in the website.
  • Run the oauth2.py script as follows (after adjusting binary paths and credentials):

    python3 oauth2.py [email protected] --client_id=1038[...].apps.googleusercontent.com --client_secret=VWFn8LIKAMC-MsjBMhJeOplZ --generate_oauth2_token and follow the instructions. Note down the refresh token.

  • In server_password_command enter a command like this (after adjusting binary paths and credentials):

    TOKEN=$(python3 oauth2.py [email protected] --quiet --client_id=1038[...].apps.googleusercontent.com --client_secret=VWFn8LIKAMC-MsjBMhJeOplZ --refresh_token=1/Yzm6MRy4q1xi7Dx2DuWXNgT6s37OrP_DW_IoyTum4YA) && python3 oauth2.py [email protected] --generate_oauth2_string --quiet --access_token=$TOKEN

  • On startup, meli should evaluate this command which if successful must only return a -encoded token ready to be passed to

    Your account section should look like this:

    [accounts."gmail"]
    root_mailbox = '[Gmail]'
    format = "imap"
    server_hostname='imap.gmail.com'
    server_username="[email protected]"
    use_oauth2 = true
    server_password_command = "TOKEN=$(py...th2_string --quiet --access_token=$TOKEN"
    server_port="993"
    listing.index_style = "Conversations"
    identity = "[email protected]"
    display_name = "Name Name"
    subscribed_mailboxes = ["*" ]
    send_mail = { hostname = "smtp.gmail.com", port = 587, auth = { type = "xoauth2", token_command = "...", require_auth = true }, security = { type = "STARTTLS" } }
    composing.store_sent_mail = false

specific options

String
example: "http://mail.example.com" "http://mail.example.com:8080" "https://mail.example.com"
String
Server username
String
Server password
String
(optional) Use instead of server_password
boolean
Authenticate using the API Bearer token method. If enabled, the token value must be provided as the configured password. (false)
boolean
(optional) Do not validate TLS certificates. (false)
integer
(optional) Timeout to use for server connections in seconds. A timeout of 0 seconds means there is no timeout. (16)

mbox specific options:

String
(optional) Prefer specific mbox format reader for each message. Default is "mboxcl2" format. If the preferred format fails, the message is retried with mboxrd and then if it fails again there is a recover attempt, which discards the invalid message.

Valid values

  • auto
  • mboxo
  • mboxrd
  • mboxcl
  • mboxcl2
(auto)
To set multiple mailboxes, you have to explicitly state the mailboxes you want in the mailboxes field and set the path property to each of them. Example:
[accounts.mbox]
format = "mbox"
mailboxes."Python mailing list" = { path = "~/.mail/python.mbox", subscribe = true, autoload = true }

NNTP specific options

String
example: "nntp.example.com"
String
Server username
String
Server password
boolean
(optional) require authentication in every case (true)
boolean
(optional) Connect with TLS. (false)
number
(optional) The port to connect to ()
boolean
(optional) Do not validate TLS certificates. (false)
boolean
(optional) Store seen status locally in an sqlite3 database. (true)
integer
(optional) Timeout to use for server connections in seconds. A timeout of 0 seconds means there is no timeout. (16)

You have to explicitly state the groups you want to see in the mailboxes field. Example:

[accounts.sicpm.mailboxes]
  "sic.all" = {}

To submit articles directly to the NNTP server, you must set the special value in the account send_mail field. Example:

send_mail = "server_submission"

String
(optional) Show a different name for this mailbox in the UI.
boolean
(optional) Load this mailbox on startup (true)
boolean
(optional) Collapse this mailbox subtree in menu. (false)
boolean
(optional) Watch this mailbox for updates. (true)
boolean
(optional) Silently insert updates for this mailbox, if any. (false)
boolean
(optional) special usage of this mailbox. Valid values are:
  • Normal ()
  • Inbox
  • Archive
  • Drafts
  • Flagged
  • Junk
  • Sent
  • Trash
otherwise usage is inferred from the mailbox title. If for example your Sent folder is not named "Sent", you must explicitly set it.
boolean
(optional) Override global settings for this mailbox. Available sections to override are and the account options identity. Example:
[accounts."imap.example.com".mailboxes]
  "INBOX" = { index_style = "plain" }
  "INBOX/Lists/devlist" = { autoload = false, pager = { filter = "pygmentize -l diff -f 256"} }
unsigned integer
(optional) Override sort order on the sidebar for this mailbox. Example:
[accounts."imap.example.com".mailboxes]
  "INBOX" = { index_style = "plain" }
  "INBOX/Sent" = { sort_order = 0 }
  "INBOX/Drafts" = { sort_order = 1 }
  "INBOX/Lists" = { sort_order = 2 }
String
(optional) Override the default UTF-8 charset for the mailbox name. Useful only for mailboxes. (, , , )

Default values are shown in parentheses.

String
Command to launch editor. Can have arguments. Draft filename is given as the last argument. If it's missing, the environment variable EDITOR is looked up.
boolean
(optional) Embedded editor within meli. Editor must be compliant. (false)
boolean
(optional) Set format=flowed [RFC3676] in text/plain attachments. (true)
boolean
(optional) Add meli User-Agent header in new drafts. (true)
hash table String[String]
(optional) Default header values used when creating a new draft. ()
Option<(String, String)>
(optional) Wrap header pre-ample when editing a draft in an editor. This allows you to write non-plain text email without the preamble creating syntax errors. They are stripped when you return from the editor. The values should be a two element array of strings, a prefix and suffix. This can be useful when for example you're writing Markdown; you can set the value to which wraps the headers in an comment. (None)
boolean
(optional) Store sent mail after successful submission. This setting is meant to be disabled for non-standard behaviour in Gmail, which auto-saves sent mail on its own. (true)
String
(optional) The attribution line appears above the quoted reply text. The format specifiers for the replied address are:
  • — the sender's name and email address.
  • — the sender's name (or email address, if no name is included).
  • — the sender's email address.
The format string is passed to strftime(3) with the replied envelope's date. ()
boolean
(optional) Whether the strftime(3) call for the attribution string uses the locale instead of the user's active locale. (true)
boolean or ask
(optional) Forward emails as attachment? (Alternative is inline). ()
[String]
(optional) Alternative lists of reply prefixes (etc. ["Re:", "RE:", ...]) to strip.
String
(optional) The prefix to use in reply subjects. The default prefix is ‘Re:’. (‘Re:’)

RFC 2822, "Internet Message Format" has this to say on the matter:

When used in a reply, the field body MAY start with the string "Re: " (from
the Latin "res", in the matter of) followed by the contents of the "Subject:"
field body of the original message.
[{ name = String, command = String }]
(optional) Custom compose-hooks that run shell scripts. compose-hooks run before submitting an e-mail. They perform draft validation and/or transformations. If a custom hook exits with an error status or prints output to stdout and stderr, it will show up in the UI as a notification.

Example:

[composing]
editor_cmd = '~/.local/bin/vim +/^$'
embedded_pty = true
custom_compose_hooks = [ { name ="spellcheck", command="aspell --mode email --dont-suggest --ignore-case list" }]
[String]
(optional) Disabled compose-hooks. compose-hooks run before submitting an e-mail. They perform draft validation and/or transformations. If a hook encounters an error or warning, it will show up as a notification. The currently available hooks are:
Path
(optional) Plain text file with signature that will pre-populate an email draft. Signatures must be explicitly enabled to be used, otherwise this setting will be ignored. (None)
bool
Pre-populate email drafts with signature, if any. meli will lookup the signature value in this order:
  1. The signature_file setting.
  2. ${XDG_CONFIG_DIR}/meli/<account>/signature
  3. ${XDG_CONFIG_DIR}/meli/signature
  4. ${XDG_CONFIG_DIR}/signature
  5. ${HOME}/.signature
  6. No signature otherwise.
(false)
String
(optional) Signature delimiter, that is, text that will be prefixed to your signature to separate it from the email body. (‘\n\n-- \n’)
boolean
(optional) When replying to an e-mail authored by our main identity or one of our extra identities, reply to those addresses instead of reusing the receivers of the original e-mail we are replying to. The default is false, because the intuitive behavior when replying to ourselves is to follow-up on an e-mail we sent. (false)

Shortcuts can take the following values:

Where char is a single character string, maximum 4 bytes long, like the corresponding type in Rust.

In the next subsection, you will find lists for each shortcut category. The headings before each list indicate the map key of the shortcut list. For example for the first list titled general the configuration is typed as follows:

[shortcuts.general]
next_tab = 'T'

and for listing:

[shortcuts.listing]
open_entry = "Enter"
exit_entry = 'i'

In addition, each shortcuts section supports a TOML array of commands to associate a key to an array of COMMAND mode commands.

[shortcuts.listing]
commands = [ { command = [ "tag remove trash", "flag unset trash" ], shortcut = "D" },
             { command = [ "tag add trash", "flag set trash" ], shortcut = "d" } ]

Default values are shown in parentheses.

general

Toggle help and shortcuts view. ()
Enter COMMAND mode. ()
Quit meli. ()
Go to the nth tab ()
Go to the next tab. ()
Generic scroll right (catch-all setting) ()
Generic scroll left (catch-all setting) (h)
Generic scroll up (catch-all setting) (k)
Generic scroll down (catch-all setting) (j)
Go to next page. (catch-all setting) (PageDown)
Go to previous page. (catch-all setting) (PageUp)
Go to first page. (catch-all setting) (Home)
Go to last page. (catch-all setting) (End)
Open list entry. (catch-all setting) (Enter)
Show next info message, if any. ()
Show previous info message, if any. ()
Focus on a text field. (Enter)
Scroll to next search result. (n)
Scroll to previous search result. ()

listing

Scroll up list. (k)
Scroll down list. (j)
Go to next page. (PageDown)
Go to previous page. (PageUp)
Start new mail draft in new tab. (m)
Go to next account. (H)
Go to previous account. (L)
Go to next mailbox. ()
Go to previous mailbox. ()
Open selected mailbox (Enter)
Toggle mailbox visibility in menu. (Space)
Search within list of e-mails. ()
Manually request a mailbox refresh. ()
Set thread as seen. (n)
Send entry to trash folder. ()
Union modifier. ()
Difference modifier. (C-d)
Intersection modifier. (i)
Select (or toggle) thread entry. ()
Perform select motion with a movement. (v)
Increase sidebar width. (C-f)
Decrease sidebar width. (C-d)
When reading a mail item, change focus on next entry according to the current sorting. ()
When reading a mail item, change focus on previous entry according to the current sorting. ()
Toggle visibility of side menu in mail list. (`)
Switch focus on the left. (Left)
Switch focus on the right. (Right)
Exit e-mail entry. (i)
Open e-mail entry. (Enter)

Go to next page. (PageDown)
Go to previous page. (PageUp)
Scroll down pager. (j)
Scroll up pager. (k)
Select content filter. ()

See also named_filters setting.

Scroll up list. (k)
Scroll down list. (j)
Create new contact. (c)
Edit contact under cursor. (e)
Export contact under cursor to .vcf. ()
Delete contact under cursor. (d)
Mail contact under cursor. (m)
Go to next account. (H)
Go to previous account. (L)
Toggle visibility of side menu in mail list. (`)

Edit mail. (e)
Deliver draft to mailer ()
Change field focus. (k)
Change field focus. (j)

To select an attachment, type its index (you will see the typed result in the command buffer on the bottom right of the status line), then issue the corresponding command.

Select addresses from envelope to add to contacts. (c)
Open envelope in composer. (e)
Go to url of given index (with the command url_launcher setting in PAGER section) ()
Opens selected attachment with xdg-open ()
Opens selected attachment according to its mailcap entry. See meli(1) FILES for the mailcap file locations. (m)
Opens html attachment in the default browser. (v)
Reply to envelope. ()
Reply to author. (C-r)
Reply to all/Reply to list/Follow up. ()
Forward email. (C-f)
Return to envelope if viewing raw source or attachment. ()
Expand extra headers (References and others) (h)
Toggles url open mode. When active, it prepends an index next to each url that you can select by typing the index and open by issuing go_to_url ()
View raw envelope source in a pager. ()
Force attachment charset for decoding. (d)

Scroll up list. (k)
Scroll down list. (j)
collapse thread branches. (h)
Go to next page. (PageDown)
Go to previous page. (PageUp)
reverse thread order. (C-r)
toggle mail view visibility. ()
toggle thread view visibility. ()
Toggle between horizontal and vertical layout. (Space)

meli(1) can display notifications for asynchronous, out-of-band events that happen. These events can be any event of interest that is not a direct result of the user's interaction with the user interface, like for example receiving a new e-mail, or an SMTP server accepting an e-mail for delivery, or a backend watch mechanism error. The used notification mechanism is dbus if it is available on your system and if meli(1) has been compiled with support for it (check output of compiled-with CLI subcommand). Otherwise the fallback mechanism is calling a script to display a notification. If script is defined in your configuration, this mechanism will be preferred even if dbus is available.

On , without a script configured, meli(1) calls the osascript binary to display notifications:

osascript -e 'display_notification "<MESSAGE>" with title "<TITLE>" subtitle "<SUBTITLE>"'
You can override the script setting with variations of this command for customization.

Information that is in response to user interface actions should be instead shown within the user interface as floating message boxes. If you don't want UI notifications to be displayed, you can set the ui_notifications option to hide to hide them, or system to display them as system notifications.

Even when UI notifications are not displayed, you can still browse through them manually using shortcuts.general.info_message_next and shortcuts.general.info_message_previous shortcuts.

Default values are shown in parentheses.

boolean
(optional) Enable notifications. (true)
String
(optional) Script to pass notifications to, with title as 1st arg and body as 2nd (none)
String
(optional) A command to pipe new mail notifications through (preferred over script), with title as 1st arg and body as 2nd. (none)
String
(optional) File that gets its size updated when new mail arrives. (none)
boolean
(optional) Play theme sound in notifications if possible. (false)
String
(optional) Play sound file in notifications if possible. (none)
UINotifications
(optional) How to handle UI notifications. (show) Valid values:
Always show.
Hide from UI.
Show them as system notifications.

Default values are shown in parentheses.

boolean
(optional) Always show headers when scrolling. (false)
String
(optional) Pipe html attachments through this filter before display (none)
String
(optional) A command to open html files. (none)
String
(optional) A command to pipe mail output through for viewing in pager.
String[String]
(optional) Named filter commands to use at will. (empty)

Show menu with an empty filter command. Example:

[pager]
named_filters = { diff = "pygmentize -l diff -f 256", par = "par 72" }
boolean
(optional) Respect format=flowed (true)
boolean
(optional) Split long lines that would overflow on the x axis. (true)
num
(optional) Minimum text width in columns. ()
boolean
(optional) Choose text/html alternative if text/plain is empty in multipart/alternative attachments. (true)
boolean
(optional) Show Date: in local timezone (true)
String
(optional) A command to launch URLs with. The URL will be given as the first argument of the command. ()
[String]
(optional) Extra headers to display, if present, in the default header preamble of the pager. (empty)

This setting is useful especially when used per-folder or per-account. For example, if you use (See r2e(1)) the e-mail you will receive will have the header by default. You can show them only in the folder where you keep your feed items:

[accounts."personal".mailboxes]
INBOX = {}
"INBOX/Sent" = { sort_order=0 }
"INBOX/Feeds" = { pager.show_extra_headers = ["X-RSS-Feed"] }

Default values are shown in parentheses.

boolean
(optional)
Show auto-hiding scrollbar in accounts sidebar menu. (true)
String
(optional) Datetime formatting passed verbatim to strftime(3). ()
Boolean
(optional) Show recent dates as ‘X {minutes,hours,days} ago’, up to 7 days. (true)
Query
(optional) Show only envelopes matching this query. (For query syntax see meli(1) QUERY ABNF SYNTAX) (None)

Example:

filter = "not flags:seen" # show only unseen messages
String
Sets the way mailboxes are displayed.
conversations shows one entry per thread
compact shows one row per thread
threaded shows threads as a tree structure
plain shows one row per mail, regardless of threading
String
(optional) Sets the string to print in the mailbox tree for a level where its root has a sibling. See example below for a clear explanation and examples.
String
(optional) Sets the string to print in the mailbox tree for a level where its root has no sibling.
String
(optional) Sets the string to print in the mailbox tree for a leaf level where its root has a sibling.
String
(optional) Sets the string to print in the mailbox tree for a leaf level where its root has no sibling.
char
(optional) Sets the character to print as the divider between the accounts list and the message list.
Integer
(optional) This is the width of the right container to the entire screen width. ()
Option<String>
Flag to show if thread entry contains unseen mail. ()
Option<String>
Flag to show if thread has been snoozed. ("💤\u{FE0E}") [Rendered as:r##"💤︎"##]
Option<String>
Flag to show if thread entry has been selected. ("☑️ \u{2007}") [Rendered as:r##"☑️ "##]
Option<String>
Flag to show if thread entry contains attachments. ("📎\u{FE0E}") [Rendered as:r##"📎︎"##]
Option<String>
Flag to show if any thread entry contains your address as a receiver. Useful to make mailing list threads that CC you stand out. ()
boolean
Show highlight_self_flag or not. (false)
boolean
Should threads with differentiating Subjects show a list of those subjects on the entry title? (true)
boolean
In threaded listing style, repeat identical From column values within a thread. Not repeating adds empty space in the From column which might result in less visual clutter. (false)
boolean
Show relative indices in menu mailboxes to quickly help with jumping to them. (true)
boolean
Show relative indices in listings to quickly help with jumping to them. (true)
boolean
Start app with sidebar hidden. (false)
char
Character to show in the divider space between mail view and listing. ()
auto | vertical | horizontal
Force specific layout in thread view. The layout can also be toggled at runtime with the listing.toggle_layout shortcut. (auto)

The default values

 has_sibling = " "
 no_sibling = " ";
 has_sibling_leaf = " "
 no_sibling_leaf = " "

render a mailbox tree like the following:

0  Inbox 3
1   Archive
2   Drafts
3   Lists
4    example-list-a
5    example-list-b
6   Sent
7   Spam
8   Trash

Other possible trees:

has_sibling = " ┃"
no_sibling = "  "
has_sibling_leaf = " ┣━"
no_sibling_leaf = " ┗━"

0  Inbox 3
1   ┣━Archive
2   ┣━Drafts
3   ┣━Lists
4   ┃ ┣━example-list-a
5   ┃ ┗━example-list-b
6   ┣━Sent
7   ┣━Spam
8   ┗━Trash

A completely ASCII one:

has_sibling = " |"
no_sibling = "  "
has_sibling_leaf = " |\_"
no_sibling_leaf = " \_"

0  Inbox 3
1   |\_Archive
2   |\_Drafts
3   |\_Lists
4   | |\_example-list-a
5   |  \_example-list-b
6   |\_Sent
7   |\_Spam
8    \_Trash

Default values are shown in parentheses.

hash table String[Color]
(optional) Set UI colors for tags
Array String
(optional) Hide tags (not the tagged messages themselves)

Example:

[tags]
# valid inputs: #HHHHHH, #ABC -> #AABBCC, XTERM_NAME, 0-255 byte
colors = { signed="#Ff6600", replied="DeepSkyBlue4", draft="#f00", replied="8" }
[accounts.dummy]
...
  [accounts.dummy.mailboxes]
  # per mailbox override:
  "INBOX" = { tags.ignore_tags=["inbox", ] }

Default values are shown in parentheses.

boolean
Auto verify signed e-mail according to RFC3156 (true)
boolean
(optional) Always decrypt encrypted e-mail (true)
boolean
(optional) Always sign sent messages (false)
boolean
(optional) Always encrypt sent messages (false)
String
(optional) ID of key to be used for signatures (none)
String
(optional) ID of key to be used for decryption (none)
String
(optional) ID of key to be used for encryption (none)
boolean
(optional) Allow remote lookups (false)
LocateKey
(optional) Remote lookup mechanisms. Use comma to separate values. ()

Possible mechanisms:

Some useful unicode combining marks (invisible characters that modify the presentation of visible characters before them) are:

\u{FE0E} Emoji variation sequence select 15: renders an emoji as text style (monochrome)
\u{FE0F} Emoji variation sequence select 16: renders an emoji in color
\u{2007} Figure space, a space character with the width of a digit in a monospace typeface

Default values are shown in parentheses.

String
(optional) Theme name to use. ()
u8
How many cells a tab character occupies. ()
boolean
(optional) If true, box drawing will be done with ASCII characters. (false)
boolean
(optional) If false, no colors are used. (true)
boolean
(optional) If true, text presentations of color symbols and emoji will be enforced as much as possible. Might not work on all non-text symbols and is experimental. (false)
String
(optional) Set window title in xterm compatible terminals An empty string means no window title is set. (meli)
String
(optional) Set command that prints file paths in stdout, separated by NUL bytes. Used with add-attachment-file-picker when composing new mail. (None)
hash table String[String[Attribute]]
Define UI themes. See meli-themes(5) for details.
[terminal]
theme = "themeB"

[terminal.themes.themeA]
"mail.view.body" = {fg = "HotPink3", bg = "LightSalmon1"}
...
[terminal.themes.themeB]
"mail.view.body" = {fg = "CadetBlue", bg = "White"}
...
[terminal.themes.themeC]
...
boolean
Use mouse events. This will disable text selection, but you will be able to resize some widgets. This setting can be toggled with toggle mouse. (false)
String
String to show in status bar if mouse is active. (🖱️)
Either < Integer, ProgressSpinner >
Choose between 37 built in sequences (integers between 0-36) or define your own list of strings for the progress spinner animation. Set to an empty array to disable the progress spinner. ()

Built-in sequences are:

0   ["-", "\", "|", "/"]
1   ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"]
2   ["⣀", "⣄", "⣤", "⣦", "⣶", "⣷", "⣿"]
3   ["⣀", "⣄", "⣆", "⣇", "⣧", "⣷", "⣿"]
4   ["○", "◔", "◐", "◕", "⬤"]
5   ["□", "◱", "◧", "▣", "■"]
6   ["□", "◱", "▨", "▩", "■"]
7   ["□", "◱", "▥", "▦", "■"]
8   ["░", "▒", "▓", "█"]
9   ["░", "█"]
10  ["⬜", "⬛"]
11  ["▱", "▰"]
12  ["▭", "◼"]
13  ["▯", "▮"]
14  ["◯", "⬤"]
15  ["⚪", "⚫"]
16  ["▖", "▗", "▘", "▝", "▞", "▚", "▙", "▟", "▜", "▛"]
17  ["|", "/", "-", "\"]
18  [".", "o", "O", "@", "*"]
19  ["◡◡", "⊙⊙", "◠◠", "⊙⊙"]
20  ["◜ ", " ◝", " ◞", "◟ "]
21  ["←", "↖", "↑", "↗", "→", "↘", "↓", "↙"]
22  ["▁", "▃", "▄", "▅", "▆", "▇", "█", "▇", "▆", "▅", "▄", "▃"]
23  [ "▉", "▊", "▋", "▌", "▍", "▎", "▏", "▎", "▍", "▌", "▋", "▊", "▉" ]
24  ["▖", "▘", "▝", "▗"]
25  ["▌", "▀", "▐", "▄"]
26  ["┤", "┘", "┴", "└", "├", "┌", "┬", "┐"]
27  ["◢", "◣", "◤", "◥"]
28  ["⠁", "⠂", "⠄", "⡀", "⢀", "⠠", "⠐", "⠈"]
29  ["⢎⡰", "⢎⡡", "⢎⡑", "⢎⠱", "⠎⡱", "⢊⡱", "⢌⡱", "⢆⡱"]
30  [".", "o", "O", "°", "O", "o", "."]
31  ["㊂", "㊀", "㊁"]
32  ["💛 ", "💙 ", "💜 ", "💚 ", "❤️ "]
33  [ "🕛 ", "🕐 ", "🕑 ", "🕒 ", "🕓 ", "🕔 ", "🕕 ", "🕖 ", "🕗 ", "🕘 ", "🕙 ", "🕚 " ]
34  ["🌍 ", "🌎 ", "🌏 "]
35  [ "[    ]", "[=   ]", "[==  ]", "[=== ]", "[ ===]", "[  ==]", "[   =]", "[    ]", "[   =]", "[  ==]", "[ ===]", "[====]", "[=== ]", "[==  ]", "[=   ]" ]
36  ["🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "]

Or, define an array of strings each consisting of a frame in the progress sequence indicator for a custom spinner:

u64
(optional) Frame interval. (50)
[String]
The animation frames.

Example:

progress_spinner_sequence = { interval_ms = 150, frames = [ "-", "=", "≡" ] }

Default values are shown in parentheses.

String
(optional) path of the log file ($XDG_DATA_HOME/meli/meli.log)
String
(optional) maximum level of messages to log. All levels less or equal to the maximum_level will be appended to the log file. Available levels are, in partial order: This means that to turn logging off, set maximum_level to OFF. (INFO)

Default values are shown in parentheses.

String
server hostname
Integer
server port
String
(optional) address to set as sender in SMTP transactions (none)
SmtpAuth
server authentication. See SmtpAuth subsection.
SmtpSecurity
(optional) binary name or file location to use. (see SmtpSecurity subsection)
SmtpExtensions
(optional) set support for SMTP extensions if they are advertised by the server. (see SmtpExtensions subsection)

none | auto | xoauth2
 

For type "auto":

String
 
SmtpPassword
 
boolean
(optional) require authentication in every case. (true)

For type "xoauth2":

String
Command to evaluate that returns an token.
boolean
(optional) require authentication in every case. (true)

Examples:

auth = { type = "auto", username = "user", password = { type = "raw", value = "hunter2" } }
auth = { type = "auto", username = "user", password = "hunter2" }
auth = { type = "none" }

For Gmail (see Gmail OAUTH2 for details on the authentication token command):

auth = { type = "xoauth2", token_command = "TOKEN=$(python3 oauth2.py [email protected] --quiet --client_id=1038[...].apps.googleusercontent.com --client_secret=[..] --refresh_token=[..] && python3 oauth2.py [email protected] --generate_oauth2_string --quiet --access_token=$TOKEN" }

raw | command_evaluation
 
String
Either a raw password string, or command to execute.

Examples:

password = { type = "raw", value = "hunter2" }
password = { type = "command_eval", value = "gpg2 --no-tty -q -d ~/.passwords/user.gpg" }

Default security type is auto.

none | auto | starttls | tls
 
boolean
Accept invalid / TLS certificates (false)

boolean
RFC2920 (true)
boolean
RFC3030 (true)
boolean
draft-hall-prdr-00 (true)
String
RFC3461 ()

meli(1), meli-themes(5)

Copyright 2017–2024 Manos Pitsidianakis <[email protected]>

Released under the GPL, version 3 or greater. This software carries no warranty of any kind. (See COPYING for full copyright and warranty notices.)

May 20, 2024 rendered by mandoc

meli.conf.examples(5)

MELI.CONF.EXAMPLES(5) File Formats Manual MELI.CONF.EXAMPLES(5)

meli.conf.examplesExample configurations for various mail backends supported by the meli(1) terminal e-mail client

TABLE OF CONTENTS

An example configuration:

[accounts.account-name]
root_mailbox = "/path/to/root/folder"
format = "Maildir"
listing.index_style = "Compact"
identity="[email protected]"
display_name = "Name"
send_mail = 'msmtp --read-recipients --read-envelope-from'
#send_mail = { hostname = "smtp.example.com", port = 587, auth = { type = "auto", username = "user", password = { type = "command_eval", value = "gpg2 --no-tty -q -d ~/.passwords/user.gpg" } }, security = { type = "STARTTLS" } }

# Set mailbox-specific settings
  [accounts.account-name.mailboxes]
  "INBOX" = { alias="Inbox" } #inline table
  "drafts" = { alias="Drafts" } #inline table
  [accounts.account-name.mailboxes."foobar-devel"] # or a regular table
    ignore = true # don't show notifications for this mailbox

An example configuration:

[accounts.account-name]
root_mailbox = "/var/mail/username"
format = "mbox"
listing.index_style = "Compact"
identity="[email protected]"
send_mail = '/bin/false'

[accounts."account-name"]
root_mailbox = "INBOX"
format = "imap"
server_hostname="mail.example.com"
server_password="pha2hiLohs2eeeish2phaii1We3ood4chakaiv0hien2ahie3m"
server_username="[email protected]"
#server_port="993" # imaps
server_port="143" # STARTTLS
use_starttls=true #optional
send_mail = { hostname = "smtp.example.com", port = 587, auth = { type = "auto", username = "user", password = { type = "command_eval", value = "gpg2 --no-tty -q -d ~/.passwords/user.gpg" } }, security = { type = "STARTTLS" } }
display_name = "Name Name"
identity = "[email protected]"
## show only specific mailboxes:
#subscribed_mailboxes = ["INBOX", "INBOX/Sent", "INBOX/Drafts", "INBOX/Junk"]

[accounts."account-name"]
root_mailbox = '[Gmail]'
format = "imap"
send_mail = { hostname = "smtp.gmail.com", port = 587, auth = { type = "auto", username = "user", password = { type = "command_eval", value = "gpg2 --no-tty -q -d ~/.passwords/user.gpg" } }, security = { type = "STARTTLS" } }
server_hostname='imap.gmail.com'
server_password="password"
server_username="[email protected]"
server_port="993"
listing.index_style = "Conversations"
identity = "[email protected]"
display_name = "Name Name"
# Gmail auto saves sent mail to Sent folder, so don't duplicate the effort:
composing.store_sent_mail = false

The server_url option must hold the address of the server's session endpoint.

[accounts."account-name"]
root_mailbox = "INBOX"
format = "jmap"
send_mail = 'server_submission'
server_url="http://localhost:8080"
server_username="[email protected]"
server_password="changeme"
identity = "[email protected]"

Fastmail uses the authentication mechanism, so the option use_token must be enabled:

[accounts."fastmail-jmap"]
root_mailbox = "INBOX"
format = "jmap"
server_url="https://api.fastmail.com/jmap/session"
server_username="[email protected]"
server_password="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
use_token=true
identity = "My Name <[email protected]>"
send_mail = "server_submission"

TODO

TODO

meli.conf(5), meli(1), meli-themes(5)

Copyright 2017–2024 Manos Pitsidianakis <[email protected]>

Released under the GPL, version 3 or greater. This software carries no warranty of any kind. (See COPYING for full copyright and warranty notices.)

November 22, 2024 rendered by mandoc

meli-themes(5)

MELI-THEMES(5) File Formats Manual MELI-THEMES(5)

meli-themesthemes for the meli(1) terminal e-mail client

meli comes with two themes, dark (default) and light.

Custom themes are defined as lists of key-values in the configuration files:

  • $XDG_CONFIG_HOME/meli/config.toml
  • $XDG_CONFIG_HOME/meli/themes/*.toml

The application theme is defined in the configuration as follows:

[terminal]
theme = "dark"

TABLE OF CONTENTS

Themes for meli are described in the configuration language TOML, as they are key-value tables defined in the TERMINAL section of the configuration file. Each key defines the semantic location of the theme attribute within the application. For example, mail.listing.compact.* keys are settings for the compact mail listing style. A setting contains three fields: fg for foreground color, bg for background color, and attrs for text attribute.

"widget.key.label" = { fg = "Default", bg = "Default", attrs = "Default" }

Each field contains a value, which may be either a color/attribute, a link (key name) or a valid alias. An alias is a string starting with the "$" character and must be declared in advance in the color_aliases or attr_aliases fields of a theme. An alias' value can be any valid value, including links and other aliases, as long as they are valid. In the case of a link the setting's real value depends on the value of the referred key. This allows for defaults within a group of associated values. Cyclic references in a theme results in an error:

spooky theme contains a cycle: fg: mail.listing.compact.even -> mail.listing.compact.highlighted -> mail.listing.compact.odd -> mail.listing.compact.even

Two themes are included by default, ‘light’ and ‘dark’.

Specific settings from already defined themes can be overwritten:

[terminal]
theme = "dark"

[terminal.themes.dark]
"mail.sidebar_highlighted_account" = { bg = "#ff4529" }
"mail.listing.attachment_flag" = { fg = "#ff4529" }
"mail.view.headers" = { fg = "30" }
"mail.view.body" = {fg = "HotPink3", bg = "LightSalmon1"}
# Linked value keys can be whatever key:
"mail.listing.compact.even_unseen" = { bg = "mail.sidebar_highlighted_account" }
# Linked color value keys can optionally refer to another field:
"mail.listing.compact.odd_unseen" = { bg = "mail.sidebar_highlighted_account.fg" }

# define new theme. Undefined settings will inherit from the default "dark" theme.
[terminal.themes."hunter2"]
color_aliases= { "Jebediah" = "#b4da55" }
"mail.listing.tag_default" = { fg = "$Jebediah" }
"mail.view.headers" = { fg = "White", bg = "Black" }

Custom themes can be included in your configuration files or be saved independently in your $XDG_CONFIG_HOME/meli/themes/ directory as TOML files. To start creating a theme right away, you can begin by editing the default theme keys and values:

meli print-default-theme > ~/.config/meli/themes/new_theme.toml

new_theme.toml will now include all keys and values of the "dark" theme.

meli print-loaded-themes

will print all loaded themes with the links resolved.

Case-sensitive.

  • "Default"
  • "Bold"
  • "Dim"
  • "Italics"
  • "Underline"
  • "Undercurl"
  • "Blink"
  • "Reverse"
  • "Hidden"
  • Any combo of the above separated by a bitwise XOR "|" eg "Dim | Italics"

Color values are of type String with the following valid contents:

  • "Default" is the terminal default. (Case-sensitive)
  • Hex triplet e.g. #FFFFFF for RGB colors. Three character shorthand is also valid, e.g. #09c → #0099cc (Case-insensitive)
  • 0-255 byte for 256 colors.
  • xterm(1) name but with some modifications (for a full table see COLOR NAMES addendum) (Case-sensitive)

To completely disable ANSI colors, there are two options:

  • Set the use_color option (section terminal) to false, which is true by default.
  • The NO_COLOR environmental variable, when present (regardless of its value), prevents the addition of ANSI color. When the configuration value use_color is explicitly set to true by the user, NO_COLOR is ignored.

In this mode, cursor locations (i.e., currently selected entries/items) will use the ‘reverse videoANSI attribute to invert the terminal's default foreground/background colors.

  • theme_default
  • error_message
  • highlight
  • status.bar
  • status.command_bar
  • status.history
  • status.history.hints
  • status.notification
  • tab.focused
  • tab.unfocused
  • tab.bar
  • widgets.list.header
  • widgets.form.label
  • widgets.form.field
  • widgets.form.highlighted
  • widgets.options.highlighted
  • mail.sidebar
  • mail.sidebar_divider
  • mail.sidebar_unread_count
  • mail.sidebar_index
  • mail.sidebar_highlighted
  • mail.sidebar_highlighted_unread_count
  • mail.sidebar_highlighted_index
  • mail.sidebar_highlighted_account
  • mail.sidebar_highlighted_account_unread_count
  • mail.sidebar_highlighted_account_index
  • mail.listing.compact.even
  • mail.listing.compact.odd
  • mail.listing.compact.even_unseen
  • mail.listing.compact.odd_unseen
  • mail.listing.compact.even_selected
  • mail.listing.compact.odd_selected
  • mail.listing.compact.even_highlighted
  • mail.listing.compact.odd_highlighted
  • mail.listing.compact.even_highlighted_selected
  • mail.listing.compact.odd_highlighted_selected
  • mail.listing.plain.even
  • mail.listing.plain.odd
  • mail.listing.plain.even_unseen
  • mail.listing.plain.odd_unseen
  • mail.listing.plain.even_selected
  • mail.listing.plain.odd_selected
  • mail.listing.plain.even_highlighted
  • mail.listing.plain.odd_highlighted
  • mail.listing.plain.even_highlighted_selected
  • mail.listing.plain.odd_highlighted_selected
  • mail.listing.conversations
  • mail.listing.conversations.subject
  • mail.listing.conversations.from
  • mail.listing.conversations.date
  • mail.listing.conversations.unseen
  • mail.listing.conversations.highlighted
  • mail.listing.conversations.selected
  • mail.listing.conversations.highlighted_selected
  • mail.view.headers
  • mail.view.headers_names
  • mail.view.headers_area
  • mail.view.body
  • mail.view.thread.indentation.a
  • mail.view.thread.indentation.b
  • mail.view.thread.indentation.c
  • mail.view.thread.indentation.d
  • mail.view.thread.indentation.e
  • mail.view.thread.indentation.f
  • mail.listing.attachment_flag
  • mail.listing.thread_snooze_flag
  • mail.listing.tag_default
  • pager.highlight_search
  • pager.highlight_search_current

name ↓ byte name byte ↓
Aqua 14 Black 0
Aquamarine1 122 Maroon 1
Aquamarine2 86 Green 2
Aquamarine3 79 Olive 3
Black 0 Navy 4
Blue 12 Purple1 5
Blue1 21 Teal 6
Blue2 19 Silver 7
Blue3 20 Grey 8
BlueViolet 57 Red 9
CadetBlue 72 Lime 10
CadetBlue1 73 Yellow 11
Chartreuse1 118 Blue 12
Chartreuse2 112 Fuchsia 13
Chartreuse3 82 Aqua 14
Chartreuse4 70 White 15
Chartreuse5 76 Grey0 16
Chartreuse6 64 NavyBlue 17
CornflowerBlue 69 DarkBlue 18
Cornsilk1 230 Blue2 19
Cyan1 51 Blue3 20
Cyan2 50 Blue1 21
Cyan3 43 DarkGreen 22
DarkBlue 18 DeepSkyBlue5 23
DarkCyan 36 DeepSkyBlue6 24
DarkGoldenrod 136 DeepSkyBlue7 25
DarkGreen 22 DodgerBlue3 26
DarkKhaki 143 DodgerBlue2 27
DarkMagenta 90 Green4 28
DarkMagenta1 91 SpringGreen6 29
name ↓ byte name byte ↓
DarkOliveGreen1 192 Turquoise4 30
DarkOliveGreen2 155 DeepSkyBlue3 31
DarkOliveGreen3 191 DeepSkyBlue4 32
DarkOliveGreen4 107 DodgerBlue1 33
DarkOliveGreen5 113 Green2 34
DarkOliveGreen6 149 SpringGreen4 35
DarkOrange 208 DarkCyan 36
DarkOrange2 130 LightSeaGreen 37
DarkOrange3 166 DeepSkyBlue2 38
DarkRed 52 DeepSkyBlue1 39
DarkRed2 88 Green3 40
DarkSeaGreen 108 SpringGreen5 41
DarkSeaGreen1 158 SpringGreen2 42
DarkSeaGreen2 193 Cyan3 43
DarkSeaGreen3 151 DarkTurquoise 44
DarkSeaGreen4 157 Turquoise2 45
DarkSeaGreen5 115 Green1 46
DarkSeaGreen6 150 SpringGreen3 47
DarkSeaGreen7 65 SpringGreen1 48
DarkSeaGreen8 71 MediumSpringGreen 49
DarkSlateGray1 123 Cyan2 50
DarkSlateGray2 87 Cyan1 51
DarkSlateGray3 116 DarkRed 52
DarkTurquoise 44 DeepPink8 53
DarkViolet 128 Purple4 54
DarkViolet1 92 Purple5 55
DeepPink1 199 Purple3 56
DeepPink2 197 BlueViolet 57
DeepPink3 198 Orange3 58
DeepPink4 125 Grey37 59
name ↓ byte name byte ↓
DeepPink6 162 MediumPurple6 60
DeepPink7 89 SlateBlue2 61
DeepPink8 53 SlateBlue3 62
DeepPink9 161 RoyalBlue1 63
DeepSkyBlue1 39 Chartreuse6 64
DeepSkyBlue2 38 DarkSeaGreen7 65
DeepSkyBlue3 31 PaleTurquoise4 66
DeepSkyBlue4 32 SteelBlue 67
DeepSkyBlue5 23 SteelBlue3 68
DeepSkyBlue6 24 CornflowerBlue 69
DeepSkyBlue7 25 Chartreuse4 70
DodgerBlue1 33 DarkSeaGreen8 71
DodgerBlue2 27 CadetBlue 72
DodgerBlue3 26 CadetBlue1 73
Fuchsia 13 SkyBlue3 74
Gold1 220 SteelBlue1 75
Gold2 142 Chartreuse5 76
Gold3 178 PaleGreen4 77
Green 2 SeaGreen4 78
Green1 46 Aquamarine3 79
Green2 34 MediumTurquoise 80
Green3 40 SteelBlue2 81
Green4 28 Chartreuse3 82
GreenYellow 154 SeaGreen3 83
Grey 8 SeaGreen1 84
Grey0 16 SeaGreen2 85
Grey100 231 Aquamarine2 86
Grey11 234 DarkSlateGray2 87
Grey15 235 DarkRed2 88
Grey19 236 DeepPink7 89
name ↓ byte name byte ↓
Grey23 237 DarkMagenta 90
Grey27 238 DarkMagenta1 91
Grey3 232 DarkViolet1 92
Grey30 239 Purple2 93
Grey35 240 Orange4 94
Grey37 59 LightPink3 95
Grey39 241 Plum4 96
Grey42 242 MediumPurple4 97
Grey46 243 MediumPurple5 98
Grey50 244 SlateBlue1 99
Grey53 102 Yellow4 100
Grey54 245 Wheat4 101
Grey58 246 Grey53 102
Grey62 247 LightSlateGrey 103
Grey63 139 MediumPurple 104
Grey66 248 LightSlateBlue 105
Grey69 145 Yellow5 106
Grey7 233 DarkOliveGreen4 107
Grey70 249 DarkSeaGreen 108
Grey74 250 LightSkyBlue2 109
Grey78 251 LightSkyBlue3 110
Grey82 252 SkyBlue2 111
Grey84 188 Chartreuse2 112
Grey85 253 DarkOliveGreen5 113
Grey89 254 PaleGreen3 114
Grey93 255 DarkSeaGreen5 115
Honeydew2 194 DarkSlateGray3 116
HotPink 205 SkyBlue1 117
HotPink1 206 Chartreuse1 118
HotPink2 169 LightGreen 119
name ↓ byte name byte ↓
HotPink3 132 LightGreen1 120
HotPink4 168 PaleGreen1 121
IndianRed 131 Aquamarine1 122
IndianRed1 167 DarkSlateGray1 123
IndianRed2 204 Red2 124
IndianRed3 203 DeepPink4 125
Khaki1 228 MediumVioletRed 126
Khaki3 185 Magenta4 127
LightCoral 210 DarkViolet 128
LightCyan2 195 Purple 129
LightCyan3 152 DarkOrange2 130
LightGoldenrod1 227 IndianRed 131
LightGoldenrod2 222 HotPink3 132
LightGoldenrod3 179 MediumOrchid3 133
LightGoldenrod4 221 MediumOrchid 134
LightGoldenrod5 186 MediumPurple2 135
LightGreen 119 DarkGoldenrod 136
LightGreen1 120 LightSalmon2 137
LightPink1 217 RosyBrown 138
LightPink2 174 Grey63 139
LightPink3 95 MediumPurple3 140
LightSalmon1 216 MediumPurple1 141
LightSalmon2 137 Gold2 142
LightSalmon3 173 DarkKhaki 143
LightSeaGreen 37 NavajoWhite3 144
LightSkyBlue1 153 Grey69 145
LightSkyBlue2 109 LightSteelBlue3 146
LightSkyBlue3 110 LightSteelBlue 147
LightSlateBlue 105 Yellow6 148
LightSlateGrey 103 DarkOliveGreen6 149
name ↓ byte name byte ↓
LightSteelBlue 147 DarkSeaGreen6 150
LightSteelBlue1 189 DarkSeaGreen3 151
LightSteelBlue3 146 LightCyan3 152
LightYellow3 187 LightSkyBlue1 153
Lime 10 GreenYellow 154
Magenta1 201 DarkOliveGreen2 155
Magenta2 165 PaleGreen2 156
Magenta3 200 DarkSeaGreen4 157
Magenta4 127 DarkSeaGreen1 158
Magenta5 163 PaleTurquoise1 159
Magenta6 164 Red3 160
Maroon 1 DeepPink9 161
MediumOrchid 134 DeepPink6 162
MediumOrchid1 171 Magenta5 163
MediumOrchid2 207 Magenta6 164
MediumOrchid3 133 Magenta2 165
MediumPurple 104 DarkOrange3 166
MediumPurple1 141 IndianRed1 167
MediumPurple2 135 HotPink4 168
MediumPurple3 140 HotPink2 169
MediumPurple4 97 Orchid 170
MediumPurple5 98 MediumOrchid1 171
MediumPurple6 60 Orange2 172
MediumSpringGreen 49 LightSalmon3 173
MediumTurquoise 80 LightPink2 174
MediumVioletRed 126 Pink3 175
MistyRose1 224 Plum3 176
MistyRose3 181 Violet 177
NavajoWhite1 223 Gold3 178
NavajoWhite3 144 LightGoldenrod3 179
name ↓ byte name byte ↓
Navy 4 Tan 180
NavyBlue 17 MistyRose3 181
Olive 3 Thistle3 182
Orange1 214 Plum2 183
Orange2 172 Yellow3 184
Orange3 58 Khaki3 185
Orange4 94 LightGoldenrod5 186
OrangeRed1 202 LightYellow3 187
Orchid 170 Grey84 188
Orchid1 213 LightSteelBlue1 189
Orchid2 212 Yellow2 190
PaleGreen1 121 DarkOliveGreen3 191
PaleGreen2 156 DarkOliveGreen1 192
PaleGreen3 114 DarkSeaGreen2 193
PaleGreen4 77 Honeydew2 194
PaleTurquoise1 159 LightCyan2 195
PaleTurquoise4 66 Red1 196
PaleVioletRed1 211 DeepPink2 197
Pink1 218 DeepPink3 198
Pink3 175 DeepPink1 199
Plum1 219 Magenta3 200
Plum2 183 Magenta1 201
Plum3 176 OrangeRed1 202
Plum4 96 IndianRed3 203
Purple 129 IndianRed2 204
Purple1 5 HotPink 205
Purple2 93 HotPink1 206
Purple3 56 MediumOrchid2 207
Purple4 54 DarkOrange 208
Purple5 55 Salmon1 209
name ↓ byte name byte ↓
Red 9 LightCoral 210
Red1 196 PaleVioletRed1 211
Red2 124 Orchid2 212
Red3 160 Orchid1 213
RosyBrown 138 Orange1 214
RoyalBlue1 63 SandyBrown 215
Salmon1 209 LightSalmon1 216
SandyBrown 215 LightPink1 217
SeaGreen1 84 Pink1 218
SeaGreen2 85 Plum1 219
SeaGreen3 83 Gold1 220
SeaGreen4 78 LightGoldenrod4 221
Silver 7 LightGoldenrod2 222
SkyBlue1 117 NavajoWhite1 223
SkyBlue2 111 MistyRose1 224
SkyBlue3 74 Thistle1 225
SlateBlue1 99 Yellow1 226
SlateBlue2 61 LightGoldenrod1 227
SlateBlue3 62 Khaki1 228
SpringGreen1 48 Wheat1 229
SpringGreen2 42 Cornsilk1 230
SpringGreen3 47 Grey100 231
SpringGreen4 35 Grey3 232
SpringGreen5 41 Grey7 233
SpringGreen6 29 Grey11 234
SteelBlue 67 Grey15 235
SteelBlue1 75 Grey19 236
SteelBlue2 81 Grey23 237
SteelBlue3 68 Grey27 238
Tan 180 Grey30 239
name ↓ byte name byte ↓
Teal 6 Grey35 240
Thistle1 225 Grey39 241
Thistle3 182 Grey42 242
Turquoise2 45 Grey46 243
Turquoise4 30 Grey50 244
Violet 177 Grey54 245
Wheat1 229 Grey58 246
Wheat4 101 Grey62 247
White 15 Grey66 248
Yellow 11 Grey70 249
Yellow1 226 Grey74 250
Yellow2 190 Grey78 251
Yellow3 184 Grey82 252
Yellow4 100 Grey85 253
Yellow5 106 Grey89 254
Yellow6 148 Grey93 255

meli(1), meli.conf(5)

Copyright 2017–2024 Manos Pitsidianakis <[email protected]>

Released under the GPL, version 3 or greater. This software carries no warranty of any kind. (See COPYING for full copyright and warranty notices.)

March 10, 2024 rendered by mandoc

meli(7)

MELI(7) Miscellaneous Information Manual MELI(7)

meliTutorial for the meli terminal e-mail client

meli [...]

TABLE OF CONTENTS

meli is a terminal mail client aiming for extensive and user-friendly configurability.

     ^^      .-=-=-=-.  ^^
 ^^        (`-=-=-=-=-`)         ^^
         (`-=-=-=-=-=-=-`)  ^^         ^^
   ^^   (`-=-=-=-=-=-=-=-`)   ^^
       ( `-=-=-=-(@)-=-=-` )      ^^
       (`-=-=-=-=-=-=-=-=-`)  ^^
       (`-=-=-=-=-=-=-=-=-`)          ^^
       (`-=-=-=-=-=-=-=-=-`)
^^     (`-=-=-=-=-=-=-=-=-`)  ^^
   ^^   (`-=-=-=-=-=-=-=-`)          ^^
         (`-=-=-=-=-=-=-`)  ^^
  ^^       (`-=-=-=-=-`)
            `-=-=-=-=-`          ^^

To quit meli press q (shortcuts.general.) at any time. When launched for the first time, meli will search for its configuration directory, $XDG_CONFIG_HOME/meli/. If it doesn't exist, you will be asked if you want to create one and presented with a sample configuration file ($XDG_CONFIG_HOME/meli/config.toml) that includes the basic settings required for setting up accounts allowing you to copy and edit right away. See meli.conf(5) for the available configuration options.

At any time, you may press ? (shortcuts.general.toggle_help) for a searchable list of all available actions and shortcuts, along with every possible setting and command that your version supports.

Each time a shortcut is mentioned in this document, you will find a parenthesis next to it with the name of the shortcut setting along with its section in the configuration settings so that you can modify it if you wish.

For example, to set the toggle_help shortcut mentioned in the previous paragraph, add the following to your configuration:

[shortcuts]
general.toggle_help = 'F1'

Or alternatively:

[shortcuts.general]
toggle_help = 'F1'

To go to the next tab on the right, press T (shortcuts.general.).

You will be interacting with meli in four primary ways:

1. keyboard shortcuts in NORMAL mode.
2. commands with arguments in COMMAND mode.
3. regular text input in text input widgets in mode.
4. any kind of input that gets passed directly into an embedded terminal in mode.

meli is a modal application, just like vi(1). This means that pressing the same keys in different modes would yield different results. This allows you to separate how the input is interpreted without the need to focus your input with a mouse.

NORMAL
This is the default mode of meli. All keyboard shortcuts work in this mode.
COMMAND
Commands are issued in COMMAND mode, by default started with : (shortcuts.general.) and exited with Esc key.
EMBED
This is the mode of the embed terminal emulator. To exit an embedded application, issue Ctrl-C to kill it or Ctrl-Z to stop the program and follow the instructions on meli to exit.
INSERT
This mode is entered when pressing Enter on a cursor selected text input field, and it captures all input as text input. It is exited with the Esc key.

By pressing ? (shortcuts.general.toggle_help) at any time, the shortcuts popup display status gets toggled. You can find all valid shortcuts for the current UI state you are in.

┌─shortcuts──Press ? to close────────────────────────────────┐
│                                                           ▀│
│  use COMMAND "search" to find shortcuts                   █│
│  Use Up, Down, Left, Right to scroll.                     █│
│                                                           █│
│  pager                                                    █│
│                                                           █│
│       PageDown  page_down                                 █│
│         PageUp  page_up                                    │
│              j  scroll_down                                │
│              k  scroll_up                                  │
│                                                            │
│  view mail                                                 │
│                                                            │
│              c  add_addresses_to_contacts                  │
│              e  edit                                       │
│              u  toggle_url_mode                            │
│              a  open_attachment                            │
│              m  open_mailcap                               │
│              R  reply                                      │
│            C-r  reply_to_author                            │
│            C-g  reply_to_all                               │
│            C-f  forward                                    │
│            M-r  view_raw_source                            │
│              h  toggle_expand_headers                     ▄│
└────────────────────────────────────────────────────────────┘

 ┌───────────────────────┐
 ├────┼──────────────────┤
 │___ │  ___________     │
 │ _  │ _______________  │
 │ _  │__________________│
 │ _  │      ___________ │
 │    │  _____           │
 │    │                  │
 └────┴──────────────────┘
The main view's layout.

This is the view you will spend more time with in meli.

Press ` (shortcuts.listing.) to toggle the sidebars visibility.

Press Left (shortcuts.listing.) to switch focus on the sidebar menu. Press Right (shortcuts.listing.) to switch focus on the e-mail list.

On the e-mail list, press k (shortcuts.listing.scroll_up) to scroll up, and j (shortcuts.listing.scroll_down) to scroll down. Press Enter (shortcuts.listing.open_entry) to open an e-mail entry and i (shortcuts.listing.exit_entry) to exit it.

The sidebar.
┌─────────────┉┉┉┉┉✂
│ mail▐  contact li✂
│personal account  ✂
│ 0  INBOX         ✂
│ 1   ┣━Sent       ✂
│ 2   ┣━Lists      ✂
│ 3   ┃ ┣━meli-dev ✂
│ 4   ┃ ┗━meli     ✂
│ 5   ┣━Drafts     ✂
│ 6   ┣━Trash      ✂
│ 7   ┗━foobar     ✂
┇ 8  Trash         ✂
 ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂ ✂

Press k (shortcuts.listing.scroll_up) to scroll up, and j (shortcuts.listing.scroll_down) to scroll down.

Press Enter (shortcuts.listing.) to open an entry (either a mailbox or an account name). Entering an account name will show you a page with details about the account and its network connection, depending on the backend.

While focused in the sidebar, you can “collapse” a mailbox tree, if it has children, and you can open it with Space (shortcuts.listing.). You can have mailbox trees collapsed on startup by default by setting a mailbox's collapsed setting to . See meli.conf(5) section MAILBOXES for details.

You can increase the sidebar's width with Ctrl-p (shortcuts.listing.) and decrease with Ctrl-o (shortcuts.listing.).

The status bar.
┌────────────────────────────────────────────────────┈┈
│NORMAL | Mailbox: Inbox, Messages: 25772, New: 3006
└────────────────────────────────────────────────────┈┈

The status bar shows which mode you are, and the status message of the current view. In the pictured example, it shows the status of a mailbox called “Inbox” with lots of e-mails.

The number modifier buffer.
 ┈┈────────────┐
            12 │
 ┈┈────────────┘

Some commands may accept a number modifier. For example, scroll down commands can receive a multiplier n to scroll down n entries. Another use of the number buffer is opening URLs inside the pager. See PAGER for an explanation of interacting with URLs in e-mails.

Pressing numbers in NORMAL mode will populate this buffer. To erase it, press the Esc key.

There are four different list styles:

  • "plain" which shows one line per e-mail.
  • "threaded" which shows a threaded view with drawn tree structure.
  • "compact" which shows one line per thread which can include multiple e-mails.
  • "conversations" which shows more than one line per thread which can include multiple e-mails with more details about the thread.
│42     Fri, 02 Sep 2022 19:51  xxxxxxxxxxxxx <  [PATCH 3/8] │
│43     Fri, 02 Sep 2022 19:51  xxxxxxxxxxxxx <  [PATCH 2/8] │
│44     Fri, 02 Sep 2022 19:51  xxxxxxxxxxxxx <  [PATCH 1/8] │
|45     Fri, 02 Sep 2022 19:51  xxxxxxxxxxxxx <  [PATCH 0/8] |
│46     Fri, 02 Sep 2022 18:18  xxxxxxxx <xxxxx  Re: [PATCH 3│
│12     9 hours ago            xxxxxxxxxxxxxxx    [PATCH v3 0│
│13     9 hours ago            xxxxxxxxxxxxxxx     ├─>[PATCH │
│14     9 hours ago            xxxxxxxxxxxxxxx     ├─>[PATCH │
|15     9 hours ago            xxxxxxxxxxxxxxx     ├─>[PATCH |
│16     9 hours ago            xxxxxxxxxxxxxxx     ├─>[PATCH │
│17     9 hours ago            xxxxxxxxxxxxxxx     └─>[PATCH │
│18     2022-08-23 01:23:51    xxxxxxxxxxxxxxx    [RFC v4 00/│
│19     2022-08-23 01:23:52    xxxxxxxxxxxxxxx     ├─>[RFC v4│
|20     2022-08-30 10:30:16    xxxxxxxxxxxxxxx     │ └─>     |
│21     6 days ago             xxxxxxxxxxxxxxx     │   └─>   │
│22     2022-08-23 01:23:53    xxxxxxxxxxxxxxx     ├─>[RFC v4│
│18  2022-…:38  xxxxxxxxxxxxxxx  [PATCH v3 3/3] u…_l() (2)   │
|19  2022-…:49  xxxxxxxxxxxxxxx  [PATCH v8 0/7] A…e (3)      |
│20  2022-…:10  xxxxxxxxxxxxxxx  [PATCH v8 2/7] f…s (2)      │
│21  2022-…:38  xxxxxxxxxxxxxxx  [PATCH v8 3/7] b…s (2)      │
│22  2022-…:53  xxxxxxxxxxxxxxx  [PATCH v6 00/10] p…g (31)   │
│[PATCH v2] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (5)  │
|1 day ago▁▁▁▁xxxxxxxxxxxxx <xxxxxxxxxxxxx@xxxxxxxxxx>, xxxxx│
│                                                            |
│[PATCH v2 0/8] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx│
│1 day ago▁▁▁▁xxxxxxxxxxxxxxx <xxxxxxxxxx@xxxxxxxxxxxxxx>, xx│
|                                                            │
│[PATCH 0/2] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (4)    |
│2 days ago▁▁▁▁xxxxxxxxxxxxxxxx <xxxxxxxx@xxxxxxxxxxx>, xxxxx│
│                                                            │
│[PATCH 0/8] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (12)  │
│2 days ago▁▁▁▁xxxxxxxxxxxxx <xxxxxxxx@xxxxxxxxxx>, xxxxxxxxx│

Press V (shortcuts.listing.) to toggle the selection of a single entry. v (shortcuts.listing.) can be prefixed by a number modifier and affixed by a scrolling motion (up or down) to select multiple entries. Simple set operations can be performed on a selection with these shortcut modifiers:

To set an entry as "read" , use the n (shortcuts.listing.) shortcut. To set an entry as "unread" , use the command

set unseen

which also has its complement

set seen

action.

For e-mail backends that support flags you can use the following commands on entries and selections to modify them:

flag set FLAG
flag unset FLAG

For e-mail backends that support tags (like "IMAP" or "notmuch") you can use the following commands on entries and selections to modify them:

tag add TAG
tag remove TAG

(see meli.conf(5) TAGS, settings colors and ignore_tags for how to set tag colors and tag visibility) You can clear the selection with the Esc key.

You can open an e-mail entry by pressing Enter (shortcuts.listing.open_entry). This brings up the e-mail view with the e-mail content inside a pager.

┌────────────────────────────────────────────────────────────┐
│Date: Sat, 21 May 2022 16:16:11 +0300                      ▀│
│From: Narrator <[email protected]>                      █│
│To: Stanley <[email protected]>                              █│
│Subject: The e-mail ending                                 █│
│Message-ID: <[email protected]>                      █│
│                                                           █│
│The story, and the choices, or what have you, and therefore█│
│by becoming it is! So on and so forth, until inevitably, we │
│all until the end of time. At which time, everything all at │
│once, so now you see? Blah, blah, blah, rah, rah, rah...    │
│We've eaten too much and it can't be just yet. No, no!      │
│Until two-hundred and forty-five! But the logic of          │
│elimination, working backwards, the deduction therefore     │
│becomes impossible to manufacture. It went on for nearly    │
│ten thousand years, until just yesterday. Here and there,   │
│forward and back, and never a moment before lunchtime. It   │
│can't be! It's the only thing there is! How many billions   │
│left until so much more than forever ago! Which is why I    │
│say:                                                        │
│                                                            │
│The story, and the choices, or what have you, and therefore │
│by becoming it is! So on and so forth, until inevitably, we▄│
└────────────────────────────────────────────────────────────┘
The pager displaying an e-mail.

The pager is simple to use. Scroll with the following:

Go to next pager page
PageDown (shortcuts.pager.)
Go to previous pager page
PageUp (shortcuts.pager.)
Scroll down pager.
j (shortcuts.pager.scroll_down)
Scroll up pager.
k (shortcuts.pager.scroll_up)

All scrolling shortcuts can be prefixed with a number modifier which will act as a multiplier.

The pager can enter a special mode which will prefix all detected hyperlinks and e-mail addresses with a number inside square brackets u (shortcuts.pager.). Writing down a chosen number as a number modifier and pressing g (shortcuts.envelope_view.) will attempt to open the link with the system's default open command (xdg-open(1) in supported OSes, and open(1) on MacOS). To override with a custom launcher, see "pager" configuration setting "url_launcher" (see meli.conf(5) PAGER for more details).

Other things you can do when viewing e-mail:

  • Most importantly, you can exit the mail view with: i (shortcuts.listing.exit_entry)
  • Add addresses from the e-mail headers to contacts: c (shortcuts.envelope_view.)
  • Open an attachment by entering its index as a number modifier and pressing: a (shortcuts.envelope_view.)
  • Open an attachment by its mailcap(4) entry by entering its index as a number modifier and pressing: m (shortcuts.envelope_view.)
  • Reply to envelope: R (shortcuts.envelope_view.reply)
  • Reply to author: Ctrl-r (shortcuts.envelope_view.reply_to_author)
  • Reply to all/Reply to list/Follow up: Ctrl-g (shortcuts.envelope_view.reply_to_all)
  • Forward e-mail: Ctrl-f (shortcuts.envelope_view.)
  • Expand extra headers: (References and others) h (shortcuts.envelope_view.)
  • View envelope source in a pager: (toggles between raw and decoded source) M-r (shortcuts.envelope_view.)
  • Return to envelope_view if viewing raw source or attachment: r (shortcuts.envelope_view.)

To compose an e-mail, you can either start with an empty draft by pressing m (shortcuts.listing.) which opens a composer view in a new tab. To reply to a specific e-mail, when in envelope view you can select the specific action you want to take:

  • Reply to envelope. R (shortcuts.envelope_view.reply)
  • Reply to author. Ctrl-r (shortcuts.envelope_view.reply_to_author)
  • Reply to all. Ctrl-g (shortcuts.envelope_view.reply_to_all)

To launch your editor, press e (shortcuts.composing.edit). To send your draft, press s (shortcuts.composing.). To save the draft without submission, enter the command

close

and select "save as draft". You can return to the draft by going to your "Drafts" mailbox and selecting e (shortcuts.envelope_view.edit).

┌────────────────────────────────────────────────────────────┐
│ mail▐  contact list  ▐  composing  ▍███████████████████████│
│          COMPOSING MESSAGE                                 │
│          Date     Mon, 05 Sep 2022 17:49:19 +0300          │
│          From     myself <[email protected]>░░░░          │
│          To       friend <[email protected]>░░          │
│          Cc       ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░          │
│          Bcc      ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░          │
│          Subject  This is my subject!░░░░░░░░░░░░          │
│                                                            │
│          no attachments                                    │
│          ☐ don't sign                                      │
│          ☐ don't encrypt                                   │
│                                                            │
│          Hello friend!░░░░░░░░░░░░░░░░░░░░░░░░░░░░         │
│          ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░         │
│          ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░         │
│                                                            │
│NORMAL | Mailbox: Inbox, Messages: 25772, New: 3006         │
└────────────────────────────────────────────────────────────┘
The lightly highlighted cells represent text input fields.

If you enable the embed terminal option, you can launch your terminal editor of choice when you press edit.

┌────────────────────────────────────────────────────────────┐
│ mail▐  contact list  ▐  composing  ▍███████████████████████│
│   ╓COMPOSING MESSAGE┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╖   │
│   ║ p/v/f/h/5/T/m/07f56b6e-ec09-49d9-b8d8-f0c5a81e7826 ║   │
│   ║  7 Date: Mon, 05 Sep 2022 18:43:10 +0300           ║   │
│   ║  6 From: Mister Cardholder <[email protected]>  ║   │
│   ║  5 To:                                             ║   │
│   ║  4 Cc:                                             ║   │
│   ║  3 Bcc:                                            ║   │
│   ║  2 Subject:                                        ║   │
│   ║  1 User-Agent: meli 0.7.2                          ║   │
│   ║8 █                                                 ║   │
│   ║~                                                   ║   │
│   ║~                                                   ║   │
│   ║~                                                   ║   │
│   ║~                                                   ║   │
│   ║ N…  <6e-ec09-49d9-b8d8-f0c5a81e7826   100% ㏑:8 ℅:1║   │
│   ╚════════════════════════════════════════════════════╝   │
│                                                            │
│                                                            │
│ ☐ don't sign                                               │
│ ☐ don't encrypt                                            │
│ no attachments                                             │
│                                                            │
│EMBED | Mailbox: Inbox, Messages: 25772, New: 3006          │
└────────────────────────────────────────────────────────────┘
nvim(1) running inside the composing tab.
The double line border annotates the area of the embedded terminal, the actual embedding is seamless.

PATH
in composer, add PATH as an attachment
CMD ARGS
in composer, pipe CMD ARGS output into an attachment
Launch command defined in the configuration value file_picker_command in meli.conf(5) TERMINAL
CMD ARGS
Launch command CMD ARGS. The command should print file paths in stdout, separated by NUL bytes. Example usage with fzf:
add-attachment-file-picker < fzf --print0
INDEX
remove attachment with given index
toggle between signing and not signing this message. If the gpg invocation fails then the mail won't be sent. See meli.conf(5) PGP for PGP configuration.
saves a copy of the draft in the Draft folder

See meli-themes(5) for documentation on how to theme meli.

meli(1), meli.conf(5), meli-themes(5), xdg-open(1), mailcap(5)

Copyright 2017–2024 Manos Pitsidianakis <[email protected]>

Released under the GPL, version 3 or greater. This software carries no warranty of any kind. (See COPYING for full copyright and warranty notices.)

March 10, 2024 rendered by mandoc

[go back]