meli — terminal e-mail client μέλι is the Greek word for honey
Contents
Command
Maillistingcommandssetplain | 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 │
└───────────────┴─────────────────────────────────────────────────┘
sort [subject | date] asc | desc sort mail listing
subsort [subject | date] asc | desc sorts only the first level of replies.
gon where n is a mailbox prefixed with the n number in the side menu
for the current account
togglethread_snooze don't issue notifications for thread under cursor in thread listing
searchSTRING search mailbox with STRING query. Escape exits search results.
selectSTRING select threads matching STRING query.
clear-selection Clear current selection.
setseen | unseen Set seen status of message.
importFILEPATHMAILBOX_PATH Import mail from file into given mailbox.
copyto,movetoMAILBOX_PATH Copy or move to other mailbox.
copyto,movetoACCOUNTMAILBOX_PATH Copy or move to another account's mailbox.
delete Delete selected entries.
export-mboxFILEPATH Export selected threads to mboxcl2 file.
create-mailboxACCOUNTMAILBOX_PATH create mailbox with given path. Be careful with backends and
separator sensitivity (eg IMAP)
subscribe-mailboxACCOUNTMAILBOX_PATH
subscribe to mailbox with given path
unsubscribe-mailboxACCOUNTMAILBOX_PATH
unsubscribe to mailbox with given path
rename-mailboxACCOUNTMAILBOX_PATH_SRCMAILBOX_PATH_DEST
rename mailbox
delete-mailboxACCOUNTMAILBOX_PATH deletes mailbox in the mail backend. This action is irreversible.
MailviewcommandspipeEXECUTABLE [ARGS] pipe pager contents to binary
filterEXECUTABLE [ARGS] filter and display pager contents through command
filter select a filter from pager.named_filters configuration value (See
meli.conf(5) PAGER for its syntax)
list-post post in list of viewed envelope
list-unsubscribe unsubscribe automatically from list of viewed envelope
list-archive open list archive with xdg-openComposingmailcommandsmailtoMAILTO_ADDRESS Opens a composer tab with initial values parsed from the mailto:
address.
add-attachmentPATH in composer, add PATH as an attachment
add-attachment<CMDARGS in composer, pipe CMDARGS output into an attachment
add-attachment-file-picker Launch command defined in the configuration value
file_picker_command in meli.conf(5) TERMINAL
add-attachment-file-picker<CMDARGS
Launch command CMDARGS. The command should print file paths in
stdout, separated by NUL bytes. Example usage with fzf(1):
add-attachment-file-picker < fzf --print0
remove-attachmentINDEX remove attachment with given index
togglesign 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.
save-draft saves a copy of the draft in the Draft folder
Genericcommandsopen-in-tab opens envelope view in new tab
close closes closeable tabs
setenvKEY=VALUE set environment variable KEY to VALUEprintenvKEY print environment variable KEYquit Quits meli.
reload-config Reloads configuration but only if account configuration is
unchanged. Useful if you want to reload some settings without
restarting meli.
Composing
OpeningthemessageComposertab
To create a new mail message, press ⟨m⟩ (shortcuts.listing.new_mail) while viewing a mailbox. To reply
to a mail, press ⟨R⟩ (shortcuts.envelope_view.reply). Both these actions open the mail composer view in
a new tab.
Editingtext- Edit the header fields by selecting with the arrow keys and pressing ⟨Enter⟩
(shortcuts.general.focus_in_text_field) to enter INSERT mode and Esc key to exit.
- At any time you may press ⟨e⟩ (shortcuts.composing.edit) 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 true 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
Attachments may be handled with the add-attachment, remove-attachment commands (see below).
Sending
Finally, pressing ⟨s⟩ (shortcuts.composing.send_mail) will send your message according to your settings
(see meli.conf(5) COMPOSING, 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 tmp directory instead and you will be notified of its location.
Drafts
To save your draft without sending it, issue COMMANDclose and select 'save as draft'.
To open a draft for further editing, select your draft in the mail listing and press edit.
Contacts
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.
Description
meli is a terminal mail client aiming for extensive and user-friendly configurability.
^^ .-=-=-=-. ^^
^^ (`-=-=-=-=-`) ^^
(`-=-=-=-=-=-=-`) ^^ ^^
^^ (`-=-=-=-=-=-=-=-`) ^^
( `-=-=-=-(@)-=-=-` ) ^^
(`-=-=-=-=-=-=-=-=-`) ^^
(`-=-=-=-=-=-=-=-=-`) ^^
(`-=-=-=-=-=-=-=-=-`)
^^ (`-=-=-=-=-=-=-=-=-`) ^^
^^ (`-=-=-=-=-=-=-=-`) ^^
(`-=-=-=-=-=-=-`) ^^
^^ (`-=-=-=-=-`)
`-=-=-=-=-` ^^
Environment
EDITOR Specifies the editor to use
MELI_CONFIG Override the configuration file
NO_COLOR When defined (regardless of its value), prevents the addition of
ANSI color. The configuration value use_color overrides this.
Exit Status
meli exits with 0 on a successful run. Other exit statuses are:
1 catchall for general errors
101 process panic
Files
meli uses the following parts of the XDG standard:
XDG_CONFIG_HOME defaults to ~/.config/
XDG_CACHE_HOME 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/mailcapFlags
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
flagsetFLAG
and
flagunsetFLAGModes
NORMAL is the default mode
COMMAND commands are issued in COMMAND mode, by default started with ⟨:⟩
(shortcuts.general.enter_command_mode) 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.
Name
meli — terminal e-mail client μέλι is the Greek word for honey
Search
Each e-mail storage backend has a default search method assigned. IMAP uses the SEARCH command, notmuch
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: From, To, Cc, Bcc, In-Reply-To, References, Subject and Date. 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:
reindexACCOUNT_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)
alladdresses:mailing@example.com and cc:me@example.com
Boolean operators are or, and and not (alias: !) String keywords with spaces must be quoted. Quotes
should always be escaped.
ImportantNoticeaboutIMAP/JMAP
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.
QUERYABNFSYNTAX-query="("query")" | from | to | cc | bcc | message_id | in_reply_to | references | header |
all_addresses | subject | flags | has_attachment | query"or"query | query"and"query | notquery-not="not" | "!"-has_attachment="has:attachment" | "has:attachments"-quoted=ALPHA/SP*(ALPHA/DIGIT/SP)-term=ALPHA*(ALPHA/DIGIT) | DQUOTEquotedDQUOTE-tagname=term-flagval="passed" | "replied" | "seen" | "read" | "junk" | "trash" | "trashed" | "draft" | "flagged"
| tagname-flagterm=flagval | flagval","flagterm-flags="flag:"flag | "flags:"flag | "tag:"flag | "tags:"flag | "is:"flag-from="from:"term-to="to:"term-cc="cc:"term-bcc="bcc:"term-message_id="message-id:"term | "msg-id:"term-in_reply_to="in-reply-to:"term-references="references:"term-header="header:"field_name","field_value-field_name=term-field_value=term-all_addresses="all-addresses:"term-subject="subject:"termSee Also
meli.conf(5), meli-themes(5), meli(7), xdg-open(1), mailcap(5)
Shortcuts
See meli.conf(5) SHORTCUTS for shortcuts and their default values.
Standards
- Waldo Bastian, Allison Karlitskaya, Lennart Poettering, and Johannes Löthberg, XDGBaseDirectorySpecification, https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html, May 08,
2021, Version 0.8.
- Daniel J. Bernstein, maildir, https://cr.yp.to/proto/maildir.html, 1995.
- Dr. Nathaniel S. Borenstein, RFC1524AUserAgentConfigurationMechanismForMultimediaMailFormatInformation, Legacy, https://datatracker.ietf.org/doc/rfc1524/, September 01, 1993, mailcap file.
- Keith Moore, RFC2047MIME(MultipurposeInternetMailExtensions)PartThree:MessageHeaderExtensionsforNon-ASCIIText, IETF, https://datatracker.ietf.org/doc/rfc2047/, November 01, 1996.
- Rens Troost, Steve Dorner, and Keith Moore, RFC2183CommunicatingPresentationInformationinInternetMessages:TheContent-DispositionHeaderField, Legacy,
https://datatracker.ietf.org/doc/rfc2183/, August 01, 1997.
- Joshua D. Baer and Grant Neufeld, RFC2369TheUseofURLsasMeta-SyntaxforCoreMailListCommandsandtheirTransportthroughMessageHeaderFields, Legacy, https://datatracker.ietf.org/doc/rfc2369/,
July 01, 1998.
- Frank Dawson and Tim Howes, RFC2426vCardMIMEDirectoryProfile, IETF,
https://datatracker.ietf.org/doc/rfc2426/, September 01, 1998, vCard Version 3.
- Tim Showalter, RFC2971IMAP4IDextension, IETF, https://datatracker.ietf.org/doc/rfc2971/, October
01, 2000.
- Thomas Roessler, Michael Elkins, Raph Levien, and Dave Del Torto, RFC3156MIMESecuritywithOpenPGP,
IETF, https://datatracker.ietf.org/doc/rfc3156/, August 01, 2001.
- Keith Moore, RFC3461SimpleMailTransferProtocol(SMTP)ServiceExtensionforDeliveryStatusNotifications(DSNs), IETF, https://datatracker.ietf.org/doc/rfc3461/, January 23, 2003.
- Mark Crispin, RFC3501INTERNETMESSAGEACCESSPROTOCOL-VERSION4rev1, IETF,
https://datatracker.ietf.org/doc/rfc3501/, March 18, 2003.
- Randall Gellens, RFC3676TheText/PlainFormatandDelSpParameters, IETF,
https://datatracker.ietf.org/doc/rfc3676/, February 19, 2004.
- Alexey Melnikov, RFC3691InternetMessageAccessProtocol(IMAP)UNSELECTcommand, IETF,
https://datatracker.ietf.org/doc/rfc3691/, February 20, 2004.
- Clive Feather, RFC3977NetworkNewsTransferProtocol(NNTP), IETF,
https://datatracker.ietf.org/doc/rfc3977/, October 26, 2006.
- Kurt Zeilenga, RFC4505AnonymousSimpleAuthenticationandSecurityLayer(SASL)Mechanism, IETF,
https://datatracker.ietf.org/doc/rfc4505/, June 12, 2006.
- Alexey Melnikov, RFC4549SynchronizationOperationsforDisconnectedIMAP4Clients, IETF,
https://datatracker.ietf.org/doc/rfc4549/, June 16, 2006.
- Kurt Zeilenga, RFC4616ThePLAINSimpleAuthenticationandSecurityLayer(SASL)Mechanism, IETF,
https://datatracker.ietf.org/doc/rfc4616/, August 31, 2006.
- Rob Siemborski and Alexey Melnikov, RFC4954SMTPServiceExtensionforAuthentication, IETF,
https://datatracker.ietf.org/doc/rfc4954/, July 23, 2007.
- Dr. John C. Klensin, RFC5321SimpleMailTransferProtocol, IETF,
https://datatracker.ietf.org/doc/rfc5321/, October 01, 2008.
- Pete Resnick, RFC5322InternetMessageFormat, IETF, https://datatracker.ietf.org/doc/rfc5322/,
October 01, 2008.
- Julien ÉLIE, RFC6048NetworkNewsTransferProtocol(NNTP)AdditionstoLISTCommand, IETF,
https://datatracker.ietf.org/doc/rfc6048/, November 22, 2010.
- Dave Crocker, Dr. John C. Klensin, Dr. Marshall T. Rose, and Ned Freed, RFC6152SMTPServiceExtensionfor8-bitMIMETransport, IETF, https://datatracker.ietf.org/doc/rfc6152/, March 07, 2011.
- Simon Perreault, RFC6350vCardFormatSpecification, IETF, https://datatracker.ietf.org/doc/rfc6350/,
August 31, 2011, vCard Version 4.
- Abel Yang, Shawn Steele, and Ned Freed, RFC6532InternationalizedEmailHeaders, IETF,
https://datatracker.ietf.org/doc/rfc6532/, February 17, 2012.
- Cyrus Daboo, RFC6868ParameterValueEncodinginiCalendarandvCard, IETF,
https://datatracker.ietf.org/doc/rfc6868/, February 14, 2013.
- Alexey Melnikov and Dave Cridland, RFC7162IMAPExtensions:QuickFlagChangesResynchronization(CONDSTORE)andQuickMailboxResynchronization(QRESYNC), IETF,
https://datatracker.ietf.org/doc/rfc7162/, May 23, 2014.
- Neil Jenkins and Chris Newman, RFC8620TheJSONMetaApplicationProtocol(JMAP), IETF,
https://datatracker.ietf.org/doc/rfc8620/, July 18, 2019.
- Neil Jenkins and Chris Newman, RFC8621TheJSONMetaApplicationProtocol(JMAP)forMail, IETF,
https://datatracker.ietf.org/doc/rfc8621/, August 08, 2019.
Starting With Meli
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.
The main visual navigation tool, the left-side sidebar may be toggled with ⟨`⟩
(shortcuts.listing.toggle_menu_visibility).
Each mailbox may be viewed in 4 modes:
-Plain views each mail individually,
-Threaded shows their thread relationship visually,
-Conversations collapses each thread of e-mails into a single entry,
-Compact shows one row per thread.
If you're using a light color palette in your terminal, you should set theme=light in the terminal
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.
Synopsis
meli [--help | -h] [--version | -v] [--configpath]
--help | -h
Show help message and exit.
--version | -v
Show version and exit.
--configpath
Start meli with given configuration file.
create-config [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.
test-config [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.
man [page]
Print documentation page and exit (Piping to a pager is recommended).
install-man [path]
Install manual pages to the first location provided by MANPATH or manpath(1), unless you
specify the directory as an argument.
compiled-with
Print compile time feature flags of this binary.
edit-config
Edit configuration files with EDITOR or VISUAL.
help Prints help information or the help of the given subcommand(s).
print-app-directories
Print all directories that meli creates and uses.
print-config-path
Print location of configuration file that will be loaded on normal app startup.
print-default-theme
Print default theme keys and values in TOML syntax, to be used as a blueprint.
print-loaded-themes
Print all loaded themes in TOML syntax.
print-log-path
Print log file location.
view View mail from input file.
Viewing Mail
Open attachments by typing their index in the attachments list and then ⟨a⟩
(shortcuts.envelope_view.open_attachment). meli will attempt to open text inside its pager, and other
content via xdg-open. Press ⟨m⟩ (shortcuts.envelope_view.open_mailcap) 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-attachmentINDEXpath-to-fileINDEX 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-attachmentINDEXbinaryARGS
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.
