Neomutt and mutt are renowned command-line clients, also referred to as Mail User Agents (MUA). They allow users to send and receive emails directly from the terminal. While traditional local mail is efficiently managed by these tools, with some configuration, they can also handle IMAP (and POP3). In the past, I used tools like elm and pine, which had relatively simple user interfaces; mutt and neomutt continue in that tradition. My preference for neomutt over mutt is primarily due to its superior IMAP handling. That said, I haven’t explored all the alternatives, so there might be better MUAs available. Feedback is welcome. This guide outlines the challenges faced when setting up basic mail functionalities in neomutt or mutt—functionalities that are typically available out-of-the-box in graphical interfaces.
Surprisingly, renaming one’s IMAP folder in the sidebar to something other than INBOX can be quite challenging. With older versions of mutt, it might even be impossible.
Autocrypt requires sqlite3 as dependency. While the configuration (./configure) works on Debian 9.13 Stretch and 10 Bullseye, the compilation with --autocrypt will stop for Debian 9.13 Stretch with an error.
autocrypt/db.c:272:9: warning: implicit declaration of function
‘sqlite3_prepare_v3’ [-Wimplicit-function-declaration]
if (sqlite3_prepare_v3(AutocryptDB,
^~~~~~~~~~~~~~~~~~
autocrypt/db.c:281:32: error: ‘SQLITE_PREPARE_PERSISTENT’ undeclared (first use
in this function)
-1, SQLITE_PREPARE_PERSISTENT, &AccountGetStmt,
NULL) != SQLITE_OK)
To successfully compile neomutt on Debian 9.13 Stretch, exclude the --autocrypt and --sqlite options from the ./configure command.
To use nls, you need gettext. If it’s not required, you can disable it with the --disable-nls flag.
aptitude install gettext
To utilize the ncurses user interface, the associated development library must be installed.
aptitude install libncurses-dev
The stringprep.h file requires the libidn11-dev package.
aptitude install libidn11-dev
aptitude install libgpgme11-dev
aptitude install libsasl2-dev
aptitude install libkrb5-dev
Autocrypt requires sqlite
aptitude install libsqlite3-dev
aptitude install gnutls-dev
aptitude install notmuch notmuch-mutt libnotmuch-dev
While older version of neomutt (around 2016) had the configure option --hcache and this option actually shows up in neomutt -v it seems to be that the configure script do not want to know this option any more. However hcache will be used if a back-end is configured. Not all have been tested.
Header compression: (not tested)
For the Berkeley Database (current 5.3) probably do
aptitude install libdb-dev
However, it’s not been tested. The tested backend was lmdb, which performed without issues.
aptitude install liblmdb-dev
Building neomutt follows the conventional process for C programs: configure, make, and make install. Optional targets (goals) include neomutt and test. The compilation is both quick and reliable.
mkdir -p /srv/build
mkdir -p /srv/src
cd /srv/src
export V=20220429
export URL=https://github.com/neomutt/neomutt/archive/refs/tags/$V.tar.gz
wget -O neomutt-$V.tar.gz $URL
cd /srv/build
tar xvzf ../src/neomutt-$V.tar.gz
cd neomutt-$v
./configure --disable-doc --prefix=/srv/neomutt-20220429
Minimal Debian 9.13 Stretch configuration
Summary of build options:
Version: 20220429
Host OS: linux-gnu
Install prefix: /srv/neomutt-20220429
Compiler: cc
CFlags: -g -O2 -std=c99 -D_ALL_SOURCE=1 -D_GNU_SOURCE=1 \
-D__EXTENSIONS__ -DNCURSES_WIDECHAR \
-I/srv/neomutt-20220429/include
LDFlags: -L/srv/neomutt-20220429/lib
Libs: -lidn -lncursesw -ltinfo -lanl
GPGME: no
PGP: yes
SMIME: yes
Notmuch: no
Header Cache(s):
Header Compression(s):
Lua: no
Minimal Debian 11 Bullseye configuration_
Summary of build options:
Version: 20220429
Host OS: linux-gnu
Install prefix: /srv/neomutt-20220429
Compiler: cc
CFlags: -g -O2 -std=c99 -D_ALL_SOURCE=1 -D_GNU_SOURCE=1 \
-D__EXTENSIONS__ -DNCURSES_WIDECHAR \
-I/srv/neomutt-20220429/include
LDFlags: -L/srv/neomutt-20220429/lib
Libs: -lidn -lncursesw -ltinfo -lanl
GPGME: no
PGP: yes
SMIME: yes
Notmuch: no
Header Cache(s):
Header Compression(s):
Lua: no
Certain features need to be specified via ./configure to be able to use them later. In case you would like to create a neomutt configuration similar to an installed version, you can use neomutt -v to show the used ./configure options. Some options like sidebar are already enabled as default options.
The following ./configure option have been used for Debian.
Stretch Buster Bullseye Remark
9.13 10 11
--autocypt no yes Enable AutoCrypt support (requires GPGME)
--gnutls yes yes Enable TLS support using GnuTLS
--gpgme yes yes Enable GPGME support
--gss yes yes Use GSSAPI authentication for IMAP
--lmdb yes yes Use LMDB for the header cache
--pgp yes yes PGP support
--prefix yes yes Install path
--sasl yes yes Use the SASL network security library
--smime yes yes SMIME support
--sqlite no yes Enable SQLite support
--mixmaster yes yes Enable Mixmaster support
--notmuch yes yes Enable Notmuch support
./configure --disable-doc --prefix=/srv/neomutt-20220429 --autocrypt --gnutls\
--gpgme --gss --pgp --sasl --smime --sqlite --lmdb --mixmaster --notmuch\
--disable-maintainer-mode
When comparing the above configurations to the Debian 11 Bullseye neomutt ./configure options, it’s evident that selecting the right options for neomutt is not straightforward. Kudos to the Debian 11 Bullseye team for their configuration choices.
--build=x86_64-linux-gnu --prefix=/usr {--includedir=${prefix}/include}\
{--mandir=${prefix}/share/man} {--infodir=${prefix}/share/info}\
--sysconfdir=/etc --localstatedir=/var --disable-option-checking\
--disable-silent-rules {--libdir=${prefix}/lib/x86_64-linux-gnu}\
{--libexecdir=${prefix}/lib/x86_64-linux-gnu}\
--disable-maintainer-mode --disable-dependency-tracking\
--mandir=/usr/share/man --libexecdir=/usr/libexec --with-mailpath=/var/mail\
--gpgme --lua --notmuch --with-ui --gnutls --gss --idn --mixmaster --sasl\
--tokyocabinet --sqlite --autocrypt
This are the summaries for the less complex configuration for Debian 9.13 Stretch.
Summary of build options:
Version: 20220429
Host OS: linux-gnu
Install prefix: /srv/neomutt-20220429
Compiler: cc
CFlags: -g -O2 -std=c99 -D_ALL_SOURCE=1 -D_GNU_SOURCE=1
-D__EXTENSIONS__ -I/srv/neomutt-20220429/include
-DNCURSES_WIDECHAR -isystem /usr/include/mit-krb5
LDFlags: -L/srv/neomutt-20220429/lib
-L/usr/lib/x86_64-linux-gnu/mit-krb5 -Wl,-z,relro
-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err
Libs: -lidn -lgnutls -lncursesw -ltinfo -lsqlite3 -lsasl2
-lgpgme -lanl -L/usr/lib/x86_64-linux-gnu -lgpgme
-lassuan -lgpg-error -L/usr/lib/x86_64-linux-gnu
-lgpg-error
GPGME: yes
PGP: yes
SMIME: yes
Notmuch: no
Header Cache(s):
Header Compression(s):
Lua: no
Debian 11 Bullseye
Summary of build options:
Version: 20220429
Host OS: linux-gnu
Install prefix: /srv/neomutt-20220429
Compiler: cc
CFlags: -g -O2 -std=c99 -D_ALL_SOURCE=1 -D_GNU_SOURCE=1
-D__EXTENSIONS__ -I/srv/neomutt-20220429/include
-DNCURSES_WIDECHAR -isystem /usr/include/mit-krb5
LDFlags: -L/srv/neomutt-20220429/lib
-L/usr/lib/x86_64-linux-gnu/mit-krb5 -Wl,-z,relro
-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err
Libs: -llmdb -lidn -lgnutls -lncursesw -ltinfo -lsqlite3
-lsasl2 -lgpgme -lanl -L/usr/lib/x86_64-linux-gnu
-lgpgme -lassuan -lgpg-error
-L/usr/lib/x86_64-linux-gnu -lgpg-error
GPGME: yes
PGP: yes
SMIME: yes
Notmuch: no
Header Cache(s): lmdb
Header Compression(s):
Lua: no
As is standard, the make install command transfers files to the specified --prefix location. For Debian 9.13 Stretch and 11 Bullseye, a minimal configuration will copy the following files. Note: internationalization files are excluded from this list.
├── bin
│ └── neomutt
├── etc
│ └── neomuttrc
├── libexec
│ └── neomutt
│ ├── pgpewrap
│ └── smime_keys
└── share
├── doc
│ └── neomutt
│ ├── colorschemes
│ │ ├── neonwolf-256.neomuttrc
│ │ ├── solarized-dark-256.neomuttrc
│ │ ├── vombatidae.neomuttrc
│ │ └── zenburn.neomuttrc
│ ├── hcache-bench
│ │ ├── neomutt-hcache-bench.sh
│ │ ├── neomuttrc
│ │ └── README.md
│ ├── keybase
│ │ ├── attachmentView.png
│ │ ├── decrypt.sh
│ │ ├── install.sh
│ │ ├── keybase.py
│ │ ├── LICENSE
│ │ ├── neomuttrc
│ │ ├── pagerMode.png
│ │ ├── pgpdecrypt.sh
│ │ ├── pgpverify.sh
│ │ ├── README.md
│ │ └── verify.sh
│ ├── logo
│ │ ├── neomutt-128.png
│ │ ├── neomutt-256.png
│ │ ├── neomutt-32.png
│ │ ├── neomutt-64.png
│ │ └── neomutt.svg
│ ├── lua
│ │ ├── test_lua-api_runner.neomuttrc
│ │ └── test_lua-api_spec.lua
│ ├── oauth2
│ │ ├── mutt_oauth2.py
│ │ └── mutt_oauth2.py.README
│ ├── samples
│ │ ├── colors.default
│ │ ├── colors.linux
│ │ ├── gpg.rc
│ │ ├── mairix_filter.pl
│ │ ├── markdown2html.py
│ │ ├── Mush.rc
│ │ ├── Pine.rc
│ │ ├── sample.mailcap
│ │ ├── sample.neomuttrc
│ │ ├── sample.neomuttrc-starter
│ │ ├── sample.neomuttrc-tlr
│ │ ├── smime_keys_test.pl
│ │ ├── smime.rc
│ │ └── Tin.rc
│ └── vim-keys
│ ├── README.md
│ └── vim-keys.rc
...
| Version | Date | Notes |
|---|---|---|
| 0.1.1 | 2023-07-27 | Improve style, grammar, release to quick guide |
| 0.1.0 | 2022-07-18 | Initial release |