User Tools

Site Tools


Terminal Email with Mutt

Mutt is a terminal and CLI email client for sending, receiving, and reading email. It uses vim-like keybindings and has minimal requirements. If you want to use a GUI email client, try Thunderbird. You might also be interested in Neomutt.


Let's look at how to obtain, install, and configure Mutt for use.


You can download Mutt from as a pre-built binary or as source code. Many Linux distributions will have a package for it already.

Install with package manager on Debian

sudo apt install mutt

Build from source

Here are the steps to build from source. You can download the sources from

tar xzf mutt-2.0.6.tar.gz
cd mutt-2.0.6
./configure --help | less  # First check all options
# Include any desired options
./configure --enable-smtp --enable-imap --with-ssl --enable-compressed \
  --enable-sidebar --enable-autocrypt --with-sqlite3 --with-zlib --with-sasl
# The executable you need is now at `./mutt`.
sudo make install  # Optional

NOTE: If you're trying to build in MacOS and it says it can't find SSL, run:

brew install openssl
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"
# Then run ./configure with the options.

To see what flags were used when mutt was built, run mutt -v and look for Configure options:

# See what build options mutt used
mutt -v


Use the ~/.muttrc file to configure things like:

  • Your name and from address
  • Credentials for sending with SMTP and receiving with IMAP
  • Which editor to use when composing

For a list of all options, try running man muttrc.

You can also set any of these values while you're already inside Mutt by running the commands like:

:set sort=reverse-last-date-received

Here is an example $HOME/.muttrc file.

# ~/.muttrc

# Identity
set from = ""
set realname = "John Doe"

# Sending mail with SMTPS
# TLS is  `smtps://` and port 465
# non-TLS `smtp://`  and port 25 or 587
set smtp_url = "smtps://"
set smtp_pass = "password"

# Receiving mail with IMAPS
# TLS is  `imaps://` with port 993
# non-TLS `imap://`  with port 143
# Omit password, and it will prompt you
set imap_user = ""
set imap_pass = "password"
set folder = "imaps://"
set spoolfile = "+INBOX"
# Automatically fetch mailbox folders from server
set imap_check_subscribed = yes

# Turn on sidebar showing folders
set sidebar_visible = yes

# Set editor when composing
set editor = "vim"

# Sorting
# Default sort will put oldest emails at top `last-date-received`
# Use `reverse-last-date-received` to have newest messages at top
set sort = reverse-last-date-received
# or try `set sort = threads`

# Colors (general)
color normal     white         default
color status     cyan          default
color indicator  brightcyan    default
color tree       magenta       default
color error      brightred     default
color message    brightmagenta default
# Color headers
color header     brightyellow  default "^from:"
color header     yellow        default "^to:"
color header     yellow        default "^cc:"
color header     blue          default "^date:"
color header     brightblue    default "^subject:"
# Color bodies
color attachment brightblack   default
color search     red           brightblack
color signature  cyan          default
color tilde      blue          default
# Color URLs
color body       brightblue    default "(^|<| )mailto:[^ ]+@[^ ]( |>|$)"
color body       brightblue    default "(^|<| )(http|https|ftp)://[^ ]+( |>|$)"
# Quoted emails
color quoted     magenta       default
color quoted1    cyan          default
color quoted2    green         default
color quoted3    magenta       default
color quoted4    cyan          default
color quoted5    green         default
color quoted6    magenta       default
color quoted7    cyan          default


To get more information, try the man page, the '–help' option, and going into mutt and pressing the ? key.

man mutt
man muttrc
mutt --help
mutt # Go into mutt and press ?

Send email

You can compose an email message directly from CLI or from within Mutt.

To send email from within Mutt, simply press m and it will begin composing a new mail. If you had any postponed mails (drafts) it will ask if you want to load those or start a new one.

To send email via the CLI, invoke mutt like this:

# Email nanodano
mutt -s "Test Email"
# Attach file with `-a`
mutt -s "Test Attachment" -a

Reading email

Assuming your ~/.muttrc is configured with the proper IMAP server and credentials, all you have to do is open mutt and it will automatically connect and pull your mail. When you open mutt you'll be presented the list of emails. Use the vim keybinds to get around.

There are some letters that show up next to emails that represent different things like:

  • No letter means the email has been read
  • O means the email has not been opened
  • r means the email has been replied to
  • D means the email is marked for deletion


  • ? to get help and a list of keybinds
  • q to quit
  • j and k or up and down to move through the list of emails
  • right and left arrow keys will page down and up
  • space or enter to read the selected email from the list
  • q or i to stop reading an email and go back to the list of emails
  • r to reply
  • d to mark for deletion
  • / to open the search form; n to keep finding next occurrences

To change sort order interactively, use :set sort=last-date-received or :set sort=reverse-last-date-received.

Check other folders

To check other folders besides your basic inbox, you can manually set the mailbox names in .muttrc or you can have it automatically fetch all folders from the IMAP server. You can also show the sidebar to see what folder you're currently looking in.

# In your ~/.muttrc
# To automatically fetch folders from IMAP server
set imap_check_subscribed = yes
# To manually set folders
mailboxes =INBOX =INBOX.Sent =Inbox.Trash
# It's also useful to show the sidebar
set sidebar_visible = yes

To change what folder you're looking in, press the y key.

Check multiple email accounts

One way to do this is have separate .muttrc files for different accounts, and then specify the the rc file to use at runtime:

mutt -F ~/.muttrc.account2

If you want to include a generic rc file within your account specific file, use source to load the other scripts source. For example:

# ~/.muttrc.account2
# Load generic colors/preferences
source ~/.muttrc
### Account specific settings ###
set from = ""
set realname = "John Doe"
set smtp_url = "smtps://"
set smtp_pass = "password"
# Omit password, and it will prompt you
set imap_user = ""
set imap_pass = "password"
set folder = "imaps://"
set spoolfile = "+INBOX"

I read that there is a way to map a key-bind to toggle switching between mailboxes like this but I'm not sure how. Press ? in mutt to pull up the commands. Probably something like “load rc file” followed by “sync mailbox imap”.

You can also use the Dialog tool. Refer to the page: Dialog - Terminal Menu Creator, but here is a simple example:
# Present a list of accounts to choose from
exec 3>&1
# Go back to the menu after quitting mutt
while [ $exit_code -eq 0 ]
  # Generate a menu of accounts
  choice=$(dialog --menu "Open mail" 40 40 40 \
           "~/.muttrc.1" "Account 1" \
           "~/.muttrc.2" "Account 2" \
           2>&1 1>&3)
  if [ $exit_code -eq 0 ]
    mutt -F "$choice"
exec 3>&-

Use PGP encryption

Incomplete. To Do.

terminal/mutt.txt · Last modified: 2021/05/19 00:24 by nanodano