.emacs.d/elisp/mu4e/mu4e.info

5824 lines
230 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This is mu4e.info, produced by makeinfo version 6.7 from mu4e.texi.
Copyright © 2012-2020 Dirk-Jan C. Binnema
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
Version 1.3 or any later version published by the Free Software
Foundation; with no Invariant Sections, no Front-Cover Texts, and
no Back-Cover Texts. A copy of the license is included in the
section entitled “GNU Free Documentation License.”
INFO-DIR-SECTION Emacs
START-INFO-DIR-ENTRY
* Mu4e: (Mu4e). An email client for GNU Emacs.
END-INFO-DIR-ENTRY

File: mu4e.info, Node: Top, Next: Introduction, Up: (dir)
mu4e manual
***********
Welcome to mu4e 1.6.1.
mu4e (mu-for-emacs) is an e-mail client for GNU Emacs version 24.4 or
higher, built on top of the mu(1) e-mail search engine. mu4e is
optimized for quickly processing large amounts of e-mail.
Some of its highlights:
• Fully search-based: there are no folders(2), only queries.
• Fully documented, with example configurations
• User-interface optimized for speed, with quick key strokes for
common actions
• Support for non-English languages (so “angstrom” matches
“Ångström”)
• Asynchronous: heavy actions dont block emacs(3)
• Support for cryptography — signing, encrypting and decrypting
• Address auto-completion based on the contacts in your messages
• Extendable with your own snippets of elisp
In this manual, we go through the installation of mu4e, do some basic
configuration and explain its daily use. We also show you how you can
customize mu4e for your special needs.
At the end of the manual, there are some example configurations, to
get you up to speed quickly: *note Example configs::. Theres also a
section with answers to frequently asked questions, *note FAQ::.
* Menu:
* Introduction:: Where to begin
* Getting started:: Setting things up
* Main view:: The mu4e overview
* Headers view:: Lists of message headers
* Message view:: Viewing specific messages
* Editor view:: Creating and editing messages
* Searching:: Some more background on searching/queries
* Marking:: Marking messages and performing actions
* Contexts:: Defining contexts and switching between them
* Dynamic folders:: Folders that change based on circumstances
* Actions:: Defining and using custom actions
* Extending mu4e:: Writing code for mu4e
Appendices
* Old message view:: The old way to view messages
* Other tools:: mu4e and the rest of the world
* Example configs:: Some examples to set you up quickly
* FAQ:: Common questions and answers
* Tips and Tricks:: Useful tips
* How it works:: Some notes about the implementation of mu4e
* Debugging:: How to debug problems in mu4e
* GNU Free Documentation License:: The license of this manual
---------- Footnotes ----------
(1) <https://www.djcbsoftware.nl/code/mu>
(2) that is, instead of folders, you use queries that match messages
in a particular folder
(3) currently, the only exception to this is _sending mail_; there
are solutions for that though — see the *note FAQ::

File: mu4e.info, Node: Introduction, Next: Getting started, Prev: Top, Up: Top
1 Introduction
**************
Lets get started!
* Menu:
* Why another e-mail client::Arent there enough already
* Other mail clients::Where mu4e takes its inspiration from
* What mu4e does not do::Focus on the core-business, delegate the rest
* Becoming a mu4e user::Joining the club

File: mu4e.info, Node: Why another e-mail client, Next: Other mail clients, Up: Introduction
1.1 Why another e-mail client?
==============================
I (mu4es author) spend a _lot_ of time dealing with e-mail, both
professionally and privately. Having an efficient e-mail client is
essential. Since none of the existing ones worked the way I wanted, I
thought about creating my own.
Emacs is an integral part of my workflow, so it made a lot of sense
to use it for e-mail as well. And as I had already written an e-mail
search engine (mu), it seemed only logical to use that as a basis.

File: mu4e.info, Node: Other mail clients, Next: What mu4e does not do, Prev: Why another e-mail client, Up: Introduction
1.2 Other mail clients
======================
Under the hood, mu4e is fully search-based, similar to programs like
notmuch(1) and sup(2).
However, mu4es user-interface is quite different. mu4es mail
handling (deleting, moving, etc.) is inspired by Wanderlust(3) (another
Emacs-based e-mail client), mutt(4) and the dired file-manager for
emacs.
mu4e keeps all the state in your maildirs, so you can easily switch
between clients, synchronize over IMAP, backup with rsync and so on.
The Xapian-database that mu maintains is merely a _cache_; if you delete
it, you wont lose any information.
---------- Footnotes ----------
(1) <https://notmuchmail.org/>
(2) <https://sup-heliotrope.github.io/>
(3) <http://www.gohome.org/wl/>
(4) <http://www.mutt.org/>

File: mu4e.info, Node: What mu4e does not do, Next: Becoming a mu4e user, Prev: Other mail clients, Up: Introduction
1.3 What mu4e does not do
=========================
There are a number of things that mu4e does not do, by design:
• mu/mu4e do _not_ get your e-mail messages from a mail server. Nor
does it sync-back any changes. Those tasks are delegated to other
tools, such as offlineimap(1), isync/mbsync(2) or fetchmail(3); As
long as the messages end up in a maildir, mu4e and mu are happy to
deal with them.
• mu4e also does _not_ implement sending of messages; instead, it
depends on smtpmail (*note (smtpmail)Top::), which is part of
Emacs. In addition, mu4e piggybacks on Gnus message editor; *note
(message)Top::.
Thus, many of the things an e-mail client traditionally needs to do,
are delegated to other tools. This leaves mu4e to concentrate on what
it does best: quickly finding the mails you are looking for, and handle
them as efficiently as possible.
---------- Footnotes ----------
(1) <https://www.offlineimap.org/>
(2) <http://isync.sourceforge.net/>
(3) <http://www.fetchmail.info/>

File: mu4e.info, Node: Becoming a mu4e user, Prev: What mu4e does not do, Up: Introduction
1.4 Becoming a mu4e user
========================
If mu4e sounds like something for you, give it a shot! Were trying
hard to make it as easy as possible to set up and use; and while you can
use elisp in various places to augment mu4e, a lot of knowledge about
programming or elisp shouldnt be required. The idea is to provide
sensible defaults, and allow for customization.
When you take mu4e into use, its a good idea to subscribe to the
mu/mu4e-mailing list(1).
Sometimes, you might encounter some unexpected behavior while using
mu4e. It could be a bug in mu4e, it could be an issue in other
software. Or it could just be a misunderstanding. In any case, if you
want to report this (either to the mailing list or to
<https://github.com/djcb/mu/issues>, the latter is preferred), please
always include the following information:
• what did you expect that should happen? what actually happened?
• can you provide some exact steps to reproduce?
• what version of mu4e and emacs were you using? What operating
system?
• can you reproduce it with emacs -q and only loading mu4e?
• if the problem is related to some specific message, please include
the raw message file (appropriately anonymized, of course)
---------- Footnotes ----------
(1) <https://groups.google.com/group/mu-discuss>

File: mu4e.info, Node: Getting started, Next: Main view, Prev: Introduction, Up: Top
2 Getting started
*****************
In this chapter, we go through the installation of mu4e and its basic
setup. After we have succeeded in *note Getting mail::, and *note
Indexing your messages::, we discuss the *note Basic configuration::.
After these steps, mu4e should be ready to go!
* Menu:
* Requirements:: What is needed
* Installation:: How to install mu and mu4e
* Getting mail:: Getting mail from a server
* Initializing the message store:: Settings things up
* Indexing your messages:: Creating and maintaining the index
* Basic configuration:: Settings for mu4e
* Folders:: Setting up standard folders
* Retrieval and indexing:: Doing it from mu4e
* Sending mail:: How to send mail
* Running mu4e:: Overview of the mu4e views

File: mu4e.info, Node: Requirements, Next: Installation, Up: Getting started
2.1 Requirements
================
mu/mu4e are known to work on a wide variety of Unix- and Unix-like
systems, including many Linux distributions, OS X and FreeBSD, and even
on MS-Windows (with Cygwin). Emacs 24 or higher is required, as well as
Xapian(1) and GMime(2).
mu has optional support for both versions 2.2 and 3.0 of the Guile
(Scheme) programming language. There are also some GUI-toys, which
require GTK+ 3.x and Webkit.
If you intend to compile mu yourself, you need to have the typical
development tools, such as C and C++ compilers (both gcc and clang
should work), GNU Autotools and make, and the development packages for
GMime 3.x, GLib and Xapian. Optionally, you also need the development
packages for GTK+, Webkit and Guile.
---------- Footnotes ----------
(1) <https://xapian.org/>
(2) <http://spruce.sourceforge.net/gmime/>

File: mu4e.info, Node: Installation, Next: Getting mail, Prev: Requirements, Up: Getting started
2.2 Installation
================
mu4e is part of mu — by installing the latter, the former is installed
as well. Some Linux distributions provide packaged versions of mu/mu4e;
if you can use those, there is no need to compile anything yourself.
However, if there are no packages for your distribution, if they are
outdated, or if you want to use the latest development versions, you can
follow the steps below.
First, you need make sure you have the necessary dependencies; the
details depend on your distribution. If youre using another
distribution (or another OS), the below can at least be helpful in
identifying the packages to install.
We provide some instructions for Debian, Ubuntu and Fedora; if those
do not apply to you, you can follow either *note Building from a release
tarball:: or *note Building from git::.
2.2.1 Dependencies for Debian/Ubuntu
------------------------------------
$ sudo apt-get install libgmime-3.0-dev libxapian-dev
# get emacs 25 or higher if you don't have it yet
$ sudo apt-get install emacs
# optional
$ sudo apt-get install guile-2.2-dev html2text xdg-utils
# optional: only needed for msg2pdf and mug (toy gtk+ frontend)
$ sudo apt-get install libwebkitgtk-3.0-dev
2.2.2 Dependencies for Fedora
-----------------------------
$ sudo yum install gmime30-devel xapian-core-devel
# get emacs 25 or higher if you don't have it yet
$ sudo yum install emacs
# optional
$ sudo yum install html2text xdg-utils guile22-devel
# optional: only needed for msg2pdf and mug (toy gtk+ frontend)
$ sudo yum install webkitgtk3-devel
2.2.3 Building on Msys2
-----------------------
# 1) install makepkg tool
pacman -S base-devel msys-devel gcc git
# 2) clone packages repo
cd ~
git clone https://github.com/msys2-unofficial/MSYS2-packages.git --depth=1
# make and install dependencies
cd ~/MSYS2-packages/xapian-core
makepkg -s
pacman -U xapian-core-1.4.15-1-x86_64.pkg.tar.xz
cd ~/MSYS2-packages/gmime3
makepkg -s
pacman -U gmime3-devel-3.2.6-1-x86_64.pkg.tar.xz
# 4) make and install mu from git (changes versions as needed)
cd ~/MSYS2-packages/mu
makepkg -sfp PKGBUILD-git
pacman -U mu-git-2020-03-01-r4854.17f38dc4-1-x86_64.pkg.tar.xz
2.2.4 Building from a release tarball
-------------------------------------
Using a release-tarball (as available from GitHub(1)), installation
follows the typical steps:
$ tar xvfz mu-<version>.tar.gz # use the specific version
$ cd mu-<version>
# On the BSDs: use gmake instead of make
$ ./configure && make
$ sudo make install
Xapian, GMime and their dependencies must be installed.
2.2.5 Building from git
-----------------------
Alternatively, if you build from the git repository or use a tarball
like the ones that github produces, the instructions are slightly
different, and require you to have autotools (autoconf, automake,
libtool, texinfo) installed:
# get from git (alternatively, use a github tarball)
$ git clone git://github.com/djcb/mu.git
$ cd mu
$ ./autogen.sh && make
# On the BSDs: use gmake instead of make
$ sudo make install
(Xapian, GMime and their dependencies must be installed).
After this, mu and mu4e should be installed (2) on your system, and
be available from the command line and in Emacs.
You may need to restart Emacs, so it can find mu4e in its
load-path. If, even after restarting, Emacs cannot find mu4e, you may
need to add it to your load-path explicitly; check where mu4e is
installed, and add something like the following to your configuration
before trying again:
;; the exact path may differ --- check it
(add-to-list 'load-path "/usr/local/share/emacs/site-lisp/mu4e")
2.2.6 Building using the meson build system
-------------------------------------------
As an (experimental) alternative to the autotools-build, it is possible
to use the Meson(3) build-system instead.
$ git clone git://github.com/djcb/mu.git
$ cd mu
$ meson build && ninja -C build
$ sudo ninja -C install
2.2.7 mu4e and emacs customization
----------------------------------
There is some support for using the Emacs customization system in mu4e,
but for now, we recommend setting the values manually. Please refer to
*note Example configs:: for a couple of examples of this; here we go
through things step-by-step.
---------- Footnotes ----------
(1) <https://github.com/djcb/mu/releases>
(2) theres a hard dependency between versions of mu4e and mu — you
cannot combine different versions
(3) <https://mesonbuild.com/>

File: mu4e.info, Node: Getting mail, Next: Initializing the message store, Prev: Installation, Up: Getting started
2.3 Getting mail
================
In order for mu (and, by extension, mu4e) to work, you need to have your
e-mail messages stored in a _maildir_(1) — a specific directory
structure with one-file-per-message.
If you are already using a maildir, you are lucky. If not, some
setup is required:
• _Using an external IMAP or POP server_ — if you are using an IMAP
or POP server, you can use tools like getmail, fetchmail,
offlineimap or isync to download your messages into a maildir
(~/Maildir, often). Because it is such a common case, there is a
full example of setting mu4e up with offlineimap and Gmail; *note
Gmail configuration::.
• _Using a local mail server_ — if you are using a local mail-server
(such as postfix or qmail), you can teach them to deliver into a
maildir as well, maybe in combination with procmail. A bit of
googling should be able to provide you with the details.
The maildir must be on a single file-system; and symbolic links are
not supported.
---------- Footnotes ----------
(1) <https://en.wikipedia.org/wiki/Maildir>; in this manual we use
the term maildir for both the standard and the hierarchy of maildirs
that store your messages

File: mu4e.info, Node: Initializing the message store, Next: Indexing your messages, Prev: Getting mail, Up: Getting started
2.4 Initializing the message store
==================================
The first time you run mu, you need to initialize its store (database).
The default location for that is ~/.cache/mu/xapian, but you can change
this using the --muhome option, and remember to pass that to the other
commands as well.
Assuming that your maildir is at ~/Maildir, we issue the following
command:
$ mu init --maildir=~/Maildir
Optionally, you can add some e-mail addresses, so mu recognizes them
as yours:
$ mu init --maildir=~/Maildir --my-address=jim@example.com --my-address=bob@example.com
mu remembers the maildir and your addresses and uses them when
indexing messages. If you want to change them, you need to init once
again.
If you want to see the current values, you can use mu info.

File: mu4e.info, Node: Indexing your messages, Next: Basic configuration, Prev: Initializing the message store, Up: Getting started
2.5 Indexing your messages
==========================
After you have succeeded in *note Getting mail:: and initialized the
message database, we need to _index_ the messages. That is — we need to
scan the messages in the maildir and store the information about them in
a special database.
We can do that from mu4e — *note Main view::, but the first time, it
is a good idea to run it from the command line, which makes it easier to
verify that everything works correctly.
Assuming that your maildir is at ~/Maildir, we issue the following
command:
$ mu index
This should scan your messages and fill the database, and give
progress information while doing so.
The indexing process may take a few minutes the first time you do it
(for thousands of e-mails); afterwards it is much faster, since mu only
scans messages that are new or have changed. Indexing is discussed in
full detail in the mu-index man-page.
After the indexing process has finished, you can quickly test if
everything worked, by trying some command-line searches, for example
$ mu find hello
which lists all messages that match hello. For more examples of
searches, see *note Queries::, or check the mu-find and mu-easy man
pages. If all of this worked well, we are well on our way setting
things up; the next step is to do some basic configuration for mu4e.

File: mu4e.info, Node: Basic configuration, Next: Folders, Prev: Indexing your messages, Up: Getting started
2.6 Basic configuration
=======================
Before we can start using mu4e, we need to tell Emacs to load it. So,
add to your ~/.emacs (or its moral equivalent, such as
~/.emacs.d/init.el) something like:
(require 'mu4e)
If Emacs complains that it cannot find mu4e, check your load-path
and make sure that mu4es installation directory is part of it. If not,
you can add it:
(add-to-list 'load-path MU4E-PATH)
with MU4E-PATH replaced with the actual path.

File: mu4e.info, Node: Folders, Next: Retrieval and indexing, Prev: Basic configuration, Up: Getting started
2.7 Folders
===========
The next step is to tell mu4e where it can find your Maildir, and some
special folders.
So, for example(1):
;; these are actually the defaults
(setq
mu4e-sent-folder "/sent" ;; folder for sent messages
mu4e-drafts-folder "/drafts" ;; unfinished messages
mu4e-trash-folder "/trash" ;; trashed messages
mu4e-refile-folder "/archive") ;; saved messages
Note, the folder names are all relative to the root-maildir (see the
output of mu info). If you use mu4e-context, see *note Contexts and
special folders:: for what that means for these special folders.
---------- Footnotes ----------
(1) Note that the folders (mu4e-sent-folder, mu4e-drafts-folder,
mu4e-trash-folder and mu4e-refile-folder) can also be _functions_ that
are evaluated at runtime. This allows for dynamically changing them
depending on the situation. See *note Dynamic folders:: for details.

File: mu4e.info, Node: Retrieval and indexing, Next: Sending mail, Prev: Folders, Up: Getting started
2.8 Retrieval and indexing with mu4e
====================================
As we have seen, we can do all of the mail retrieval _outside_ of
Emacs/mu4e. However, you can also do it from within mu4e.
2.8.1 Basics
------------
To set up mail-retrieval from within mu4e, set the variable
mu4e-get-mail-command to the program or shell command you want to use
for retrieving mail. You can then get your e-mail using M-x
mu4e-update-mail-and-index, or C-S-u in all mu4e-views;
alternatively, you can use C-c C-u, which may be more convenient if
you use emacs in a terminal.
You can kill the (foreground) update process with q.
It is possible to update your mail and index periodically in the
background or foreground, by setting the variable mu4e-update-interval
to the number of seconds between these updates. If set to nil, it
wont update at all. After you make changes to mu4e-update-interval,
mu4e must be restarted before the changes take effect. By default, this
will run in background and to change it to run in foreground, set
mu4e-index-update-in-background to nil.
2.8.2 Handling errors during mail retrieval
-------------------------------------------
If the mail-retrieval process returns with a non-zero exit code, mu4e
shows a warning (unless mu4e-index-update-error-warning is set to
nil), but then try to index your maildirs anyway (unless
mu4e-index-update-error-continue is set to nil).
Reason for these defaults is that some of the mail-retrieval programs
may return non-zero, even when the updating process succeeded; however,
it is hard to tell such pseudo-errors from real ones like login
failed.
If you need more refinement, it may be useful to wrap the
mail-retrieval program in a shell-script, for example fetchmail returns
1 to indicate no mail; we can handle that with:
(setq mu4e-get-mail-command "fetchmail -v || [ $? -eq 1 ]")
A similar approach can be used with other mail retrieval programs,
although not all of them have their exit codes documented.
2.8.3 Implicit mail retrieval
-----------------------------
If you dont have a specific command for getting mail, for example
because you are running your own mail-server, you can leave
mu4e-get-mail-command at "true" (the default), in which case mu4e
wont try to get new mail, but still re-index your messages.
2.8.4 Speeding up indexing
--------------------------
If you have a large number of e-mail messages in your store,
(re)indexing might take a while. The defaults for indexing are to
ensure that we always have correct, up-to-date information about your
messages, even if other programs have modified the Maildir.
The downside of this thoroughness (which is the default) is that it
is relatively slow, something that can be noticeable with large e-mail
corpa on slow file-systems. For a faster approach, you can use the
following:
(setq
mu4e-index-cleanup nil ;; don't do a full cleanup check
mu4e-index-lazy-check t) ;; don't consider up-to-date dirs
In many cases, the mentioned thoroughness might not be needed, and
these settings give a very significant speed-up. Note that you can of
course occasionally run a thorough indexing round.
For further details, please refer to the mu-index manpage; in
particular, see .noindex and .noupdate which can help reducing the
indexing time.
2.8.5 Example setup
-------------------
A simple setup could look something like:
(setq
mu4e-get-mail-command "offlineimap" ;; or fetchmail, or ...
mu4e-update-interval 300) ;; update every 5 minutes
A hook mu4e-update-pre-hook is available which is run right before
starting the process. That can be useful, for example, to influence,
mu4e-get-mail-command based on the the current situation (location,
time of day, ...).
It is possible to get notifications when the indexing process does
any updates — for example when receiving new mail. See
mu4e-index-updated-hook and some tips on its usage in the *note FAQ::.

File: mu4e.info, Node: Sending mail, Next: Running mu4e, Prev: Retrieval and indexing, Up: Getting started
2.9 Sending mail
================
mu4e re-uses Gnus message-mode (*note (message)Top::) for writing
mail and inherits the setup for sending mail as well.
For sending mail using SMTP, mu4e uses smtpmail (*note
(smtpmail)Top::). This package supports many different ways to send
mail; please refer to its documentation for the details.
Here, we only provide some simple examples — for more, see *note
Example configs::.
A very minimal setup:
;; tell message-mode how to send mail
(setq message-send-mail-function 'smtpmail-send-it)
;; if our mail server lives at smtp.example.org; if you have a local
;; mail-server, simply use 'localhost' here.
(setq smtpmail-smtp-server "smtp.example.org")
Since mu4e (re)uses the same message mode and smtpmail that Gnus
uses, many settings for those also apply to mu4e.
2.9.1 Dealing with sent messages
--------------------------------
By default, mu4e puts a copy of messages you sent in the folder
determined by mu4e-sent-folder. In some cases, this may not be what
you want - for example, when using Gmail-over-IMAP, this interferes with
Gmails handling of the sent messages folder, and you may end up with
duplicate messages.
You can use the variable mu4e-sent-messages-behavior to customize
what happens with sent messages. The default is the symbol sent
which, as mentioned, causes the message to be copied to your
sent-messages folder. Other possible values are the symbols trash
(the sent message is moved to the trash-folder (mu4e-trash-folder),
and delete to simply discard the sent message altogether (so Gmail can
deal with it).
For Gmail-over-IMAP, you could add the following to your settings:
;; don't save messages to Sent Messages, Gmail/IMAP takes care of this
(setq mu4e-sent-messages-behavior 'delete)
And thats it! We should now be ready to go.
For more complex needs, mu4e-sent-messages-behavior can also be a
parameter-less function that returns one of the mentioned symbols; see
the built-in documentation for the variable.

File: mu4e.info, Node: Running mu4e, Prev: Sending mail, Up: Getting started
2.10 Running mu4e
=================
After following the steps in this chapter, we now (hopefully!) have a
working mu4e setup. Great! In the next chapters, we walk you through
the various views in mu4e.
For your orientation, the diagram below shows how the views relate to
each other, and the default key-bindings to navigate between them.
[C] +--------+ [RFCE]
--------> | editor | <--------
/ +--------+ \
/ [RFCE]^ \
/ | \
+-------+ [sjbB]+---------+ [RET] +---------+
| main | <---> | headers | <----> | message |
+-------+ [q] +---------+ [qbBjs] +---------+
[sjbB] ^
[.] | [q]
V
+-----+
| raw |
+-----+
Default bindings
----------------
R: Reply s: search .: raw view (toggle)
F: Forward j: jump-to-maildir q: quit
C: Compose b: bookmark-search
E: Edit B: edit bookmark-search

File: mu4e.info, Node: Main view, Next: Headers view, Prev: Getting started, Up: Top
3 The main view
***************
After you have installed mu4e (*note Getting started::), you can start
it with M-x mu4e. mu4e does some checks to ensure everything is set
up correctly, and then shows you the mu4e main view. Its major mode is
mu4e-main-mode.
* Menu:
* Overview: MV Overview. What is the main view
* Basic actions::What can we do
* Bookmarks: MV Bookmarks. Jumping to other places
* Miscellaneous::Notes

File: mu4e.info, Node: MV Overview, Next: Basic actions, Up: Main view
3.1 Overview
============
The main view looks something like the following:
* mu4e - mu for emacs version @value{VERSION}
Basics
* [j]ump to some maildir
* enter a [s]earch query
* [C]ompose a new message
Bookmarks
* [bu] Unread messages (26119/26119)
* [bt] Today's messages (1/7)
* [bw] Last 7 days (30/126)
* [bp] Messages with images (268/2309)
Maildirs
* [ja] /archive (3174/17990)
* [ji] /inbox (0/2)
* [jm] /mu (1541/14884)
* [js] /sent
Misc
* [;]Switch context
* [U]pdate email & database
* toggle [m]ail sending mode (currently direct)
* [N]ews
* [A]bout mu4e
* [H]elp
* [q]uit
Info
* database-path : /home/user/.cache/mu/xapian
* maildir : /home/user/Maildir
* in store : 78825 messages
* personal addresses : jim@@example.com, bob@@example.com
Lets walk through the menu.

File: mu4e.info, Node: Basic actions, Next: MV Bookmarks, Prev: MV Overview, Up: Main view
3.2 Basic actions
=================
First, the _Basics_:
• [j]ump to some maildir: after pressing <j> (“jump”), mu4e asks you
for a maildir to visit. These are the maildirs you set in *note
Basic configuration:: and any of your own. If you choose <o>
(“other”) or </>, you can choose from all maildirs under the
root-maildir. After choosing a maildir, the messages in that
maildir are listed, in the *note Headers view::.
• enter a [s]earch query: after pressing <s>, mu4e asks you for a
search query, and after entering one, shows the results in the
*note Headers view::.
• [C]ompose a new message: after pressing <C>, you are dropped in the
*note Editor view:: to write a new message.

File: mu4e.info, Node: MV Bookmarks, Next: Miscellaneous, Prev: Basic actions, Up: Main view
3.3 Bookmarks
=============
The next item in the Main view is _Bookmarks_.
Bookmarks are predefined queries with a descriptive name and a
shortcut — in the example above, we see the default bookmarks. You can
view the list of messages matching a certain bookmark by pressing <b>
followed by the bookmarks shortcut. If youd like to edit the
bookmarked query first before invoking it, use <B>.
Next to each bookmark there is the number of (unread/all) messages
that match.
Bookmarks are stored in the variable mu4e-bookmarks; you can add
your own and/or replace the default ones; *Note Bookmarks::. For
instance:
(add-to-list 'mu4e-bookmarks
;; add bookmark for recent messages on the Mu mailing list.
'( :name "Mu7Days"
:key ?m
:query "list:mu-discuss.googlegroups.com AND date:7d..now"))
There are optional keys :hide to hide the bookmark from the main
menu, but still have it available (using <b>)) and :hide-unread to avoid
generating the unread-number; that can be useful if you have bookmarks
for slow queries. Note that :hide-unread is implied when the query is
not a string; this for the common case where the query function involves
some user input, which would be disruptive in this case.

File: mu4e.info, Node: Miscellaneous, Prev: MV Bookmarks, Up: Main view
3.4 Miscellaneous
=================
Finally, there are some _Misc_ (miscellaneous) actions:
• [U]pdate email & database executes the shell-command in the
variable mu4e-get-mail-command, and afterwards updates the mu
database; see *note Indexing your messages:: and *note Getting
mail:: for details.
• toggle [m]ail sending mode (direct) toggles between sending mail
directly, and queuing it first (for example, when you are offline),
and [f]lush queued mail flushes any queued mail. This item is
visible only if you have actually set up mail-queuing. *note
Queuing mail::
• [A]bout mu4e provides general information about the program
• [H]elp shows help information for this view
• Finally, [q]uit mu4e quits your mu4e-session

File: mu4e.info, Node: Headers view, Next: Message view, Prev: Main view, Up: Top
4 The headers view
******************
The headers view shows the results of a query. The header-line shows
the names of the fields. Below that, there is a line with those fields,
for each matching message, followed by a footer line. The major-mode
for the headers view is mu4e-headers-mode.
* Menu:
* Overview: HV Overview. What is the Header View
* Keybindings::Do things with your keyboard
* Marking: HV Marking. Selecting messages for doing things
* Sorting and threading::Influencing the display
* Custom headers: HV Custom headers. Adding your own headers
* Actions: HV Actions. Defining and using actions
* Split view::Seeing both headers and messages

File: mu4e.info, Node: HV Overview, Next: Keybindings, Up: Headers view
4.1 Overview
============
An example headers view:
Date V Flgs From/To List Subject
06:32 Nu To Edmund Dantès GstDev Gstreamer-V4L2SINK ...
15:08 Nu Abbé Busoni GstDev ├> ...
18:20 Nu Pierre Morrel GstDev │└> ...
07:48 Nu To Edmund Dantès GstDev └> ...
2013-03-18 S Jacopo EmacsUsr emacs server on win...
2013-03-18 S Mercédès EmacsUsr └> ...
2013-03-18 S Beachamp EmacsUsr Re: Copying a whole...
22:07 Nu Albert de Moncerf EmacsUsr └> ...
2013-03-18 S Gaspard Caderousse GstDev Issue with GESSimpl...
2013-03-18 Ss Baron Danglars GuileUsr Guile-SDL 0.4.2 ava...
End of search results
Some notes to explain what you see in the example:
• The fields shown in the headers view can be influenced by
customizing the variable mu4e-headers-fields; see
mu4e-header-info for the list of built-in fields. Apart from the
built-in fields, you can also create custom fields using
mu4e-header-info-custom; see *note HV Custom headers:: for
details.
• By default, the date is shown with the :human-date field, which
shows the _time_ for todays messages, and the _date_ for older
messages. If you do not want to distinguish between today and
older, you can use the :date field instead.
• You can customize the date and time formats with the variable
mu4e-headers-date-format and mu4e-headers-time-format,
respectively. In the example, we use :human-date, which shows
the time when the message was sent today, and the date otherwise.
• By default, the subject is shown using the :subject field; however,
it is also possible to use :thread-subject, which shows the subject
of a thread only once, similar to the display of the mutt e-mail
client.
• The header field used for sorting is indicated by “V” or “^”(1),
corresponding to the sort order (descending or ascending,
respectively). You can influence this by a mouse click, or <O>.
Not all fields allow sorting.
• Instead of showing the From: and To: fields separately, you can use
From/To (:from-or-to in mu4e-headers-fields as a more compact way
to convey the most important information: it shows From: _except_
when the e-mail was sent by the user (i.e., you) — in that case it
shows To: (prefixed by To(2), as in the example above).
• The List field shows the mailing-list a message is sent to;
mu4e tries to create a convenient shortcut for the mailing-list
name; the variable mu4e-user-mailing-lists can be used to add
your your own shortcuts. You can use mu4e-mailing-list-patterns
to to specify generic shortcuts, e.g. to shorten list names which
contain dots (mu4e defaults to shortening up to the first dot):
(setq mu4e-mailing-list-patterns '(``\\([-_a-z0-9.]+\\)\.lists\.company\.com'')))
• The letters in the Flags field correspond to the following:
D=_draft_, F=_flagged_ (i.e., starred), N=_new_, P=_passed_
(i.e., forwarded), R=_replied_, S=_seen_, T=_trashed_,
a=_has-attachment_, x=_encrypted_, s=_signed_, u=_unread_. The
tooltip for this field also contains this information.
• The subject field also indicates the discussion threads (3).
• The headers view is _automatically updated_ if any changes are
found during the indexing process, and if there is no current
user-interaction. If you do not want such automatic updates, set
mu4e-headers-auto-update to nil.
• Just before executing a search, a hook-function
mu4e-headers-search-hook is invoked, which receives the search
expression as its parameter.
• Also, there is a hook-function mu4e-headers-found-hook available
which is invoked just after mu4e has completed showing the messages
in the headers-view.
---------- Footnotes ----------
(1) or you can use little graphical triangles; see variable
mu4e-use-fancy-chars
(2) You can customize this by changing the variable
mu4e-headers-from-or-to-prefix (a cons cell)
(3) using Jamie Zawinskis mail threading algorithm,
<https://www.jwz.org/doc/threading.html>

File: mu4e.info, Node: Keybindings, Next: HV Marking, Prev: HV Overview, Up: Headers view
4.2 Keybindings
===============
Using the below key bindings, you can do various things with these
messages; these actions are also listed in the Mu4e menu in the Emacs
menu bar.
key description
===========================================================
n,p view the next, previous message
],[ move to the next, previous unread message
y select the message view (if it's visible)
RET open the message at point in the message view
searching
---------
s search
S edit last query
/ narrow the search
b search bookmark
B edit bookmark before search
j jump to maildir
M-left,\ previous query
M-right next query
O change sort order
P toggle threading
Q toggle full-search
V toggle skip-duplicates
W toggle include-related
marking
-------
d mark for moving to the trash folder
= mark for removing trash flag ('untrash')
DEL,D mark for complete deletion
m mark for moving to another maildir folder
r mark for refiling
+,- mark for flagging/unflagging
?,! mark message as unread, read
u unmark message at point
U unmark *all* messages
% mark based on a regular expression
T,t mark whole thread, subthread
<insert>,* mark for 'something' (decide later)
# resolve deferred 'something' marks
x execute actions for the marked messages
composition
-----------
R,F,C reply/forward/compose
E edit (only allowed for draft messages)
misc
----
; switch context
a execute some custom action on a header
| pipe message through shell command
C-+,C-- increase / decrease the number of headers shown
H get help
C-S-u update mail & reindex
q leave the headers buffer

File: mu4e.info, Node: HV Marking, Next: Sorting and threading, Prev: Keybindings, Up: Headers view
4.3 Marking
===========
You can _mark_ messages for a certain action, such as deletion or move.
After one or more messages are marked, you can then execute
(mu4e-mark-execute-all, <x>) these actions. This two-step
mark-execute sequence is similar to what e.g. dired does. It is how
mu4e tries to be as quick as possible, while avoiding accidents.
The mark/unmark commands support the _region_ (i.e., “selection”) —
so, for example, if you select some messages and press <DEL>, all
messages in the region are marked for deletion.
You can mark all messages that match a certain pattern with <%>. In
addition, you can mark all messages in the current thread (<T>) or
sub-thread (<t>).
When you do a new search or refresh the headers buffer while you
still have marked messages, you are asked what to do with those marks —
whether to _apply_ them before leaving, or _ignore_ them. This behavior
can be influenced with the variable mu4e-headers-leave-behavior.
For more information about marking, see *note Marking::.

File: mu4e.info, Node: Sorting and threading, Next: HV Custom headers, Prev: HV Marking, Up: Headers view
4.4 Sorting and threading
=========================
By default, mu4e sorts messages by date, in descending order: the most
recent messages are shown at the top. In addition, be default mu4e
shows the message _threads_, i.e., the tree structure representing a
discussion thread; this also affects the sort order: the top-level
messages are sorted by the date of the _newest_ message in the thread.
The header field used for sorting is indicated by “V” or “^”(1),
indicating the sort order (descending or ascending, respectively).
You can change the sort order by clicking the corresponding column
with the mouse, or with M-x mu4e-headers-change-sorting (<O>); note
that not all fields can be used for sorting. You can toggle threading
on/off using M-x mu4e-headers-toggle-threading or <P>. For both of
these functions, unless you provide a prefix argument (<C-u>), the
current search is updated immediately using the new parameters. You can
toggle full-search (*note Searching::) using M-x
mu4e-headers-toggle-full-search or <Q>.
Note that with threading enabled, the sorting is exclusively by date,
regardless of the column clicked.
If you want to change the defaults for these settings, you can use
the variables mu4e-headers-sort-field and mu4e-headers-show-threads,
as well as mu4e-headers-change-sorting to change the sorting of the
current search results.
---------- Footnotes ----------
(1) or you can use little graphical triangles; see variable
mu4e-use-fancy-chars

File: mu4e.info, Node: HV Custom headers, Next: HV Actions, Prev: Sorting and threading, Up: Headers view
4.5 Custom headers
==================
Sometimes the normal headers that mu4e offers (Date, From, To, Subject,
etc.) may not be enough. For these cases, mu4e offers _custom headers_
in both the headers-view and the message-view.
You can do so by adding a description of your custom header to
mu4e-header-info-custom, which is a list of custom headers.
Lets look at an example — suppose we want to add a custom header
that shows the number of recipients for a message, i.e., the sum of the
number of recipients in the To: and Cc: fields. Lets further suppose
that our function takes a message-plist as its argument (*note Message
functions::).
(add-to-list 'mu4e-header-info-custom
'(:recipnum .
( :name "Number of recipients" ;; long name, as seen in the message-view
:shortname "Recip#" ;; short name, as seen in the headers view
:help "Number of recipients for this message" ;; tooltip
:function (lambda (msg)
(format "%d"
(+ (length (mu4e-message-field msg :to))
(length (mu4e-message-field msg :cc))))))))
Or, lets get the full mailing-list name:
(add-to-list 'mu4e-header-info-custom
'(:full-mailing-list .
( :name "Mailing-list" ;; long name, as seen in the message-view
:shortname "ML" ;; short name, as seen in the headers view
:help "Full name for mailing list" ;; tooltip
:function (lambda (msg)
(or (mu4e-message-field msg :mailing-list) "")))))
You can then add the custom header to your mu4e-headers-fields,
just like the built-in headers. After evaluation, your headers-view
should include a new header Recip# with the number of recipients, and/or
ML with the full mailing-list name.
This function can be used in both the headers-view and the
message-view; if you need something specific for one of these, you can
check for the mode in your function, or create separate functions.

File: mu4e.info, Node: HV Actions, Next: Split view, Prev: HV Custom headers, Up: Headers view
4.6 Actions
===========
mu4e-headers-action (<a>) lets you pick custom actions to perform on
the message at point. You can specify these actions using the variable
mu4e-headers-actions. See *note Actions:: for the details.
mu4e defines some default actions. One of those is for _capturing_ a
message: <a c> captures the current message. Next, when youre
editing some message, you can include the previously captured message as
an attachment, using mu4e-compose-attach-captured-message. See
mu4e-actions.el in the mu4e source distribution for more example
actions.

File: mu4e.info, Node: Split view, Prev: HV Actions, Up: Headers view
4.7 Split view
==============
Using the _Split view_, we can see the *note Headers view:: and the
*note Message view:: next to each other, with the message selected in
the former, visible in the latter. You can influence the way the
splitting is done by customizing the variable mu4e-split-view.
Possible values are:
• horizontal (this is the default): display the message view below
the header view. Use mu4e-headers-visible-lines the set the
number of lines shown (default: 8).
• vertical: display the message view on the right side of the header
view. Use mu4e-headers-visible-columns to set the number of
visible columns (default: 30).
• single-window: single window mode. Single-window mode tries to
minimize mu4e window operations (opening, killing, resizing, etc)
and buffer changes, while still retaining the view and headers
buffers. In addition, it replaces mu4e main view with a minibuffer
prompt containing the same information.
• anything else: dont do any splitting
Some useful key bindings in the split view:
• <C-+> and <C-->: interactively change the number of columns or
headers shown
• You can change the selected window from the headers-view to the
message-view and vice-versa with mu4e-select-other-view, bound to
<y>

File: mu4e.info, Node: Message view, Next: Editor view, Prev: Headers view, Up: Top
5 The message view
******************
This chapter discusses the new (since version 1.6) Gnus-based message
view. However, the old one is still available see *note Old message
view::.
After selecting a message in the *note Headers view::, it appears in
a message view window, which shows the message headers, followed by the
message body. Its major mode is mu4e-view-mode, which derives from
gnus-article-mode.
* Menu:
* Overview: MSGV Overview. What is the Message View
* Keybindings: MSGV Keybindings. Do things with your keyboard
* Rich-text and images: MSGV Rich-text and images. Reading rich-text messages
* Custom headers: MSGV Custom headers. Your very own headers
* Actions: MSGV Actions. Defining and using actions.

File: mu4e.info, Node: MSGV Overview, Next: MSGV Keybindings, Up: Message view
5.1 Overview
============
An example message view:
From: randy@epiphyte.com
To: julia@eruditorum.org
Subject: Re: some pics
Flags: seen, attach
Date: Thu, 11 Feb 2021 12:59:30 +0200 (4 weeks, 3 days, 21 hours ago)
Maildir: /inbox
Attachments: [2. image/jpeg; DSCN4961.JPG]... [3. image/jpeg; DSCN4962.JPG]...
Hi Julia,
Some pics from our trip to Cerin Amroth. Enjoy!
All the best,
Randy.
On Sun 21 Dec 2003 09:06:34 PM EET, Julia wrote:
[....]
Some notes:
• The variable mu4e-view-fields determines the header fields to be
shown; see mu4e-header-info for a list of built-in fields. Apart
from the built-in fields, you can also create custom fields using
mu4e-header-info-custom; see *note MSGV Custom headers::.
• For search-related operations, see *note Searching::.
• You can scroll down the message using <SPC>; if you do this at the
end of a message,it automatically takes you to the next one. If
you want to prevent this behavior, set mu4e-view-scroll-to-next
to nil.

File: mu4e.info, Node: MSGV Keybindings, Next: MSGV Rich-text and images, Prev: MSGV Overview, Up: Message view
5.2 Keybindings
===============
You can find most things you can do with this message in the _Mu4e_
menu, or by using the keyboard; the default bindings are:
key description
==============================================================
n,p view the next, previous message
],[ move to the next, previous unread message
y select the headers view (if it's visible)
RET scroll down
M-RET open URL at point / attachment at point
SPC scroll down, if at end, move to next message
S-SPC scroll up
searching
---------
s search
S edit last query
/ narrow the search
b search bookmark
B edit bookmark before search
j jump to maildir
M-left previous query
M-right next query
marking messages
----------------
d mark for moving to the trash folder
= mark for removing trash flag ('untrash')
DEL,D mark for complete deletion
m mark for moving to another maildir folder
r mark for refiling
+,- mark for flagging/unflagging
u unmark message at point
U unmark *all* messages
% mark based on a regular expression
T,t mark whole thread, subthread
<insert>,* mark for 'something' (decide later)
# resolve deferred 'something' marks
x execute actions for the marked messages
composition
-----------
R,F,C reply/forward/compose
E edit (only allowed for draft messages)
actions
-------
g go to (visit) numbered URL (using `browse-url')
(or: <mouse-1> or M-RET with point on url)
C-u g visits multiple URLs
f fetch (download )the numbered URL.
C-u f fetches multiple URLs
k save the numbered URL in the kill-ring.
C-u k saves multiple URLs
e extract (save) one or more attachments (asks for numbers)
(or: <mouse-2> or S-RET with point on attachment)
a execute some custom action on the message
A execute some custom action on the message's MIME-parts
misc
----
; switch context
. show the raw message view. 'q' takes you back.
C-+,C-- increase / decrease the number of headers shown
H get help
C-S-u update mail & reindex
q leave the message view
For the marking commands, please refer to *note Marking messages::.

File: mu4e.info, Node: MSGV Rich-text and images, Next: MSGV Custom headers, Prev: MSGV Keybindings, Up: Message view
5.3 Reading rich-text messages
==============================
These days, many e-mail messages contain rich-text (typically, HTML);
either as an alternative to a text-only version, or even as the only
option.
By default, mu4e tries to display the richest option, which is the
last MIME-part of the alternatives. You can customize this to prefer
the text version, if available, with something like the following in
your configuration (and see the docstring for
mm-discouraged-alternatives for details):
(with-eval-after-load "mm-decode"
(add-to-list 'mm-discouraged-alternatives "text/html")
(add-to-list 'mm-discouraged-alternatives "text/richtext"))
When displaying rich-text messages inline, mu4e (through gnus) uses
the shr built-in HTML-renderer. If youre using a dark color theme, and
the messages are hard to read, it can help to change the luminosity,
e.g.:
(setq shr-color-visible-luminance-min 80)
Note that you can switch between the HTML and text versions by
clicking on the relevant part in the messages headers; you can make it
even clearer by indicating them in the message itself, using:
(setq gnus-unbuttonized-mime-types nil)
5.3.1 Inline images
-------------------
When you run Emacs in graphical mode, by default images attached to
messages are shown inline in the message view buffer.
To disable this, set gnus-inhibit-images to t. By default,
external images in HTML are not retrieved from external URLs because
they can be used to track you.
You can specify what URLs to block by setting gnus-blocked-images
to a regular exporession or to a function that will receive the message
as an argument. For example, to enable images in Github notifications,
do the following:
(setq gnus-blocked-images
(lambda(&optional _ignore)
(if (mu4e-message-contact-field-matches
(mu4e-message-at-point) :from "notifications@github.com")
nil ".")))

File: mu4e.info, Node: MSGV Custom headers, Next: MSGV Actions, Prev: MSGV Rich-text and images, Up: Message view
5.4 Custom headers
==================
Sometimes the normal headers (Date, From, To, Subject, etc.) may not be
enough. For these cases, mu4e offers _custom headers_ in both the
headers-view and the message-view.
See *note HV Custom headers:: for an example of this; the difference
for the message-view is that you should add your custom header to
mu4e-view-fields rather than mu4e-headers-fields.

File: mu4e.info, Node: MSGV Actions, Prev: MSGV Custom headers, Up: Message view
5.5 Actions
===========
You can perform custom functions (“actions”) on messages and their
attachments. For a general discussion on how to define your own, see
*note Actions::.
5.5.1 Message actions
---------------------
mu4e-view-action (<a>) lets you pick some custom action to perform on
the current message. You can specify these actions using the variable
mu4e-view-actions; mu4e defines a number of example actions.
5.5.2 MIME-part actions
-----------------------
MIME-part actions allow you to act upon MIME-parts in a message - such
as attachments. For now, these actions are defined and documented in
mu4e-view-mime-part-actions.

File: mu4e.info, Node: Editor view, Next: Searching, Prev: Message view, Up: Top
6 The editor view
*****************
Writing e-mail messages takes place in the Editor View. mu4es editor
view builds on top of Gnus message-mode. Most of the message-mode
functionality is available, as well some mu4e-specifics. Its major mode
is mu4e-compose-mode.
* Menu:
* Overview: EV Overview. What is the Editor view
* Keybindings: EV Keybindings. Doing things with your keyboard
* Address autocompletion:: Quickly entering known addresses
* Compose hooks::Calling functions when composing
* Signing and encrypting:: Support for cryptography
* Queuing mail:: Sending mail when the time is ripe
* Message signatures:: Adding your personal footer to messages
* Other settings::Miscellanea

File: mu4e.info, Node: EV Overview, Next: EV Keybindings, Up: Editor view
6.1 Overview
============
From: Rupert the Monkey <rupert@example.com>
To: Wally the Walrus <wally@example.com>
Subject: Re: Eau-qui d'eau qui?
--text follows this line--
On Mon 16 Jan 2012 10:18:47 AM EET, Wally the Walrus wrote:
> Hi Rupert,
>
> Dude - how are things?
>
> Later -- wally.

File: mu4e.info, Node: EV Keybindings, Next: Address autocompletion, Prev: EV Overview, Up: Editor view
6.2 Keybindings
===============
mu4es editor view derives from Gnus message editor and shares most of
its keybindings. Here are some of the more useful ones (you can use the
menu to find more):
key description
--- -----------
C-c C-c send message
C-c C-d save to drafts and leave
C-c C-k kill the message buffer (the message remains in the draft folder)
C-c C-a attach a file (pro-tip: drag & drop works as well)
C-c C-; switch the context
(mu4e-specific)
C-S-u update mail & reindex

File: mu4e.info, Node: Address autocompletion, Next: Compose hooks, Prev: EV Keybindings, Up: Editor view
6.3 Address autocompletion
==========================
mu4e supports(1) autocompleting addresses when composing e-mail
messages. mu4e uses the e-mail addresses from the messages you sent or
received as the source for this. Address auto-completion is enabled by
default; if you want to disable it for some reason, set
mu4e-compose-complete-addresses to nil.
Emacs 24 also supports cycling through the alternatives. When there
are more than _5_ matching addresses, they are shown in a *Completions*
buffer. Once the number of matches gets below this number, one is
inserted in the address field and you can cycle through the alternatives
using <TAB>.
6.3.1 Limiting the number of addresses
--------------------------------------
If you have a lot of mail, especially from mailing lists and the like,
there can be a _lot_ of e-mail addresses, many of which may not be very
useful when auto-completing. For this reason, mu4e attempts to limit
the number of e-mail addresses in the completion pool by filtering out
the ones that are not likely to be relevant. The following variables
are available for tuning this:
mu4e-compose-complete-only-personal — when set to t, only
consider addresses that were seen in _personal_ messages — that is,
messages in which one of my e-mail addresses was seen in one of the
address fields. This is to exclude mailing list posts. You can
define what is considered my e-mail address using the
--my-address parameter to mu init.
mu4e-compose-complete-only-after — only consider e-mail addresses
last seen after some date. Parameter is a string, parseable by
org-parse-time-string. This excludes old e-mail addresses. The
default is "2010-01-01", i.e., only consider e-mail addresses seen
since the start of 2010.
mu4e-contact-process-function — a function to rewrite or exclude
certain addresses.
---------- Footnotes ----------
(1) GNU Emacs 24.4 or higher is required

File: mu4e.info, Node: Compose hooks, Next: Signing and encrypting, Prev: Address autocompletion, Up: Editor view
6.4 Compose hooks
=================
If you want to change some setting, or execute some custom action before
message composition starts, you can define a _hook function_. mu4e
offers two hooks:
mu4e-compose-pre-hook: this hook is run _before_ composition
starts; if you are composing a _reply_, _forward_ a message, or
_edit_ an existing message, the variable
mu4e-compose-parent-message points to the message being replied
to, forwarded or edited, and you can use mu4e-message-field to
get the value of various properties (and see *note Message
functions::).
mu4e-compose-mode-hook: this hook is run just before composition
starts, when the whole buffer has already been set up. This is a
good place for editing-related settings.
mu4e-compose-parent-message (see above) is also at your disposal.
Lets look at some examples. First, suppose we want to set the
From:-address for a reply message based on the receiver of the original:
;; 1) messages to me@foo.example.com should be replied with From:me@foo.example.com
;; 2) messages to me@bar.example.com should be replied with From:me@bar.example.com
;; 3) all other mail should use From:me@cuux.example.com
(add-hook 'mu4e-compose-pre-hook
(defun my-set-from-address ()
"Set the From address based on the To address of the original."
(let ((msg mu4e-compose-parent-message)) ;; msg is shorter...
(when msg
(setq user-mail-address
(cond
((mu4e-message-contact-field-matches msg :to "me@foo.example.com")
"me@foo.example.com")
((mu4e-message-contact-field-matches msg :to "me@bar.example.com")
"me@bar.example.com")
(t "me@cuux.example.com")))))))
Secondly, as mentioned, mu4e-compose-mode-hook is especially useful
for editing-related settings. For example:
(add-hook 'mu4e-compose-mode-hook
(defun my-do-compose-stuff ()
"My settings for message composition."
(set-fill-column 72)
(flyspell-mode)))
This hook is also useful for adding headers or changing headers,
since the message is fully formed when this hook runs. For example, to
add a Bcc:-header, you could add something like the following, using
message-add-header from message-mode.
(add-hook 'mu4e-compose-mode-hook
(defun my-add-bcc ()
"Add a Bcc: header."
(save-excursion (message-add-header "Bcc: me@example.com\n"))))
Or to something context-specific:
(add-hook 'mu4e-compose-mode-hook
(lambda()
(let* ((ctx (mu4e-context-current))
(name (if ctx (mu4e-context-name ctx))))
(when name
(cond
((string= name "account1")
(save-excursion (message-add-header "Bcc: account1@example.com\n")))
((string= name "account2")
(save-excursion (message-add-header "Bcc: account2@example.com\n"))))))))
For a more general discussion about extending mu4e, see *note Extending
mu4e::.

File: mu4e.info, Node: Signing and encrypting, Next: Queuing mail, Prev: Compose hooks, Up: Editor view
6.5 Signing and encrypting
==========================
Signing and encrypting of messages is possible using emacs-mime (*note
(emacs-mime)Composing::), most easily accessed through the
Attachments-menu while composing a message, or with M-x
mml-secure-message-encrypt-pgp, M-x mml-secure-message-sign-pgp.
The support for encryption and signing is _independent_ of the
support for their counterparts, decrypting and signature verification
(as discussed in *note OMSGV Crypto::). Even if your mu4e does not have
support for the latter two, you can still sign/encrypt messages.
Important note: the messages are encrypted when they are _sent_: this
means that draft messages are _not_ encrypted. So if you are using e.g.
offlineimap or mbsync to synchronize with some remote IMAP-service, make
sure the drafts folder is _not_ in the set of synchronized folders, for
obvious reasons.

File: mu4e.info, Node: Queuing mail, Next: Message signatures, Prev: Signing and encrypting, Up: Editor view
6.6 Queuing mail
================
If you cannot send mail right now, for example because you are currently
offline, you can _queue_ the mail, and send it when you have restored
your internet connection. You can control this from the *note Main
view::.
To allow for queuing, you need to tell smtpmail where you want to
store the queued messages. For example:
(setq smtpmail-queue-mail t ;; start in queuing mode
smtpmail-queue-dir "~/Maildir/queue/cur")
For convenience, we put the queue directory somewhere in our normal
maildir. If you want to use queued mail, you should create this
directory before starting mu4e. The mu mkdir command may be useful
here, so for example:
$ mu mkdir ~/Maildir/queue
$ touch ~/Maildir/queue/.noindex
The file created by the touch command tells mu to ignore this
directory for indexing, which makes sense since it contains smtpmail
meta-data rather than normal messages; see the mu-mkdir and mu-index
man-pages for details.
_Warning_: when you switch on queued-mode, your messages _wont_
reach their destination until you switch it off again; so, be careful
not to do this accidentally!

File: mu4e.info, Node: Message signatures, Next: Other settings, Prev: Queuing mail, Up: Editor view
6.7 Message signatures
======================
Message signatures are the standard footer blobs in e-mail messages
where you can put in information you want to include in every message.
The text to include is set with mu4e-compose-signature.
If you dont want to include this automatically with each message,
you can set mu4e-compose-signature-auto-include to nil; you can then
still include the signature manually, using the function
message-insert-signature, typically bound to C-c C-w.

File: mu4e.info, Node: Other settings, Prev: Message signatures, Up: Editor view
6.8 Other settings
==================
• If you want use mu4e as Emacs default program for sending mail,
see *note Emacs default::.
• Normally, mu4e _buries_ the message buffer after sending; if you
want to kill the buffer instead, add something like the following
to your configuration:
(setq message-kill-buffer-on-exit t)
• If you want to exclude your own e-mail address when “replying to
all”, set mu4e-compose-dont-reply-to-self to t. In order for
this to work properly you need to pass your address to mu init
--my-address= at database initialization time.

File: mu4e.info, Node: Searching, Next: Marking, Prev: Editor view, Up: Top
7 Searching
***********
mu4e is fully search-based: even if you jump to a folder, you are
executing a query for messages that happen to have the property of being
in a certain folder (maildir).
Normally, queries return up to mu4e-headers-results-limit (default:
500) results. That is usually more than enough, and makes things
significantly faster. Sometimes, however, you may want to show _all_
results; you can enable this with M-x mu4e-headers-toggle-full-search,
or by customizing the variable mu4e-headers-full-search. This applies
to all search commands.
You can also influence the sort order and whether threads are shown
or not; see *note Sorting and threading::.
* Menu:
* Queries:: Searching for messages.
* Bookmarks:: Remembering queries.
* Maildir searches:: Queries for maildirs.
* Other search functionality:: Some more tricks.

File: mu4e.info, Node: Queries, Next: Bookmarks, Up: Searching
7.1 Queries
===========
mu4e queries are the same as the ones that mu find understands(1). You
can consult the mu-query man page for the details.
Additionally, mu4e supports TAB-completion for queries. There
there is completion for all search keywords such as and, from:, or
date: and also for certain values, i.e., the possible values for
flag:, prio:, mime:, and maildir:.
Lets look at some examples here.
• Get all messages regarding _bananas_:
bananas
• Get all messages regarding _bananas_ from _John_ with an
attachment:
from:john and flag:attach and bananas
• Get all messages with subject _wombat_ in June 2017
subject:wombat and date:20170601..20170630
• Get all messages with PDF attachments in the /projects folder
maildir:/projects and mime:application/pdf
• Get all messages about _Rupert_ in the /Sent Items folder. Note
that maildirs with spaces must be quoted.
"maildir:/Sent Items" and rupert
• Get all important messages which are signed:
flag:signed and prio:high
• Get all messages from _Jim_ without an attachment:
from:jim and not flag:attach
• Get all messages with Alice in one of the contacts-fields (to,
from, cc, bcc):
contact:alice
• Get all unread messages where the subject mentions Ångström:
(search is case-insensitive and accent-insensitive, so this matches
Ångström, angstrom, aNGstrøM, ...)
subject:Ångström and flag:unread
• Get all unread messages between Mar-2012 and Aug-2013 about some
bird:
date:20120301..20130831 and nightingale and flag:unread
• Get todays messages:
date:today..now
• Get all messages we got in the last two weeks regarding _emacs_:
date:2w.. and emacs
• Get messages from the _Mu_ mailing list:
list:mu-discuss.googlegroups.com
Note — in the *note Headers view:: you may see the friendly name
for a list; however, when searching you need the real name. You
can see the real name for a mailing list from the friendly names
tool-tip.
• Get messages with a subject soccer, Socrates, society, ...; note
that the *-wildcard can only appear as a terms rightmost
character:
subject:soc*
• Get all messages _not_ sent to a mailing-list:
NOT flag:list
• Get all mails with attachments with filenames starting with _pic_;
note that the * wildcard can only appear as the terms rightmost
character:
file:pic*
• Get all messages with PDF-attachments:
mime:application/pdf
Get all messages with image attachments, and note that the *
wildcard can only appear as the terms rightmost character:
mime:image/*
Get all messages with files that end in .ppt; this uses the
regular-expression support, which is powerful but relatively slow:
file:/\.ppt$/
---------- Footnotes ----------
(1) with the caveat that command-line queries are subject to the
shells interpretation before mu sees them

File: mu4e.info, Node: Bookmarks, Next: Maildir searches, Prev: Queries, Up: Searching
7.2 Bookmarks
=============
If you have queries that you use often, you may want to store them as
_bookmarks_. Bookmark searches are available in the main view (*note
Main view::), header view (*note Headers view::), and message view
(*note Message view::), using (by default) the key <b> (M-x
mu4e-search-bookmark), or <B> (M-x mu4e-search-bookmark-edit) which
lets you edit the bookmark first.
7.2.1 Setting up bookmarks
--------------------------
mu4e provides a number of default bookmarks. Their definition may be
instructive:
(defcustom mu4e-bookmarks
'(( :name "Unread messages"
:query "flag:unread AND NOT flag:trashed"
:key ?u)
( :name "Today's messages"
:query "date:today..now"
:key ?t)
( :name "Last 7 days"
:query "date:7d..now"
:hide-unread t
:key ?w)
( :name "Messages with images"
:query "mime:image/*"
:key ?p))
"List of pre-defined queries that are shown on the main screen.
Each of the list elements is a plist with at least:
:name - the name of the query
:query - the query expression
:key - the shortcut key.
Optionally, you add the following:
:hide - if t, bookmark is hdden from the main-view and speedbar.
:hide-unread - do not show the counts of unread/total number
of matches for the query. This can be useful if a bookmark uses
a very slow query. :hide-unread is implied from :hide.
"
:type '(repeat (plist))
:group 'mu4e)
You can replace these or add your own items, by putting in your
configuration (~/.emacs) something like:
(add-to-list 'mu4e-bookmarks
'( :name "Big messages"
:query "size:5M..500M"
:key ?b))
This prepends your bookmark to the list, and assigns the key <b> to
it. If you want to _append_ your bookmark, you can use t as the third
argument to add-to-list.
In the various mu4e views, pressing <b> lists all the bookmarks
defined in the echo area, with the shortcut key highlighted. So, to
invoke the bookmark we just defined (to get the list of "Big Messages"),
all you need to type is bb.
7.2.2 Lisp expressions or functions as bookmarks
------------------------------------------------
Instead of using strings, it is also possible to use Lisp expressions as
bookmarks. Either the expression evaluates to a query string or the
expression is a function taking no argument that returns a query string.
For example, to get all the messages that are at most a week old in
your inbox:
(add-to-list 'mu4e-bookmarks
'( :name "Inbox messages in the last 7 days"
:query (lambda () (concat "maildir:/inbox AND date:"
(format-time-string "%Y%m%d"
(subtract-time (current-time) (days-to-time 7)))))
:key ?w) t)
Another example where the user is prompted how many days old messages
should be shown:
(defun my/mu4e-bookmark-num-days-old-query (days-old)
(interactive (list (read-number "Show days old messages: " 7)))
(let ((start-date (subtract-time (current-time) (days-to-time days-old))))
(concat "maildir:/inbox AND date:"
(format-time-string "%Y%m%d" start-date))))
(add-to-list 'mu4e-bookmarks
`(:name "Inbox messages in the last 7 days"
:query ,(lambda () (call-interactively 'my/mu4e-bookmark-num-days-old-query))
:key ?o) t)
It is defining a function to make the code more readable.
7.2.3 Editing bookmarks before searching
----------------------------------------
There is also M-x mu4e-headers-search-bookmark-edit (key <B>), which
lets you edit the bookmarked query before invoking it. This can be
useful if you have many similar queries, but need to change some
parameter. For example, you could have a bookmark "date:today..now AND
"(1), which limits any result to todays messages.
---------- Footnotes ----------
(1) Not a valid search query by itself

File: mu4e.info, Node: Maildir searches, Next: Other search functionality, Prev: Bookmarks, Up: Searching
7.3 Maildir searches
====================
Maildir searches are quite similar to bookmark searches (see *note
Bookmarks::), with the difference being that the target is always a
maildir — maildir queries provide a traditional folder-like interface
to a search-based e-mail client. By default, maildir searches are
available in the *note Main view::, *note Headers view::, and *note
Message view::, with the key <j> (mu4e-jump-to-maildir). If a prefix
argument is given, the maildir query can be refined before execution.
7.3.1 Setting up maildir shortcuts
----------------------------------
You can search for maildirs like any other message property (e.g. with
a query like maildir:/myfolder), but since it is so common, mu4e offers
a shortcut for this.
For this to work, you need to set the variable
mu4e-maildir-shortcuts to the list of maildirs you want to have quick
access to, for example:
(setq mu4e-maildir-shortcuts
'( (:maildir "/inbox" :key ?i)
(:maildir "/archive" :key ?a)
(:maildir "/lists" :key ?l)
(:maildir "/work" :key ?w)
(:maildir "/sent" :key ?s)))
This sets <i> as a shortcut for the /inbox folder — effectively a
query maildir:/inbox. There is a special shortcut <o> or </> for
_other_ (so dont use those for your own shortcuts!), which allows you
to choose from _all_ maildirs that you have. There is support for
autocompletion; note that the list of maildirs is determined when mu4e
starts; if there are changes in the maildirs while mu4e is running, you
need to restart mu4e.
Each of the folder names is relative to your top-level maildir
directory; so if you keep your mail in ~/Maildir, /inbox would refer
to ~/Maildir/inbox. With these shortcuts, you can jump around your
maildirs (folders) very quickly — for example, getting to the /lists
folder only requires you to type jl, then change to /work with jw.
While in queries you need to quote folder names (maildirs) with
spaces in them, you should _not_ quote them when used in
mu4e-maildir-shortcuts, since mu4e does that automatically for you.
The very same shortcuts are used by M-x mu4e-mark-for-move (default
shortcut <m>); so, for example, if you want to move a message to the
/archive folder, you can do so by typing ma.

File: mu4e.info, Node: Other search functionality, Prev: Maildir searches, Up: Searching
7.4 Other search functionality
==============================
7.4.1 Navigating through search queries
---------------------------------------
You can navigate through previous/next queries using
mu4e-headers-query-prev and mu4e-headers-query-next, which are bound
to <M-left> and <M-right>, similar to what some web browsers do.
mu4e tries to be smart and not record duplicate queries. Also, the
number of queries remembered has a fixed limit, so mu4e wont use too
much memory, even if used for a long time. However, if you want to
forget previous/next queries, you can use M-x
mu4e-headers-forget-queries.
7.4.2 Narrowing search results
------------------------------
It can be useful to narrow existing search results, that is, to add some
clauses to the current query to match fewer messages.
For example, suppose youre looking at some mailing list, perhaps by
jumping to a maildir (M-x mu4e-headers-jump-to-maildir, <j>) or
because you followed some bookmark (M-x mu4e-headers-search-bookmark,
<b>). Now, you want to narrow things down to only those messages that
have attachments.
This is when M-x mu4e-headers-search-narrow (</>) comes in handy.
It asks for an additional search pattern, which is appended to the
current search query, in effect getting you the subset of the currently
shown headers that also match this extra search pattern. <\> takes you
back to the previous query, so, effectively widens the search.
Technically, narrowing the results of query x with expression y implies
doing a search (x) AND (y).
Note that messages that were not in your original search results
because of mu4e-headers-results-limit may show up in the narrowed
query.
7.4.3 Including related messages
--------------------------------
It can be useful to not only show the messages that directly match a
certain query, but also include messages that are related to these
messages. That is, messages that belong to the same discussion threads
are included in the results, just like e.g. Gmail does it. You can
enable this behavior by setting mu4e-headers-include-related to t,
and you can toggle between including/not-including with <W>.
Be careful though when e.g. deleting ranges of messages from a
certain folder — the list may now also include messages from _other_
folders.
7.4.4 Skipping duplicates
-------------------------
Another useful feature is skipping of _duplicate messages_. When you
have copies of messages, theres usually little value in including more
than one in search results. A common reason for having multiple copies
of messages is the combination of Gmail and offlineimap, since that is
the way the labels / virtual folders in Gmail are represented. You can
enable skipping duplicates by setting mu4e-headers-skip-duplicates to
t, and you can toggle between the skipping/not skipping with <V>.
Note, messages are considered duplicates when they have the same
Message-Id.

File: mu4e.info, Node: Marking, Next: Contexts, Prev: Searching, Up: Top
8 Marking
*********
In mu4e, the common way to do things with messages is a two-step process
- first you _mark_ them for a certain action, then you _execute_ (<x>)
those marks. This is similar to the way dired operates. Marking can
happen in both the *note Headers view:: and the *note Message view::.
* Menu:
* Marking messages::Selecting message do something with them
* What to mark for::What can we do with them
* Executing the marks::Do it
* Trashing messages::Exceptions for mailboxes like Gmail
* Leaving the headers buffer::Handling marks automatically when leaving
* Built-in marking functions::Helper functions for dealing with them
* Custom mark functions::Define your own mark function
* Adding a new kind of mark::Adding your own marks

File: mu4e.info, Node: Marking messages, Next: What to mark for, Up: Marking
8.1 Marking messages
====================
There are multiple ways to mark messages:
• _message at point_: you can put a mark on the message-at-point in
either the *note Headers view:: or *note Message view::
• _region_: you can put a mark on all messages in the current region
(selection) in the *note Headers view::
• _pattern_: you can put a mark on all messages in the *note Headers
view:: matching a certain pattern with M-x
mu4e-headers-mark-pattern (<%>)
• _thread/subthread_: You can put a mark on all the messages in the
thread/subthread at point with M-x mu4e-headers-mark-thread and
M-x mu4e-headers-mark-subthread, respectively

File: mu4e.info, Node: What to mark for, Next: Executing the marks, Prev: Marking messages, Up: Marking
8.2 What to mark for
====================
mu4e supports a number of marks:
mark for/as | keybinding | description
-------------+-------------+------------------------------
'something' | *, <insert> | mark now, decide later
delete | D, <delete> | delete
flag | + | mark as 'flagged' ('starred')
move | m | move to some maildir
read | ! | mark as read
refile | r | mark for refiling
trash | d | move to the trash folder
untrash | = | remove 'trash' flag
unflag | - | remove 'flagged' mark
unmark | u | remove mark at point
unmark all | U | remove all marks
unread | ? | marks as unread
action | a | apply some action
After marking a message, the left-most columns in the headers view
indicate the kind of mark. This is informative, but if you mark many
(say, thousands) messages, this slows things down significantly(1). For
this reason, you can disable this by setting mu4e-headers-show-target
to nil.
something is a special kind of mark; you can use it to mark messages
for something, and then decide later what the something should be(2)
Later, you can set the actual mark using M-x
mu4e-mark-resolve-deferred-marks (<#>). Alternatively, mu4e will ask
you when you try to execute the marks (<x>).
---------- Footnotes ----------
(1) this uses an Emacs feature called _overlays_, which are slow when
used a lot in a buffer
(2) This kind of deferred marking is similar to the facility in
dired, midnight commander (<https://www.midnight-commander.org/>) and
the like, and uses the same key binding (<insert>).

File: mu4e.info, Node: Executing the marks, Next: Trashing messages, Prev: What to mark for, Up: Marking
8.3 Executing the marks
=======================
After you have marked some messages, you can execute them with <x> (M-x
mu4e-mark-execute-all).
A hook, mu4e-mark-execute-pre-hook, is available which is run right
before execution of each mark. The hook is called with two arguments,
the mark and the message itself.

File: mu4e.info, Node: Trashing messages, Next: Leaving the headers buffer, Prev: Executing the marks, Up: Marking
8.4 Trashing messages
=====================
For regular mailboxes, trashing works like other marks: when executed,
the message is flagged as trashed. Depending on your mailbox provider,
the trash flag is used to automatically move the message to the trash
folder (mu4e-trash-folder) for instance.
Some mailboxes behave differently however and they dont interpret
the trash flag. In cases like Gmail, the message must be _moved_ to the
trash folder and the trash flag must not be used.

File: mu4e.info, Node: Leaving the headers buffer, Next: Built-in marking functions, Prev: Trashing messages, Up: Marking
8.5 Leaving the headers buffer
==============================
When you quit or update a headers buffer that has marked messages (for
example, by doing a new search), mu4e asks you what to do with them,
depending on the value of the variable mu4e-headers-leave-behavior
see its documentation.

File: mu4e.info, Node: Built-in marking functions, Next: Custom mark functions, Prev: Leaving the headers buffer, Up: Marking
8.6 Built-in marking functions
==============================
Some examples of mu4es built-in marking functions.
• _Mark the message at point for trashing_: press <d>
• _Mark all messages in the buffer as unread_: press C-x h o
• _Delete the messages in the current thread_: press T D
• _Mark messages with a subject matching “hello” for flagging_: press
% s hello RET.

File: mu4e.info, Node: Custom mark functions, Next: Adding a new kind of mark, Prev: Built-in marking functions, Up: Marking
8.7 Custom mark functions
=========================
Sometimes, the built-in functions to mark messages may not be sufficient
for your needs. For this, mu4e offers an easy way to define your own
custom mark functions. You can choose one of the custom marker
functions by pressing <&> in the *note Headers view:: and *note Message
view::.
Custom mark functions are to be appended to the list
mu4e-headers-custom-markers. Each of the elements of this list
(markers) is a list with two or three elements:
1. The name of the marker — a short string describing this marker.
The first character of this string determines its shortcut, so
these should be unique. If necessary, simply prefix the name with
a unique character.
2. a predicate function, taking two arguments MSG and PARAM. MSG is
the message plist (see *note Message functions::) and PARAM is a
parameter provided by the third of the marker elements (see the
next item). The predicate function should return non-nil if the
message matches.
3. (optionally) a function that is evaluated once, and the result is
passed as a parameter to the predicate function. This is useful
when user-input is needed.
Lets look at an example: suppose we want to match all messages that
have more than _n_ recipients — we could do this with the following
recipe:
(add-to-list 'mu4e-headers-custom-markers
'("More than n recipients"
(lambda (msg n)
(> (+ (length (mu4e-message-field msg :to))
(length (mu4e-message-field msg :cc))) n))
(lambda ()
(read-number "Match messages with more recipients than: "))) t)
After evaluating this expression, you can use it by pressing <&> in
the headers buffer to select a custom marker function, and then <M> to
choose this particular one (M because it is the first character of the
description).
As you can see, its not very hard to define simple functions to
match messages. There are more examples in the defaults for
mu4e-headers-custom-markers; see mu4e-headers.el and see *note
Extending mu4e:: for general information about writing your own
functions.

File: mu4e.info, Node: Adding a new kind of mark, Prev: Custom mark functions, Up: Marking
8.8 Adding a new kind of mark
=============================
It is possible to configure new marks. To do so, one can add entries in
the list mu4e-marks. Such an element must have the following form:
(SYMBOL
:char STRING
:prompt STRING
:ask-target (lambda () TARGET)
:dyn-target (lambda (TARGET MSG) DYN-TARGET)
:show-target (lambda (DYN-TARGET) STRING)
:action (lambda (DOCID MSG DYN-TARGET) nil))
The symbol can be any symbol, except for 'unmark and 'something,
which are reserved. The rest is a plist with the following elements:
:char — the character to display in the headers view.
:prompt — the prompt to use when asking for marks (used for
example when marking a whole thread).
:ask-target — a function run once per bulk-operation, and thus
suitable for querying the user about a target for move-like marks.
If nil, the TARGET passed to :dyn-target is nil.
:dyn-target — a function run once per message (The message is
passed as MSG to the function). This function allows to compute a
per-message target, for refile-like marks. If nil, the DYN-TARGET
passed to the :action is the TARGET obtained as above.
:show-target — how to display the target in the headers view. If
:show-target is nil the DYN-TARGET is shown (and DYN-TARGET must
be a string).
:action — the action to apply on the message when the mark is
executed.
As an example, suppose we would like to add a mark for tagging
messages (GMail-style), then we can run the following code (after
loading mu4e):
(add-to-list 'mu4e-marks
'(tag
:char "g"
:prompt "gtag"
:ask-target (lambda () (read-string "What tag do you want to add?"))
:action (lambda (docid msg target)
(mu4e-action-retag-message msg (concat "+" target)))))
As another example, suppose we would like to “archive and mark read”
a message (GMail-style), then we can run the following code (after
loading mu4e):
(add-to-list 'mu4e-marks
'(archive
:char "A"
:prompt "Archive"
:show-target (lambda (target) "archive")
:action (lambda (docid msg target)
;; must come before proc-move since retag runs
;; 'sed' on the file
(mu4e-action-retag-message msg "-\\Inbox")
(mu4e~proc-move docid nil "+S-u-N"))))
Adding to mu4e-marks list allows to use the mark in bulk operations
(for example when tagging a whole thread), but does not bind the mark to
a key to use at the top-level. This must be done separately. In our
example:
(mu4e~headers-defun-mark-for tag)
(mu4e~headers-defun-mark-for archive)
(define-key mu4e-headers-mode-map (kbd "g") 'mu4e-headers-mark-for-tag)
(define-key mu4e-headers-mode-map (kbd "A") 'mu4e-headers-mark-for-archive)

File: mu4e.info, Node: Contexts, Next: Dynamic folders, Prev: Marking, Up: Top
9 Contexts
**********
* Menu:
* What are contexts::Defining the concept
* Context policies::How to determine the current context
* Contexts and special folders::Using context variables to determine them
* Contexts example::How to define contexts
It can be useful to switch between different sets of settings in mu4e; a
typical example is the case where you have different e-mail accounts for
private and work email, each with their own values for folders, e-mail
addresses, mailservers and so on.
The mu4e-context system is a mu4e-specific mechanism to allow for
that; users can define different contexts corresponding with groups of
setting and either manually switch between them, or let mu4e determine
the right context based on some user-provided function.
Note that there are a number of existing ways to switch accounts in
mu4e, for example using the method described in the *note Tips and
Tricks:: section of this manual. Those still work — but the new
mechanism has the benefit of being a core part of mu4e, thus allowing
for deeper integration.

File: mu4e.info, Node: What are contexts, Next: Context policies, Up: Contexts
9.1 What are contexts
=====================
Lets see whats contained in a context. Most of it is optional.
A mu4e-context is Lisp object with the following members:
• name: the name of the context, e.g. work or private
• vars: an association-list (alist) of variable settings for this
account.
• enter-func: an (optional) function that takes no parameter and is
invoked when entering the context. You can use this for extra
setup etc.
• leave-func: an (optional) function that takes no parameter and is
invoked when leaving the context. You can use this for clearing
things up.
• match-func: an (optional) function that takes an MSG message plist
as argument, and returns non-nil if this context matches the
situation. mu4e uses the first context that matches, in a couple
of situations:
• when starting mu4e to determine the starting context; in this
case, MSG is nil. You can use e.g. the host youre running
or the time of day to determine which context matches.
• before replying to or forwarding a message with the given
message plist as parameter, or nil when composing a brand new
message. The function should return t when this context is
the right one for this message, or nil otherwise.
• when determining the target folders for deleting, refiling
etc; see *note Contexts and special folders::.
mu4e uses a variable mu4e-contexts, which is a list of such
objects.

File: mu4e.info, Node: Context policies, Next: Contexts and special folders, Prev: What are contexts, Up: Contexts
9.2 Context policies
====================
When you have defined contexts and you start mu4e it decides which
context to use based on the variable mu4e-context-policy; similarly,
when you compose a new message, the context is determined using
mu4e-compose-context-policy.
For both of these, you can choose one of the following policies:
• a symbol always-ask: unconditionally ask the user what context to
pick.
The other choices only apply if none of the contexts match (i.e.,
none of the contexts match-functions returns t). We have the
following options:
• a symbol ask: ask the user if mu4e cant figure things out the
context by itself (through the match-function). This is a good
policy if there are no match functions, or if the match functions
dont cover all cases.
• a symbol ask-if-none: if theres already a context, dont change
it; otherwise, ask the user.
• a symbol pick-first: pick the first (default) context. This is a
good choice if you want to specify context for special case, and
fall back to the first one if none match.
nil: dont change the context; this is useful if you dont change
contexts very often, and e.g. manually changes contexts with M-x
mu4e-context-switch.

File: mu4e.info, Node: Contexts and special folders, Next: Contexts example, Prev: Context policies, Up: Contexts
9.3 Contexts and special folders
================================
As we discussed in *note Folders:: and *note Dynamic folders::, mu4e
recognizes a number of special folders: mu4e-sent-folder,
mu4e-drafts-folder, mu4e-trash-folder and mu4e-refile-folder.
When you have a headers-buffer with messages that belong to different
contexts (say, a few different accounts), it is desirable for each of
them to use the specific folders for their own context — so, for
instance, if you trash a message, it needs to go to the trash-folder for
the account it belongs to, which is not necessarily the current context.
To make this easy to do, whenever mu4e needs to know the value for
such a special folder for a given message, it tries to determine the
appropriate context using mu4e-context-determine (and policy nil; see
*note Context policies::). If it finds a matching context, it let-binds
the vars for that account, and then determines the value for the
folder. It does not, however, call the enter-func or leave-func,
since we are not really switching contexts.
In practice, this means that as long as each of the accounts has a
good match-func, all message operations automatically find the
appropriate folders.

File: mu4e.info, Node: Contexts example, Prev: Contexts and special folders, Up: Contexts
9.4 Example
===========
Lets explain how contexts work by looking at an example. We define two
contexts, Private and Work for a fictional user _Alice Derleth_.
Note that in this case, we automatically switch to the first context
when starting; see the discussion in the previous section.
(setq mu4e-contexts
`( ,(make-mu4e-context
:name "Private"
:enter-func (lambda () (mu4e-message "Entering Private context"))
:leave-func (lambda () (mu4e-message "Leaving Private context"))
;; we match based on the contact-fields of the message
:match-func (lambda (msg)
(when msg
(mu4e-message-contact-field-matches msg
:to "aliced@home.example.com")))
:vars '( ( user-mail-address . "aliced@home.example.com" )
( user-full-name . "Alice Derleth" )
( mu4e-compose-signature .
(concat
"Alice Derleth\n"
"Lauttasaari, Finland\n"))))
,(make-mu4e-context
:name "Work"
:enter-func (lambda () (mu4e-message "Switch to the Work context"))
;; no leave-func
;; we match based on the maildir of the message
;; this matches maildir /Arkham and its sub-directories
:match-func (lambda (msg)
(when msg
(string-match-p "^/Arkham" (mu4e-message-field msg :maildir))))
:vars '( ( user-mail-address . "aderleth@miskatonic.example.com" )
( user-full-name . "Alice Derleth" )
( mu4e-compose-signature .
(concat
"Prof. Alice Derleth\n"
"Miskatonic University, Dept. of Occult Sciences\n"))))
,(make-mu4e-context
:name "Cycling"
:enter-func (lambda () (mu4e-message "Switch to the Cycling context"))
;; no leave-func
;; we match based on the maildir of the message; assume all
;; cycling-related messages go into the /cycling maildir
:match-func (lambda (msg)
(when msg
(string= (mu4e-message-field msg :maildir) "/cycling")))
:vars '( ( user-mail-address . "aderleth@example.com" )
( user-full-name . "AliceD" )
( mu4e-compose-signature . nil)))))
;; set `mu4e-context-policy` and `mu4e-compose-policy` to tweak when mu4e should
;; guess or ask the correct context, e.g.
;; start with the first (default) context;
;; default is to ask-if-none (ask when there's no context yet, and none match)
;; (setq mu4e-context-policy 'pick-first)
;; compose with the current context is no context matches;
;; default is to ask
;; (setq mu4e-compose-context-policy nil)
A couple of notes about this example:
• You can manually switch the context use M-x mu4e-context-switch,
by default bound to ; in headers, view and main mode. The
current context appears in the mode-line.
• Normally, M-x mu4e-context-switch does not call the enter or
leave functions if the new context is the same as the old one.
However, with a prefix-argument (C-u), you can force mu4e to
invoke those function even in that case.
• The function mu4e-context-current returns the current-context;
the current context is also visible in the mode-line when in
headers, view or main mode.
• You can set any kind of variable; including settings for mail
servers etc. However, settings such as mu4e-mu-home are not
changeable after they have been set without quitting mu4e first.
leave-func (if defined) for the context we are leaving, is
invoked before the enter-func (if defined) of the context we are
entering.
enter-func (if defined) is invoked before setting the variables.
match-func (if defined) is invoked just before
mu4e-compose-pre-hook.
• See the variables mu4e-context-policy and
mu4e-compose-context-policy to tweak what mu4e should do when no
context matches (or if you always want to be asked).
• Finally, be careful to get the quotations right — backticks, single
quotes and commas and note the . between variable name and its
value.

File: mu4e.info, Node: Dynamic folders, Next: Actions, Prev: Contexts, Up: Top
10 Dynamic folders
******************
In *note Folders::, we explained how you can set up mu4es special
folders:
(setq
mu4e-sent-folder "/sent" ;; sent messages
mu4e-drafts-folder "/drafts" ;; unfinished messages
mu4e-trash-folder "/trash" ;; trashed messages
mu4e-refile-folder "/archive") ;; saved messages
In some cases, having such static folders may not suffice — perhaps
you want to change the folders depending on the context. For example,
the folder for refiling could vary, based on the sender of the message.
To make this possible, instead of setting the standard folders to a
string, you can set them to be a _function_ that takes a message as its
parameter, and returns the desired folder name. This chapter shows you
how to do that. For a more general discussion of how to extend mu4e and
writing your own functions, see *note Extending mu4e::.
If you use mu4e-context, see *note Contexts and special folders:: for
what that means for these special folders.
* Menu:
* Smart refiling:: Automatically choose the target folder
* Other dynamic folders:: Flexible folders for sent, trash, drafts

File: mu4e.info, Node: Smart refiling, Next: Other dynamic folders, Up: Dynamic folders
10.1 Smart refiling
===================
When refiling messages, perhaps to archive them, it can be useful to
have different target folders for different messages, based on some
property of those message — smart refiling.
To accomplish this, we can set the refiling folder
(mu4e-refile-folder) to a function that returns the actual refiling
folder for the particular message. An example should clarify this:
(setq mu4e-refile-folder
(lambda (msg)
(cond
;; messages to the mu mailing list go to the /mu folder
((mu4e-message-contact-field-matches msg :to
"mu-discuss@googlegroups.com")
"/mu")
;; messages sent directly to some spefic address me go to /private
((mu4e-message-contact-field-matches msg :to "me@example.com")
"/private")
;; messages with football or soccer in the subject go to /football
((string-match "football\\|soccer"
(mu4e-message-field msg :subject))
"/football")
;; messages sent by me go to the sent folder
((mu4e-message-sent-by-me msg
(mu4e-personal-addresses))
mu4e-sent-folder)
;; everything else goes to /archive
;; important to have a catch-all at the end!
(t "/archive"))))
This can be very powerful; you can select some messages in the headers
view, then press <r>, and have them all marked for refiling to their
particular folders.
Some notes:
• We set mu4e-refile-folder to an anonymous (lambda) function.
This function takes one argument, a message plist(1). The plist
corresponds to the message at point. See *note Message functions::
for a discussion on how to deal with them.
• In our function, we use a cond control structure; the function
returns the first of the clauses that matches. Its important to
make the last clause a catch-all, so we always return _some_
folder.
• We use the convenience function
mu4e-message-contact-field-matches, which evaluates to t if any
of the names or e-mail addresses in a contact field (in this case,
the To:-field) matches the regular expression. With mu4e version
0.9.16 or newer, the contact field can in fact be a list instead of
a single value, such as '(:to :cc)'.
---------- Footnotes ----------
(1) a property list describing a message

File: mu4e.info, Node: Other dynamic folders, Prev: Smart refiling, Up: Dynamic folders
10.2 Other dynamic folders
==========================
Using the same mechanism, you can create dynamic sent-, trash-, and
drafts-folders. The message-parameter you receive for the sent and
drafts folder is the _original_ message, that is, the message you reply
to, or forward, or edit. If there is no such message (for example when
composing a brand new message) the message parameter is nil.
Lets look at an example. Suppose you want a different trash folder
for work-email. You can achieve this with something like:
(setq mu4e-trash-folder
(lambda (msg)
;; the 'and msg' is to handle the case where msg is nil
(if (and msg
(mu4e-message-contact-field-matches msg :to "me@work.example.com"))
"/trash-work"
"/trash")))
Good to remember:
• The MSG parameter you receive in the function refers to the
_original message_, that is, the message being replied to or
forwarded. When re-editing a message, it refers to the message
being edited. When you compose a totally new message, the MSG
parameter is nil.
• When re-editing messages, the value of mu4e-drafts-folder is
ignored.

File: mu4e.info, Node: Actions, Next: Extending mu4e, Prev: Dynamic folders, Up: Top
11 Actions
**********
mu4e lets you define custom actions for messages in *note Headers view::
and for both messages and attachments in *note Message view::. Custom
actions allow you to easily extend mu4e for specific needs — for
example, marking messages as spam in a spam filter or applying an
attachment with a source code patch.
You can invoke the actions with key <a> for actions on messages, and
key <A> for actions on attachments.
For general information extending mu4e and writing your own
functions, see *note Extending mu4e::.
* Menu:
* Defining actions::How to create an action
* Headers view actions::Doing things with message headers
* Message view actions::Doing things with messages
* Attachment actions::Doing things with attachments
* Example actions::Some more examples

File: mu4e.info, Node: Defining actions, Next: Headers view actions, Up: Actions
11.1 Defining actions
=====================
Defining a new custom action comes down to writing an elisp-function to
do the work. Functions that operate on messages receive a MSG
parameter, which corresponds to the message at point. Something like:
(defun my-action-func (msg)
"Describe my message function."
;; do stuff
)
Functions that operate on attachments receive a MSG parameter, which
corresponds to the message at point, and an ATTACHMENT-NUM, which is the
number of the attachment as seen in the message view. An attachment
function looks like:
(defun my-attachment-action-func (msg attachment-num)
"Describe my attachment function."
;; do stuff
)
After you have defined your function, you can add it to the list of
actions(1), either mu4e-headers-actions, mu4e-view-actions or
mu4e-view-attachment-actions. The format(2) of each action is a
cons-cell, (DESCRIPTION . VALUE); see below for some examples. If
your shortcut is not also the first character of the description, simply
prefix the description with that character.
Lets look at some examples.
---------- Footnotes ----------
(1) Instead of defining the functions separately, you can obviously
also add a lambda-function directly to the list; however, separate
functions are easier to change
(2) Note, the format of the actions has changed since version
0.9.8.4, and you must change your configuration to use the new format;
mu4e warns you when you are using the old format.

File: mu4e.info, Node: Headers view actions, Next: Message view actions, Prev: Defining actions, Up: Actions
11.2 Headers view actions
=========================
Suppose we want to inspect the number of recipients for a message in the
*note Headers view::. We add the following to our configuration:
(defun show-number-of-recipients (msg)
"Display the number of recipients for the message at point."
(message "Number of recipients: %d"
(+ (length (mu4e-message-field msg :to))
(length (mu4e-message-field msg :cc)))))
;; define 'N' (the first letter of the description) as the shortcut
;; the 't' argument to add-to-list puts it at the end of the list
(add-to-list 'mu4e-headers-actions
'("Number of recipients" . show-number-of-recipients) t)
After evaluating this, a N in the headers view shows the number of
recipients for the message at point.

File: mu4e.info, Node: Message view actions, Next: Attachment actions, Prev: Headers view actions, Up: Actions
11.3 Message view actions
=========================
As another example, suppose we would like to search for messages by the
sender of the message at point:
(defun search-for-sender (msg)
"Search for messages sent by the sender of the message at point."
(mu4e-headers-search
(concat "from:" (cdar (mu4e-message-field msg :from)))))
;; define 'x' as the shortcut
(add-to-list 'mu4e-view-actions
'("xsearch for sender" . search-for-sender) t)
If you wonder why we use cdar, remember that the From:-field is a
list of (NAME . EMAIL) cells; thus, cdar gets us the e-mail address
of the first in the list. From:-fields rarely contain multiple cells.

File: mu4e.info, Node: Attachment actions, Next: Example actions, Prev: Message view actions, Up: Actions
11.4 Attachment actions
=======================
Finally, lets define an attachment action. As mentioned,
attachment-action functions receive _2_ arguments, the message and the
attachment number to use.
The following example action counts the number of lines in an
attachment, and defines <n> as its shortcut key (the <n> is prefixed to
the description).
(defun count-lines-in-attachment (msg attachnum)
"Count the number of lines in an attachment."
(mu4e-view-pipe-attachment msg attachnum "wc -l"))
;; defining 'n' as the shortcut
(add-to-list 'mu4e-view-attachment-actions
'("ncount lines" . count-lines-in-attachment) t)

File: mu4e.info, Node: Example actions, Prev: Attachment actions, Up: Actions
11.5 Example actions
====================
mu4e includes a number of example actions in the file mu4e-actions.el
in the source distribution (see C-h f mu4e-action-TAB). For example,
for viewing messages in an external web browser, or listening to a
messages body-text using text-to-speech.

File: mu4e.info, Node: Extending mu4e, Next: Old message view, Prev: Actions, Up: Top
12 Extending mu4e
*****************
mu4e is designed to be easily extensible — that is, write your own
emacs-lisp to make mu4e behave exactly as you want. Here, we provide
some guidelines for doing so.
* Menu:
* Extension points::Where to hook into mu4e
* Available functions::General helper functions
* Message functions::Working with messages
* Contact functions::Working with contacts
* Utility functions::Miscellaneous helpers

File: mu4e.info, Node: Extension points, Next: Available functions, Up: Extending mu4e
12.1 Extension points
=====================
There are a number of places where mu4e lets you plug in your own
functions:
• Custom functions for message headers in the message-view and
headers-view — see *note HV Custom headers::, *note OMSGV Custom
headers::
• Using message-specific folders for drafts, trash, sent messages and
refiling, based on a function — see *note Dynamic folders::
• Using an attachment-specific download-directory — see the variable
mu4e-attachment-dir.
• Apply a function to a message in the headers view - see *note
Headers view actions::
• Apply a function to a message in the message view — see *note
Message view actions::
• Add a new kind of mark for use in the headers view - see *note
Adding a new kind of mark::
• Apply a function to an attachment — see *note Attachment actions::
• Custom function to mark certain messages — see *note Custom mark
functions::
• Using various _mode_-hooks, mu4e-compose-pre-hook (see *note
Compose hooks::), mu4e-index-updated-hook (see *note FAQ::)
You can also write your own functions without using the above. If you
want to do so, key useful functions are mu4e-message-at-point (see
below), mu4e-headers-for-each (to iterate over all headers, see its
docstring) and mu4e-view-for-each-part (to iterate over all
parts/attachments, see its docstring). There is also
mu4e-view-for-each-uri to iterate of all the URIs in the current
message.
Another useful function is mu4e-headers-find-if which searches for
a message matching a certain pattern; again, see its docstring.

File: mu4e.info, Node: Available functions, Next: Message functions, Prev: Extension points, Up: Extending mu4e
12.2 Available functions
========================
The whole of mu4e consists of hundreds of elisp functions. However, the
majority of those are for _internal_ use only; you can recognize them
easily, because they all start with mu4e~. These functions make all
kinds of assumptions, and they are subject to change, and should
therefore _not_ be used. The same is true for _variables_ that start
with mu4e~; dont touch them. Let me repeat that:
Do not use mu4e~... functions or variables!
In addition, you should use functions in the right context; functions
that start with mu4e-view- are only applicable to the message view,
while functions starting with mu4e-headers- are only applicable to the
headers view. Functions without such prefixes are applicable
everywhere.

File: mu4e.info, Node: Message functions, Next: Contact functions, Prev: Available functions, Up: Extending mu4e
12.3 Message functions
======================
Many functions in mu4e deal with message plists (property lists). They
contain information about messages, such as sender and recipient,
subject, date and so on. To deal with these plists, there are a number
of mu4e-message- functions (in mu4e-message.el), such as
mu4e-message-field and mu4e-message-at-point, and a shortcut to
combine the two, mu4e-message-field-at-point.
For example, to get the subject of the message at point, in either
the headers view or the message view, you could write:
(mu4e-message-field (mu4e-message-at-point) :subject)
Note that:
• The contact fields (To, From, Cc, Bcc) are lists of cons-pairs
(name . email); name may be nil. So, for example:
(mu4e-message-field some-msg :to)
;; => (("Jack" . "jack@example.com") (nil . "foo@example.com"))
If you are only looking for a match in this list (e.g., “Is Jack
one of the recipients of the message?”), there is a convenience
function mu4e-message-contact-field-matches to make this easy.
• The message body is only available in the message view, not in the
headers view.
Note that in headers-mode, you only have access to a reduced message
plist, without the information about the message-body or mime-parts;
mu4e does this for performance reasons. And even in view-mode, you do
not have access to arbitrary message-headers.
However, it is possible to get the information indirectly, using the
raw-message and some third-party tool like procmails formail:
(defun my-mu4e-any-message-field-at-point (hdr)
"Quick & dirty way to get an arbitrary header HDR at
point. Requires the 'formail' tool from procmail."
(replace-regexp-in-string "\n$" ""
(shell-command-to-string
(concat "formail -x " hdr " -c < "
(shell-quote-argument (mu4e-message-field-at-point :path))))))
12.3.1 Rewriting the message body
---------------------------------
Message body rewriting allows you to modify the message text that is
presented in the message view. This can be useful if the message needs
special processing, for instance for special filling or cleaning up
encoding artifacts (this is what mu4e uses this for internally).
To enable this, you can append your rewrite-function to
mu4e-message-body-rewrite-functions; your function is expected to take
two parameters MSG and TXT, which are the message-plist and the
body-text, which could be the result of earlier transformations,
including html->text conversion as per mu4e-html2-text-command. The
function is expected to return the transformed text.
As a fairly useless example, suppose we insist on reading mu4e as
MU4E:
(defun mu4e-to-MU4E-rewrite (msg txt)
(replace-regexp-in-string "mu4e" "MU4E" txt))
(add-to-list 'mu4e-message-body-rewrite-functions 'mu4e-to-MU4E-rewrite t)

File: mu4e.info, Node: Contact functions, Next: Utility functions, Prev: Message functions, Up: Extending mu4e
12.4 Contact functions
======================
It can sometimes be useful to discard or rewrite the contact information
that mu4e provides, for example to fix spelling errors, or omit unwanted
contacts.
To handle this, mu4e provides mu4e-contact-process-function, which,
if defined, is applied to each contact. If the result is nil, the
contact is discarded, otherwise the (modified or not) contact
information is used.
Each contact is a full e-mail address as you would see in a
contact-field of an e-mail message, e.g.,
"Foo Bar" <foo.bar@example.com>
or
cuux@example.com
An example mu4e-contact-process-function might look like:
(defun my-contact-processor (contact)
(cond
;; remove unwanted
((string-match-p "evilspammer@example.com" contact) nil)
((string-match-p "noreply" contact) nil)
;;
;; jonh smiht --> John Smith
((string-match "jonh smiht" contact)
(replace-regexp-in-string "jonh smiht" "John Smith" contact))
(t contact)))
(setq mu4e-contact-process-function 'my-contact-processor)

File: mu4e.info, Node: Utility functions, Prev: Contact functions, Up: Extending mu4e
12.5 Utility functions
======================
mu4e-utils contains a number of utility functions; we list a few here.
See their docstrings for details:
mu4e-read-option: read one option from a list. For example:
(mu4e-read-option "Choose an animal: "
'(("Monkey" . monkey) ("Gnu" . gnu) ("xMoose" . moose)))
The user is presented with:
Choose an animal: [M]onkey, [G]nu, [x]Moose
mu4e-ask-maildir: ask for a maildir; try one of the shortcuts
(mu4e-maildir-shortcuts), or the full set of available maildirs.
mu4e-running-p: return t if the mu4e process is running, nil
otherwise.
(mu4e-user-mail-address-p addr): return t if ADDR is one of the
users e-mail addresses (as per (mu4e-personal-addresses)).
mu4e-log logs to the mu4e debugging log if it is enabled; see
mu4e-toggle-logging.
mu4e-message, mu4e-warning, mu4e-error are the mu4e
equivalents of the normal elisp message, user-error and error
functions.

File: mu4e.info, Node: Old message view, Next: Other tools, Prev: Extending mu4e, Up: Top
Appendix A The old message view
*******************************
Since version 1.6 mu4e defaults to the new, Gnus-based, message view, as
described in *Note Message view::, and we recommend it for all users.
However, the older view is still available, and this chapter is about
that one. While we recommend using the default one, you can still use
the old one by configuring it _before_ requireing mu4e:
(setq mu4e-view-use-old t)
Users of use-package(1) can use the :init section for this.
If you want to change this, you need to fully restart mu4e (in
practice, this means you need to restart emacs.
After selecting a message in the *note Headers view::, it appears in
a message view window, which shows the message headers, followed by the
message body. Its major mode is mu4e-view-mode.
* Menu:
* Overview: OMSGV Overview. What is the Message View
* Keybindings: OMSGV Keybindings. Do things with your keyboard
* Attachments:: Opening and saving them
* Viewing images inline::Images display inside emacs
* Displaying rich-text messages::Dealing with HTML mail
* Verifying signatures and decryption: OMSGV Crypto. Support for cryptography
* Custom headers: OMSGV Custom headers. Your own headers
* Actions: OMSGV Actions. Defining and using actions.
---------- Footnotes ----------
(1) <https://jwiegley.github.io/use-package/>

File: mu4e.info, Node: OMSGV Overview, Next: OMSGV Keybindings, Up: Old message view
A.1 Overview
============
An example message view:
From: randy@epiphyte.com
To: julia@eruditorum.org
Subject: Re: some pics
Flags: (seen attach)
Date: Mon 19 Jan 2004 09:39:42 AM EET
Maildir: /inbox
Attachments(2): [1]DSCN4961.JPG(1.3M), [2]DSCN4962.JPG(1.4M)
Hi Julia,
Some pics from our trip to Cerin Amroth. Enjoy!
All the best,
Randy.
On Sun 21 Dec 2003 09:06:34 PM EET, Julia wrote:
[....]
Some notes:
• The variable mu4e-view-fields determines the header fields to be
shown; see mu4e-header-info for a list of built-in fields. Apart
from the built-in fields, you can also create custom fields using
mu4e-header-info-custom; see *note OMSGV Custom headers::.
• You can set the date format with the variable
mu4e-date-format-long.
• By default, only the names of contacts in address fields are
visible (see mu4e-view-show-addresses to change this). You can
view the e-mail addresses by clicking on the name, or pressing
<M-RET>.
• You can compose a message for the contact at point by either
clicking <[mouse-2]> or pressing <C>.
• The body text can be line-wrapped using visual-line-mode. mu4e
defines <w> to toggle between the wrapped and unwrapped state. If
you want to do this automatically when viewing a message, invoke
visual-line-mode in your mu4e-view-mode-hook.
• For messages that support it, you can toggle between html and text
versions using mu4e-view-toggle-html, bound to <h>;
• You can hide cited parts in messages (the parts starting with “>”)
using mu4e-view-hide-cited, bound to <#>. If you want to do this
automatically for every message, invoke the function in your
mu4e-view-mode-hook.
• For search-related operations, see *note Searching::.
• You can scroll down the message using <SPC>; if you do this at the
end of a message,it automatically takes you to the next one. If
you want to prevent this behavior, set mu4e-view-scroll-to-next
to nil.

File: mu4e.info, Node: OMSGV Keybindings, Next: Attachments, Prev: OMSGV Overview, Up: Old message view
A.2 Keybindings
===============
You can find most things you can do with this message in the _Mu4e_
menu, or by using the keyboard; the default bindings are:
key description
==============================================================
n,p view the next, previous message
],[ move to the next, previous unread message
y select the headers view (if it's visible)
RET scroll down
M-RET open URL at point / attachment at point
SPC scroll down, if at end, move to next message
S-SPC scroll up
searching
---------
s search
e edit last query
/ narrow the search
b search bookmark
B edit bookmark before search
j jump to maildir
M-left previous query
M-right next query
marking
-------
d mark for moving to the trash folder
= mark for removing trash flag ('untrash')
DEL,D mark for complete deletion
m mark for moving to another maildir folder
r mark for refiling
+,- mark for flagging/unflagging
u unmark message at point
U unmark *all* messages
% mark based on a regular expression
T,t mark whole thread, subthread
<insert>,* mark for 'something' (decide later)
# resolve deferred 'something' marks
x execute actions for the marked messages
composition
-----------
R,F,C reply/forward/compose
E edit (only allowed for draft messages)
actions
-------
g go to (visit) numbered URL (using `browse-url')
(or: <mouse-1> or M-RET with point on url)
C-u g visits multiple URLs
f fetch (download )the numbered URL.
C-u f fetches multiple URLs
k save the numbered URL in the kill-ring.
C-u k saves multiple URLs
e extract (save) one or more attachments (asks for numbers)
(or: <mouse-2> or S-RET with point on attachment)
o open attachment (asks for number)
(or: <mouse-1> or M-RET with point on attachment)
a execute some custom action on the message
A execute some custom action on an attachment
misc
----
; switch context
c copy address at point (with C-u copy long version)
h toggle between html/text (if available)
w toggle line wrapping
# toggle show/hide cited parts
v show details about the cryptographic signature
. show the raw message view. 'q' takes you back.
C-+,C-- increase / decrease the number of headers shown
H get help
C-S-u update mail & reindex
q leave the message view
For the marking commands, please refer to *note Marking messages::.

File: mu4e.info, Node: Attachments, Next: Viewing images inline, Prev: OMSGV Keybindings, Up: Old message view
A.3 Attachments
===============
By default, mu4e uses the xdg-open-program (1) or (on OS X) the open
program for opening attachments. If you want to use another program,
you do so by setting the MU_PLAY_PROGRAM environment variable to the
program to be used.
The default directory for attaching and extracting (saving)
attachmentsis your home directory (~/); you can change this using the
variable mu4e-attachment-dir, for example:
(setq mu4e-attachment-dir "~/Downloads")
For more flexibility, mu4e-attachment-dir can also be a
user-provided function. This function receives two parameters: the
file-name and the mime-type as found in the e-mail message(2) of the
attachment, either or both of which can be nil. For example:
(setq mu4e-attachment-dir
(lambda (fname mtype)
(cond
;; docfiles go to ~/Desktop
((and fname (string-match "\\.doc$" fname)) "~/Desktop")
;; ... other cases ...
(t "~/Downloads")))) ;; everything else
You can extract multiple attachments at once by prefixing the
extracting command by <C-u>; so C-u e asks you for a range of
attachments to extract (for example, 1 3-6 8). The range "a" is a
shortcut for _all_ attachments.
---------- Footnotes ----------
(1) <https://www.freedesktop.org/wiki/Software/xdg-utils/>
(2) sadly, often application/octet-stream is used for the mime-type,
even if a better type is available

File: mu4e.info, Node: Viewing images inline, Next: Displaying rich-text messages, Prev: Attachments, Up: Old message view
A.4 Viewing images inline
=========================
It is possible to show images inline in the message view buffer if you
run Emacs in GUI-mode. You can enable this by setting the variable
mu4e-view-show-images to t. Since Emacs does not always handle images
correctly, this is not enabled by default. If you are using Emacs 24
with _ImageMagick_(1) support, make sure you call
imagemagick-register-types in your configuration, so it is used for
images.
;; enable inline images
(setq mu4e-view-show-images t)
;; use imagemagick, if available
(when (fboundp 'imagemagick-register-types)
(imagemagick-register-types))
---------- Footnotes ----------
(1) <http://www.imagemagick.org/>

File: mu4e.info, Node: Displaying rich-text messages, Next: OMSGV Crypto, Prev: Viewing images inline, Up: Old message view
A.5 Displaying rich-text messages
=================================
mu4e normally prefers the plain-text version for messages that consist
of both a plain-text and html (rich-text) versions of the body-text.
You can change this by setting mu4e-view-prefer-html to t. And you
can toggle this value (globally) using h in the message view; this
also refreshes the message with the new setting.
Note, when using html-based rendering, you dont get the hyperlink
shortcuts the text-version provides.
If there is only an html-version, or if the plain-text version is too
short in comparison with the html part(1), mu4e tries to convert the
html into plain-text for display.
With emacs 24.4 or newer, this defaults to mu4e-shr2text, which
uses the built-in shr renderer. For older emacs versions, this defaults
to the built-in html2text function. In practice, the latter gives
much better results.
If you use mu4e-shr2text, it might be useful to emulate some of the
shr key bindings, with something like:
(add-hook 'mu4e-view-mode-hook
(lambda()
;; try to emulate some of the eww key-bindings
(local-set-key (kbd "<tab>") 'shr-next-link)
(local-set-key (kbd "<backtab>") 'shr-previous-link)))
If youre using a dark theme, and the messages are hard to read, it
can help to change the luminosity, e.g.:
(setq shr-color-visible-luminance-min 80)
If your emacs does not have shr yet, it can be useful to use a custom
method. For that, you can set the variable mu4e-html2text-command to
either a shell command or a function instead.
A.5.1 Html2text commands
------------------------
If mu4e-html2text-command is a shell command, it is expected to take
html from standard input and write plain text in UTF-8 encoding on
standard output.
An example of such a program is the program that is actually _called_
html2text(2). After installation, you can set it up with something like
the following:
(setq mu4e-html2text-command "html2text -utf8 -width 72")
An alternative to this is the Python python-html2text package; after
installing that, you can tell mu4e to use it with something like:
(setq mu4e-html2text-command
"html2markdown | grep -v '&nbsp_place_holder;'")
On OS X, there is a program called textutil as yet another
alternative:
(setq mu4e-html2text-command
"textutil -stdin -format html -convert txt -stdout")
A.5.2 Html2text functions
-------------------------
If mu4e-html2text-command refers to an elisp function, the function is
expected to take a message plist as its input, and returns the
transformed data.
You can easily create your own function, for instance:
(defun my-mu4e-html2text (msg)
"My html2text function; shows short message inline, show
long messages in some external browser (see `browse-url-generic-program')."
(let ((html (or (mu4e-message-field msg :body-html) "")))
(if (> (length html) 20000)
(progn
(mu4e-action-view-in-browser msg)
"[Viewing message in external browser]")
(mu4e-shr2text msg))))
(setq mu4e-html2text-command 'my-mu4e-html2text)
A.5.3 Privacy aspects
---------------------
When opening your messages in a graphical browser, it may expose you
doing so to the sender, due to the presence of specially crafted image
URLs, or Javascript.
If that is an issue, it is recommended to use a browser (or browser
profile) that does not load images. The same applies to Javascript.
---------- Footnotes ----------
(1) this is e.g. for the case where the text-part is only a short
blurb telling you to use the html-version; see
mu4e-view-html-plaintext-ratio-heuristic
(2) <http://www.mbayer.de/html2text/>

File: mu4e.info, Node: OMSGV Crypto, Next: OMSGV Custom headers, Prev: Displaying rich-text messages, Up: Old message view
A.6 Crypto
==========
The mu4e message view supports decryption of encrypted messages, as well
as verification of signatures. For signing/encrypting messages your
outgoing messages, see *note Signing and encrypting::.
For all of this to work, gpg-agent must be running, and it must set
the environment variable GPG_AGENT_INFO. You can check from Emacs with
<M-x getenv GPG_AGENT_INFO>.
In many mainstream Linux/Unix desktop environments, everything works
out-of-the-box, but if your environment does not automatically start
gpg-agent, you can do so by hand:
$ eval $(gpg-agent --daemon)
This starts the daemon, and sets the environment variable.
Some users have reported problems with certain S/MIME-signed messages
where mu checks if the certificate has been revoked. This can be
avoided by adding disable-crl-checks to ~/.gnupg/gpgsm.conf;
alternatively, you could use the gnus-based viewer.
A.6.1 Decryption
----------------
If you receive messages that are encrypted (using PGP/MIME), mu4e can
try to decrypt them, base on the setting of mu4e-decryption-policy.
If you set it to t, mu4e attempts to decrypt messages automatically;
this is the default. If you set it to nil, mu4e _wont_ attempt to
decrypt anything. Finally, if you set it to 'ask, it asks you what to
do, each time an encrypted message is encountered.
When opening an encrypted message, mu consults gpg-agent to see if it
already has unlocked the key needed to decrypt the message; if not, it
prompts you for a password (typically with a separate top-level window).
This is only needed once per session.
A.6.2 Verifying signatures
--------------------------
Some e-mail messages are cryptographically signed, and mu4e can check
the validity of these signatures. If a message has one or more
signatures, the message view shows an extra header Signature: (assuming
it is part of your mu4e-view-fields), and one or more verdicts of
the signatures found; either verified, unverified or error. For
instance:
Signature: unverified (Details)
or
Signature: verified Darrow Andromedus <darrow@rising.com> (Details)
You can see the details of the signature verification by activating
the Details or pressing <v>. This pops up a little window with the
details of the signatures found and whether they could be verified or
not.
Note that mu4e does not check whether the signer is the same as the
sender of the message, since this would cause too many false negatives
for senders that use an address that is not part of their certificate.
Also, the From: address can easily be forged.
For more information, see the mu-verify manual page.

File: mu4e.info, Node: OMSGV Custom headers, Next: OMSGV Actions, Prev: OMSGV Crypto, Up: Old message view
A.7 Custom headers
==================
Sometimes the normal headers that mu4e offers (Date, From, To, Subject,
etc.) may not be enough. For these cases, mu4e offers _custom headers_
in both the headers-view and the message-view.
See *note HV Custom headers:: for an example of this; the difference
for the message-view is that you should add your custom header to
mu4e-view-fields rather than mu4e-headers-fields.

File: mu4e.info, Node: OMSGV Actions, Prev: OMSGV Custom headers, Up: Old message view
A.8 Actions
===========
You can perform custom functions (“actions”) on messages and their
attachments. For a general discussion on how to define your own, see
*note Actions::.
A.8.1 Message actions
---------------------
mu4e-view-action (<a>) lets you pick some custom action to perform on
the current message. You can specify these actions using the variable
mu4e-view-actions; mu4e defines a number of example actions.
A.8.2 MIME-part actions
-----------------------
MIME-part actions allow you to act upon MIME-parts in a message - such
as attachments. For now, these actions are defined and documented in
mu4e-view-attachment-actions.
A.8.3 Attachment actions
------------------------
Note these actions are only available for the old message view; see
*Note Old message view::.
Similarly, there is mu4e-view-attachment-action (<A>) for actions
on attachments, which you can specify with
mu4e-view-attachment-actions.
mu4e predefines a number of attachment-actions:
• open-with (<w>): open the attachment with some arbitrary program.
For example, suppose you have received a message with a picture
attachment; then, A w 1 RET gimp RET opens that attachment in
_The Gimp_
• pipe (<|>: process the attachment with some Unix shell-pipe and see
the results. Suppose you receive a patch file, and would like to
get an overview of the changes, using the diffstat program. You
can use something like: A | 1 RET diffstat -b RET.
• Emacs (<e>): open the attachment in your running Emacs. For
example, if you receive some text file youd like to open in Emacs:
A e 1 RET.
These actions all work on a _temporary copy_ of the attachment.

File: mu4e.info, Node: Other tools, Next: Example configs, Prev: Old message view, Up: Top
Appendix B Other tools
**********************
In this chapter, we discuss some ways in which mu4e can cooperate with
other tools.
* Menu:
* Emacs default::Making mu4e the default emacs e-mail program
* Org-mode links::Adding mu4e to your organized life
* Org-contacts::Hooking up with org-contacts
* BBDB::Hooking up with the Insidious Big Brother Database
* iCalendar::Replying to iCal events
* Sauron::Getting new mail notifications with Sauron
* Speedbar::A special frame with your folders
* Dired:: Attaching files using dired
* Hydra:: Custom shortcut menus
* iCalendar Integration:: Enabling iCalendar invite processing in mu4e

File: mu4e.info, Node: Emacs default, Next: Org-mode links, Up: Other tools
B.1 Emacs default
=================
Emacs allows you to select an e-mail program as the default program it
uses when you press <C-x m> (compose-mail), call report-emacs-bug
and so on. If you want to use mu4e for this, you can do so by adding
the following to your configuration:
(setq mail-user-agent 'mu4e-user-agent)
Similarly, to specify mu4e as your preferred method for reading mail,
customize the variable read-mail-command.
(set-variable 'read-mail-command 'mu4e)
(*note Emacs: (Sending Mail)Top.)

File: mu4e.info, Node: Org-mode links, Next: Org-contacts, Prev: Emacs default, Up: Other tools
B.2 Org-mode links
==================
It can be useful to include links to e-mail messages or search queries
in your org-mode files. mu4e supports this by default, unless you set
mu4e-support-org to nil.
You can use the normal org-mode mechanisms to store links: M-x
org-store-link stores a link to a particular message when you are in
*note Message view::. When you are in *note Headers view::, M-x
org-store-link links to the _query_ if
mu4e-org-link-query-in-headers-mode is non-nil, and to the
particular message otherwise (which is the default).
You can insert this link later with M-x org-insert-link. From
org-mode, you can go to the query or message the link points to with
either M-x org-agenda-open-link in agenda buffers, or M-x
org-open-at-point elsewhere — both typically bound to C-c C-o.
You can also directly _capture_ such links — for example, to add
e-mail messages to your todo-list. For that, mu4e-org has a function
mu4e-org-store-and-capture. This captures the message-at-point (or
header — see the discussion on mu4e-org-link-query-in-headers-mode
above), then calls org-modes capture functionality.
You can add some specific capture-template for this. In your capture
templates, the following mu4e-specific values are available:
item | description
-----------------------------------------------------+------------------------
%:date, %:date-timestamp, %d:date-timestamp-inactive | date, org timestamps
%:from, %:fromname, %:fromaddress | sender, name/address
%:to, %:toname, %:toaddress | recipient, name/address
%:maildir | maildir for the message
%:message-id | message-id
%:path | file system path
%:subject | message subject
For example, to add a message to your todo-list, and set a deadline
for processing it within two days, you could add this to
org-capture-templates:
("P" "process-soon" entry (file+headline "todo.org" "Todo")
"* TODO %:fromname: %a %?\nDEADLINE: %(org-insert-time-stamp (org-read-date nil t \"+2d\"))")
If you use the functionality a lot, you may want to define
key-bindings for that in headers and view mode:
(define-key mu4e-headers-mode-map (kbd "C-c c") 'mu4e-org-store-and-capture)
(define-key mu4e-view-mode-map (kbd "C-c c") 'mu4e-org-store-and-capture)

File: mu4e.info, Node: Org-contacts, Next: BBDB, Prev: Org-mode links, Up: Other tools
B.3 Org-contacts
================
Note, mu4e supports built-in address autocompletion; *note Address
autocompletion::, and that is the recommended way to do this. However,
it is also possible to manage your addresses with org-mode, using
org-contacts(1).
mu4e-actions defines a useful action (*note Actions::) for adding a
contact based on the From:-address in the message at point. To enable
this, add to your configuration something like:
(setq mu4e-org-contacts-file <full-path-to-your-org-contacts-file>)
(add-to-list 'mu4e-headers-actions
'("org-contact-add" . mu4e-action-add-org-contact) t)
(add-to-list 'mu4e-view-actions
'("org-contact-add" . mu4e-action-add-org-contact) t)
After this, you should be able to add contacts using <a o> in the
headers view and the message view, using the org-capture mechanism.
Note, the shortcut character <o> is due to the first character of
org-contact-add.
---------- Footnotes ----------
(1) <https://julien.danjou.info/projects/emacs-packages#org-contacts>

File: mu4e.info, Node: BBDB, Next: iCalendar, Prev: Org-contacts, Up: Other tools
B.4 BBDB
========
Note, mu4e supports built-in address autocompletion; *note Address
autocompletion::, and that is the recommended way to do this. However,
it is also possible to manage your addresses with the current
(2015-06-23) development release of BBDB, or releases of BBDB after
3.1.2.(1).
To enable BBDB, add to your ~/.emacs (or its moral equivalent, such
as ~/.emacs.d/init.el) the following _after_ the (require 'mu4e)
line:
;; Load BBDB (Method 1)
(require 'bbdb-loaddefs)
;; OR (Method 2)
;; (require 'bbdb-loaddefs "/path/to/bbdb/lisp/bbdb-loaddefs.el")
;; OR (Method 3)
;; (autoload 'bbdb-insinuate-mu4e "bbdb-mu4e")
;; (bbdb-initialize 'message 'mu4e)
(setq bbdb-mail-user-agent 'mu4e-user-agent)
(setq mu4e-view-mode-hook 'bbdb-mua-auto-update)
(setq mu4e-compose-complete-addresses nil)
(setq bbdb-mua-pop-up t)
(setq bbdb-mua-pop-up-window-size 5)
(setq mu4e-view-show-addresses t)
After this, you should be able to:
• In mu4e-view mode, add the sender of the email to BBDB with <C-u :>
• Tab-complete addresses from BBDB when composing emails
• View the BBDB contact while viewing a message
---------- Footnotes ----------
(1) <https://savannah.nongnu.org/projects/bbdb/>

File: mu4e.info, Node: iCalendar, Next: Sauron, Prev: BBDB, Up: Other tools
B.5 iCalendar
=============
When Gnus article-mode is chosen (*note Message view::), it is possible
to view and reply to iCalendar events. To enable this feature, add
(require 'mu4e-icalendar)
(mu4e-icalendar-setup)
to your configuration. If you want that the original invitation
message be automatically trashed after sending the message created by
clicking on the buttons “Accept”, “Tentative”, or “Decline”, also add:
(setq mu4e-icalendar-trash-after-reply t)
When you reply to an iCal event, a line may be automatically added to
the diary file of your choice. You can specify that file with
(setq mu4e-icalendar-diary-file "/path/to/your/diary")
Note that, if the specified file is not your main diary file, add
#include "/path/to/your/diary" to you main diary file to display the
events.
To enable optional iCalendar→Org sync functionality, add the
following:
(setq gnus-icalendar-org-capture-file "~/org/notes.org")
(setq gnus-icalendar-org-capture-headline '("Calendar"))
(gnus-icalendar-org-setup)
Both the capture file and the headline(s) inside it must already
exist.
By default, gnus-icalendar-org-setup adds a temporary capture
template to the variable org-capture-templates, with the description
“used by gnus-icalendar-org”, and the shortcut key “#”. If you want to
use your own template, create it using the same key and description.
This will prevent the temporary one from being installed next time you
gnus-icalendar-org-setup is called.
The full default capture template is:
("#" "used by gnus-icalendar-org" entry
(file+olp ,gnus-icalendar-org-capture-file
,gnus-icalendar-org-capture-headline)
"%i" :immediate-finish t)
where the values of the variables gnus-icalendar-org-capture-file
and gnus-icalendar-org-capture-headline are inserted via macro
expansion.
If, for example, you wanted to store ical events in a date tree,
prompting for the date, you could use the following:
("#" "used by gnus-icalendar-org" entry
(file+olp+datetree path-to-capture-file)
"%i" :immediate-finish t :time-prompt t)
Note that the default behaviour for datetree targets in this
situation is to store the event at the date that you capture it, not at
the date that it is scheduled. Thats why Ive suggested using the
:timeprompt t argument. This gives you an opportunity to set the time
to the correct value yourself.
You can extract the event time directly, and have the org-capture
functions use that to set the datetree location:
(defun my-catch-event-time (orig-fun &rest args)
"Set org-overriding-default-time to the start time of the capture event"
(let ((org-overriding-default-time (date-to-time
(gnus-icalendar-event:start (car args)))))
(apply orig-fun args)))
(advice-add 'gnus-icalendar:org-event-save :around #'my-catch-event-time)
If you do this, youll want to omit the :timeprompt t setting from
your capture template.

File: mu4e.info, Node: Sauron, Next: Speedbar, Prev: iCalendar, Up: Other tools
B.6 Sauron
==========
The Emacs package sauron(1) (by the same author) can be used to get
notifications about new mails. If you run something like the below
script from your crontab (or have some other way of having it execute
every _n_ minutes), you receive notifications in the sauron-buffer when
new messages arrive.
#!/bin/sh
# the mu binary
MU=mu
# put the path to your Inbox folder here
CHECKDIR="/home/$LOGNAME/Maildir/Inbox"
sauron_msg () {
DBUS_COOKIE="/home/$LOGNAME/.sauron-dbus"
if test "x$DBUS_SESSION_BUS_ADDRESS" = "x"; then
if test -e $DBUS_COOKIE; then
export DBUS_SESSION_BUS_ADDRESS="`cat $DBUS_COOKIE`"
fi
fi
if test -n "x$DBUS_SESSION_BUS_ADDRESS"; then
dbus-send --session \
--dest="org.gnu.Emacs" \
--type=method_call \
"/org/gnu/Emacs/Sauron" \
"org.gnu.Emacs.Sauron.AddMsgEvent" \
string:shell uint32:3 string:"$1"
fi
}
#
# -mmin -5: consider only messages that were created / changed in the
# the last 5 minutes
#
for f in `find $CHECKDIR -mmin -5 -a -type f -not -iname '.uidvalidity'`; do
subject=`$MU view $f | grep '^Subject:' | sed 's/^Subject://'`
sauron_msg "mail: $subject"
done
You might want to put:
(setq sauron-dbus-cookie t)
in your setup, to allow the script to find the D-Bus session bus, even
when running outside its session.
---------- Footnotes ----------
(1) Sauron can be found at <https://github.com/djcb/sauron>, or in
the MELPA (Milkypostmans Emacs Lisp Package Archive) package repository
at <https://melpa.org/>

File: mu4e.info, Node: Speedbar, Next: Dired, Prev: Sauron, Up: Other tools
B.7 Speedbar
============
speedbar is an Emacs-extension that shows navigational information for
an Emacs buffer in a separate frame. Using mu4e-speedbar, mu4e lists
your bookmarks and maildir folders and allows for one-click access to
them.
To enable this, add (require 'mu4e-speedbar) to your configuration;
then, all you need to do to activate it is M-x speedbar. Then, when
then switching to the *note Main view::, the speedbar-frame is updated
with your bookmarks and maildirs.
For speed reasons, the list of maildirs is determined when mu4e
starts; if the list of maildirs changes while mu4e is running, you need
to restart mu4e to have those changes reflected in the speedbar and in
other places that use this list, such as auto-completion when jumping to
a maildir.

File: mu4e.info, Node: Dired, Next: Hydra, Prev: Speedbar, Up: Other tools
B.8 Dired
=========
It is possible to attach files to mu4e messages using dired (*note
(emacs)Dired::), using the following steps (based on a post on the
mu-discuss mailing list by _Stephen Eglen_).
(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
Then, mark the file(s) in dired you would like to attach and press
C-c RET C-a, and youll be asked whether to attach them to an existing
message, or create a new one.

File: mu4e.info, Node: Hydra, Next: iCalendar Integration, Prev: Dired, Up: Other tools
B.9 Hydra
=========
People sometimes ask about having multi-character shortcuts for
bookmarks; an easy way to achieve this, is by using an emacs package
called Hydra(1).
With Hydra installed, we can add multi-character shortcuts, for
instance:
(defhydra my-mu4e-bookmarks-work (:color blue)
"work bookmarks"
("b" (mu4e-headers-search "banana AND maildir:/work") "banana")
("u" (mu4e-headers-search "flag:unread AND maildir:/work") "unread"))
(defhydra my-mu4e-bookmarks-personal (:color blue)
"personal bookmarks"
("c" (mu4e-headers-search "capybara AND maildir:/personal") "capybara")
("u" (mu4e-headers-search "flag:unread AND maildir:/personal") "unread"))
(defhydra my-mu4e-bookmarks (:color blue)
"mu4e bookmarks"
("p" (my-mu4e-bookmarks-personal/body) "Personal")
("w" (my-mu4e-bookmarks-work/body) "Work"))
Now, you can bind a convenient key to my-mu4e-bookmarks/body.
---------- Footnotes ----------
(1) <https://github.com/abo-abo/hydra>

File: mu4e.info, Node: iCalendar Integration, Prev: Hydra, Up: Other tools
B.10 iCalendar Integration
==========================
By default, mu4e presents iCalendar invitations as .vcs file
attachments. Experimental support is available to parse these
attachments in order to add the expected “Accept”, “Reject”, “Add to
Calendar” buttons. This requires using Gnus article view, which is the
default since mu4e version 1.6.
The minimal setup is:
(require 'mu4e-icalendar)
(mu4e-icalendar-setup)
To add the event to a diary file of your choice:
(setq mu4e-icalendar-diary-file "/path/to/your/diary")
To enable optional functionality to capture iCalendar events to your
org files:
(require 'org-agenda)
(setq gnus-icalendar-org-capture-file "~/org/notes.org")
(setq gnus-icalendar-org-capture-headline '("Calendar"))
(gnus-icalendar-org-setup)
NOTE: both the capture file and the headline(s) inside must already
exist.

File: mu4e.info, Node: Example configs, Next: FAQ, Prev: Other tools, Up: Top
Appendix C Example configs
**************************
In this chapter, we show some example configurations. While it is very
useful to see some working settings, wed like to warn against blindly
copying such things.
* Menu:
* Minimal configuration::Simplest configuration to get you going
* Longer configuration::A more extensive setup
* Gmail configuration::GMail-specific setup
* Other settings:CONF Other settings. Some other useful configuration

File: mu4e.info, Node: Minimal configuration, Next: Longer configuration, Up: Example configs
C.1 Minimal configuration
=========================
An (almost) minimal configuration for mu4e might look like this — as you
see, most of it is commented-out.
;; example configuration for mu4e
;; make sure mu4e is in your load-path
(require 'mu4e)
;; use mu4e for e-mail in emacs
(setq mail-user-agent 'mu4e-user-agent)
;; these must start with a "/", and must exist
;; (i.e.. /home/user/Maildir/sent must exist)
;; you use e.g. 'mu mkdir' to make the Maildirs if they don't
;; already exist
;; below are the defaults; if they do not exist yet, mu4e offers to
;; create them. they can also functions; see their docstrings.
;; (setq mu4e-sent-folder "/sent")
;; (setq mu4e-drafts-folder "/drafts")
;; (setq mu4e-trash-folder "/trash")
;; smtp mail setting; these are the same that `gnus' uses.
(setq
message-send-mail-function 'smtpmail-send-it
smtpmail-default-smtp-server "smtp.example.com"
smtpmail-smtp-server "smtp.example.com"
smtpmail-local-domain "example.com")

File: mu4e.info, Node: Longer configuration, Next: Gmail configuration, Prev: Minimal configuration, Up: Example configs
C.2 Longer configuration
========================
A somewhat longer configuration, showing some more things that you can
customize.
;; example configuration for mu4e
(require 'mu4e)
;; use mu4e for e-mail in emacs
(setq mail-user-agent 'mu4e-user-agent)
;; the next are relative to the root maildir
;; (see `mu info`).
;; instead of strings, they can be functions too, see
;; their docstring or the chapter 'Dynamic folders'
(setq mu4e-sent-folder "/sent"
mu4e-drafts-folder "/drafts"
mu4e-trash-folder "/trash")
;; the maildirs you use frequently; access them with 'j' ('jump')
(setq mu4e-maildir-shortcuts
'((:maildir "/archive" :key ?a)
(:maildir "/inbox" :key ?i)
(:maildir "/work" :key ?w)
(:maildir "/sent" :key ?s)))
;; the headers to show in the headers list -- a pair of a field
;; and its width, with `nil' meaning 'unlimited'
;; (better only use that for the last field.
;; These are the defaults:
(setq mu4e-headers-fields
'( (:date . 25) ;; alternatively, use :human-date
(:flags . 6)
(:from . 22)
(:subject . nil))) ;; alternatively, use :thread-subject
;; program to get mail; alternatives are 'fetchmail', 'getmail'
;; isync or your own shellscript. called when 'U' is pressed in
;; main view.
;; If you get your mail without an explicit command,
;; use "true" for the command (this is the default)
(setq mu4e-get-mail-command "offlineimap")
;; general emacs mail settings; used when composing e-mail
;; the non-mu4e-* stuff is inherited from emacs/message-mode
(setq mu4e-compose-reply-to-address "foo@bar.example.com"
user-mail-address "foo@bar.example.com"
user-full-name "Foo X. Bar")
(setq mu4e-compose-signature
"Foo X. Bar\nhttp://www.example.com\n")
;; smtp mail setting
(setq
message-send-mail-function 'smtpmail-send-it
smtpmail-default-smtp-server "smtp.example.com"
smtpmail-smtp-server "smtp.example.com"
smtpmail-local-domain "example.com"
;; if you need offline mode, set these -- and create the queue dir
;; with 'mu mkdir', i.e.. mu mkdir /home/user/Maildir/queue
smtpmail-queue-mail nil
smtpmail-queue-dir "/home/user/Maildir/queue/cur")
;; don't keep message buffers around
(setq message-kill-buffer-on-exit t)

File: mu4e.info, Node: Gmail configuration, Next: CONF Other settings, Prev: Longer configuration, Up: Example configs
C.3 Gmail configuration
=======================
_Gmail_ is a popular e-mail provider; lets see how we can make it work
with mu4e. Since we are using IMAP, you must enable that in the Gmail
web interface (in the settings, under the “Forwarding and
POP/IMAP”-tab).
Gmail users may also be interested in *note Including related
messages::, and in *note Skipping duplicates::.
C.3.1 Setting up offlineimap
----------------------------
First of all, we need a program to get the e-mail from Gmail to our
local machine; for this we use offlineimap; on Debian (and derivatives
like Ubuntu), this is as easy as:
$ sudo apt-get install offlineimap
while on Fedora (and similar) you need:
$ sudo yum install offlineimap
Then, we can configure offlineimap by editing ~/.offlineimaprc:
[general]
accounts = Gmail
maxsyncaccounts = 3
[Account Gmail]
localrepository = Local
remoterepository = Remote
[Repository Local]
type = Maildir
localfolders = ~/Maildir
[Repository Remote]
type = IMAP
remotehost = imap.gmail.com
remoteuser = USERNAME@gmail.com
remotepass = PASSWORD
ssl = yes
maxconnections = 1
Obviously, you need to replace USERNAME and PASSWORD with your actual
Gmail username and password. After this, you should be able to download
your mail:
$ offlineimap
OfflineIMAP 6.3.4
Copyright 2002-2011 John Goerzen & contributors.
Licensed under the GNU GPL v2+ (v2 or any later version).
Account sync Gmail:
***** Processing account Gmail
Copying folder structure from IMAP to Maildir
Establishing connection to imap.gmail.com:993.
Folder sync [Gmail]:
Syncing INBOX: IMAP -> Maildir
Syncing [Gmail]/All Mail: IMAP -> Maildir
Syncing [Gmail]/Drafts: IMAP -> Maildir
Syncing [Gmail]/Sent Mail: IMAP -> Maildir
Syncing [Gmail]/Spam: IMAP -> Maildir
Syncing [Gmail]/Starred: IMAP -> Maildir
Syncing [Gmail]/Trash: IMAP -> Maildir
Account sync Gmail:
***** Finished processing account Gmail
We can now run mu to make sure things work:
$ mu index
mu: indexing messages under /home/foo/Maildir [/home/foo/.cache/mu/xapian]
| processing mail; processed: 520; updated/new: 520, cleaned-up: 0
mu: elapsed: 3 second(s), ~ 173 msg/s
mu: cleaning up messages [/home/foo/.cache/mu/xapian]
/ processing mail; processed: 520; updated/new: 0, cleaned-up: 0
mu: elapsed: 0 second(s)
We can run both the offlineimap and the mu index from within mu4e,
but running it from the command line makes it a bit easier to
troubleshoot as we are setting things up.
Note: when using encryption, you probably do _not_ want to
synchronize your Drafts-folder, since it contains the unencrypted
messages. You can use OfflineIMAPs folderfilter for that.
C.3.2 Settings
--------------
Next step: lets make a mu4e configuration for this:
(require 'mu4e)
;; use mu4e for e-mail in emacs
(setq mail-user-agent 'mu4e-user-agent)
(setq mu4e-drafts-folder "/[Gmail].Drafts")
(setq mu4e-sent-folder "/[Gmail].Sent Mail")
(setq mu4e-trash-folder "/[Gmail].Trash")
;; don't save message to Sent Messages, Gmail/IMAP takes care of this
(setq mu4e-sent-messages-behavior 'delete)
;; (See the documentation for `mu4e-sent-messages-behavior' if you have
;; additional non-Gmail addresses and want assign them different
;; behavior.)
;; setup some handy shortcuts
;; you can quickly switch to your Inbox -- press ``ji''
;; then, when you want archive some messages, move them to
;; the 'All Mail' folder by pressing ``ma''.
(setq mu4e-maildir-shortcuts
'( (:maildir "/INBOX" :key ?i)
(:maildir "/[Gmail].Sent Mail" :key ?s)
(:maildir "/[Gmail].Trash" :key ?t)
(:maildir "/[Gmail].All Mail" :key ?a)))
;; allow for updating mail using 'U' in the main view:
(setq mu4e-get-mail-command "offlineimap")
;; something about ourselves
(setq
user-mail-address "USERNAME@gmail.com"
user-full-name "Foo X. Bar"
mu4e-compose-signature
(concat
"Foo X. Bar\n"
"http://www.example.com\n"))
;; sending mail -- replace USERNAME with your gmail username
;; also, make sure the gnutls command line utils are installed
;; package 'gnutls-bin' in Debian/Ubuntu
(require 'smtpmail)
(setq message-send-mail-function 'smtpmail-send-it
starttls-use-gnutls t
smtpmail-starttls-credentials '(("smtp.gmail.com" 587 nil nil))
smtpmail-auth-credentials
'(("smtp.gmail.com" 587 "USERNAME@gmail.com" nil))
smtpmail-default-smtp-server "smtp.gmail.com"
smtpmail-smtp-server "smtp.gmail.com"
smtpmail-smtp-service 587)
;; alternatively, for emacs-24 you can use:
;;(setq message-send-mail-function 'smtpmail-send-it
;; smtpmail-stream-type 'starttls
;; smtpmail-default-smtp-server "smtp.gmail.com"
;; smtpmail-smtp-server "smtp.gmail.com"
;; smtpmail-smtp-service 587)
;; don't keep message buffers around
(setq message-kill-buffer-on-exit t)
And thats it — put the above in your ~/.emacs, change USERNAME
etc. to your own, and restart Emacs, and run M-x mu4e.

File: mu4e.info, Node: CONF Other settings, Prev: Gmail configuration, Up: Example configs
C.4 Other settings
==================
Finally, here are some more settings that are useful, but not enabled by
default for various reasons.
;; use 'fancy' non-ascii characters in various places in mu4e
(setq mu4e-use-fancy-chars t)
;; save attachment to my desktop (this can also be a function)
(setq mu4e-attachment-dir "~/Desktop")
;; attempt to show images when viewing messages
(setq mu4e-view-show-images t)

File: mu4e.info, Node: FAQ, Next: Tips and Tricks, Prev: Example configs, Up: Top
Appendix D FAQ — Frequently Asked Questions
*******************************************
In this chapter we list a number of actual and anticipated questions and
their answers.
* Menu:
* General::General questions and answers about mu4e
* Retrieving mail::Getting mail and indexing
* Reading messages::Dealing with incoming messages
* Writing messages::Dealing with outgoing messages
* Known issues::Limitations we know about

File: mu4e.info, Node: General, Next: Retrieving mail, Up: FAQ
D.1 General
===========
D.1.1 Results from mu and mu4e differ - why?
----------------------------------------------
In general, the same queries for mu and mu4e should yield the same
results. If they differ, this is usually because one of the following
reasons:
• different options: mu4e defaults to having
mu4e-headers-include-related, and mu4e-headers-results-limit set to
500. However, the command-line mu finds corresponding
--include-related is false, and theres no limit (--maxnum).
• reverse sorting: The results may be different when mu4e and mu
find do not both sort their results in the same direction.
• shell quoting issues: Depending on the shell, various shell
metacharacters in search query (such as *) may be expanded by the
shell before mu ever sees them, and the query may not be what you
think it is. Quoting is necessary.
D.1.2 The unread/all counts in the main-screen differ from the real numbers - whats going on?
------------------------------------------------------------------------------------------------
For speed reasons, the counts do not exclude messages that no longer
exist in the file-system, nor does it exclude duplicate messages; *Note
mu-mu4e-differ::.
D.1.3 How can I quickly delete/move/trash a lot of messages?
------------------------------------------------------------
You can select (mark in Emacs-speak) the messages like you would
select text in a buffer; the actions you then take (e.g., <DEL> for
delete, <m> for move and <t> for trash) apply to all selected messages.
You can also use functions like mu4e-headers-mark-thread (<T>),
mu4e-headers-mark-subthread (<t>) to mark whole threads at the same
time, and mu4e-headers-mark-pattern (<%>) to mark all messages
matching a certain regular expression.
D.1.4 Can I automatically apply the marks on messages when leaving the headers buffer?
--------------------------------------------------------------------------------------
Yes you can — see the documentation for the variable
mu4e-headers-leave-behavior.
D.1.5 How can I set mu4e as the default e-mail client in Emacs?
---------------------------------------------------------------
See *note Emacs default::.
D.1.6 Can mu4e use some fancy Unicode instead of these boring plain-ASCII ones?
-------------------------------------------------------------------------------
Glad you asked! Yes, if you set mu4e-use-fancy-chars to t, mu4e uses
such fancy characters in a number of places. Since not all fonts
include all characters, you may want to install the unifont and/or
symbola fonts on your system.
D.1.7 Can I start mu4e in the background?
-----------------------------------------
Yes — if you provide a prefix-argument (<C-u>), mu4e starts, but does
not show the main-window.
D.1.8 Does mu4e support searching for CJK (Chinese-Japanese-Korean) characters?
-------------------------------------------------------------------------------
Yes, if you have Xapian 1.2.8 or newer, and set the environment variable
XAPIAN_CJK_NGRAM to non-empty before indexing, both when using mu from
the command-line and from mu4e.
D.1.9 How can I customize the function to select a folder?
----------------------------------------------------------
The mu4e-completing-read-function variable can be customized to select a
folder in any way. The variable can be set to a function that receives
five arguments, following completing-read. The default value is
ido-completing-read; to use emacss default behavior, set the variable
to completing-read. Helm users can use the same value, and by
enabling helm-mode use helm-style completion.
D.1.10 With a lot of Maildir folders, jumping to them can get slow. What can I do?
----------------------------------------------------------------------------------
Set mu4e-cache-maildir-list to t (make sure to read its docstring).
D.1.11 How can I hide messages from the search results?
-------------------------------------------------------
See the variable mu4e-headers-hide-predicate.
For example, to filter out GMails spam, set it to:
(setq mu4e-headers-hide-predicate
(lambda (msg)
(string-suffix-p "Spam" (mu4e-message-field msg :maildir))))
D.1.12 Im getting an error Variable binding depth exceeds max-specpdl-size when using mu4e what can I do about it?
-----------------------------------------------------------------------------------------------------------------------
The error occurs because mu4e is binding more variables than emacs
allows for, by default. You can avoid this by setting a higher value,
e.g. by adding the following to your configuration:
(setq max-specpdl-size 5000)

File: mu4e.info, Node: Retrieving mail, Next: Reading messages, Prev: General, Up: FAQ
D.2 Retrieving mail
===================
D.2.1 How can I get notifications when receiving mail?
------------------------------------------------------
There is mu4e-index-updated-hook, which gets triggered when the
indexing process triggered sees an update (not just new mail though).
To use this hook, put something like the following in your setup
(assuming you have aplay and some soundfile, change as needed):
(add-hook 'mu4e-index-updated-hook
(defun new-mail-sound ()
(shell-command "aplay ~/Sounds/boing.wav&")))
D.2.2 Getting mail through a local mailserver. What should I use for mu4e-get-mail-command?
---------------------------------------------------------------------------------------------
Use the literal string "true" (or dont do anything, its the default)
which then uses /bin/true (a command that does nothing and always
succeeds). This makes getting mail a no-op, but the messages are still
re-indexed.
D.2.3 How can I re-index my messages without getting new mail?
--------------------------------------------------------------
Use M-x mu4e-update-index
D.2.4 When I try to run mu index while mu4e is running I get errors
-------------------------------------------------------------------
For instance:
mu: mu_store_new_writable: xapian error
'Unable to get write lock on ~/.cache/mu/xapian: already locked
What to do about this? You get this error because the underlying
Xapian database is locked by some other process; it can be opened only
once in read-write mode. There is not much mu4e can do about this, but
if is another mu instance that is holding the lock, you can ask it to
(gracefully) terminate:
pkill -2 -u $UID mu # send SIGINT
sleep 1
mu index
mu4e automatically restarts mu when it needs it. In practice, this
seems to work quite well.
D.2.5 How can I disable the Indexing... messages?
-------------------------------------------------
Set the variable mu4e-hide-index-messages to non-nil.
D.2.6 IMAP-synchronization and file-name changes
------------------------------------------------
Some IMAP-synchronization programs such as mbsync (but not offlineimap)
dont like it when message files do not change their names when they are
moved to different folders. mu4e can attempt to help with this - you
can set the variable mu4e-change-filenames-when-moving to non-nil.
D.2.7 offlineimap and UTF-7
-----------------------------
offlineimap uses IMAPs UTF-7 for encoding non-ascii folder names,
while mu expects UTF-8 (so, e.g. /まりもえ お(1) becomes
/&MH4wijCCMEgwSg-).
This is best solved by telling offlineimap to use UTF-8 instead —
see <https://github.com/djcb/mu/issues/68#issuecomment-8598652>.
D.2.8 mbsync or offlineimap do not sync properly
----------------------------------------------------
Unfortunately, mbsync and/or offlineimap do not always agree with mu
about the meaning of various Maildir-flags. If you encounter unexpected
behavior, it is recommended you check before and after a sync-operation.
If the problem only shows up _after_ syncing, the problem is with the
sync-program, and its most productive to complain there.
Also, you may want to ensure that mu4e-index-lazy-check is kept at
its default (nil) value, since it seems mbsync can make changes that
escape a lazy check.
Furthermore, there have been quite a few related queries on the
mailing-list; worthwhile to check out.
---------- Footnotes ----------
(1) some Japanese characters

File: mu4e.info, Node: Reading messages, Next: Writing messages, Prev: Retrieving mail, Up: FAQ
D.3 Reading messages
====================
D.3.1 Opening messages is slower than expected - why?
-----------------------------------------------------
mu4e is designed to be very fast, even with large amounts of mail.
However, if you experience slowdowns, here are some things to consider:
• opening messages while indexing: mu4e corresponds with the mu
server synchronously; this means that you can do only one thing at
a time. The one operation that potentially does take a bit of time
is indexing of mail, during which you have to wait for messages to
open. For some strategies to reduce that time, see the next
question.
• getting contact information can take some time: especially when
opening mu4e the first time and you have a _lot_ of contacts, it
can take a few seconds to process those. Note that mu4e 1.3 and
higher only get _changed_ contacts in subsequent updates (after and
indexing operation), so this should be less of a concern.
• decryption / sign verification: encrypted / signed messages
sometimes require network access, and this may take a while;
certainly if the needed servers cannot be found. Part of this may
be that influential environment variables are not set in the emacs
environment.
If you still experience unexpected slowness, you can of course file a
ticket, but please be sure to mention the following:
• are all messages slow or only some messages?
• if its only some messages, is there something specific about them?
• in addition, please a (sufficiently censored version of) a message
that is slow
• is opening _always_ slow or only sometimes? When?
D.3.2 How can I view attached images in my message view buffers? See
--------------------------------------------------------------------
*note Viewing images inline::.
D.3.3 How can I word-wrap long lines in when viewing a message?
---------------------------------------------------------------
You can toggle between wrapped and non-wrapped states using <w>. If you
want to do this automatically, invoke visual-line-mode in your
mu4e-view-mode-hook.
D.3.4 How can I perform custom actions on messages and attachments?
-------------------------------------------------------------------
See *note Actions::.
D.3.5 Does mu4e support crypto (i.e., decrypting messages and verifying signatures)?
------------------------------------------------------------------------------------
Yes — it is possible to do both (note, only PGP/MIME is supported). In
the *note Main view:: the support is indicated by a big letter C on the
right hand side of the mu4e version. See *note Decryption:: and *note
Verifying signatures::. For encryption and signing messages, see *note
Writing messages::.
D.3.6 How can I prevent mu4e from automatically marking messages as read when I read them?
--------------------------------------------------------------------------------------------
Set mu4e-view-auto-mark-as-read to nil.
D.3.7 Does mu4e support including all related messages in a thread, like Gmail does?
------------------------------------------------------------------------------------
Yes — see *note Including related messages::.
D.3.8 There seems to be a lot of duplicate messages — how can I get rid of them?
--------------------------------------------------------------------------------
See *note Skipping duplicates::.
D.3.9 How can I use the eww browser to view rich-text messages?
---------------------------------------------------------------
With a new enough emacs, this happens automatically. See *note
Html2text functions:: for some details.
D.3.10 Some messages are almost unreadable in emacs — can I view them in an external web browser?
-------------------------------------------------------------------------------------------------
Indeed, airlines often send messages that heavily depend on html and are
hard to digest inside emacs. Fortunately, theres an _action_ (*note
Message view actions::) defined for this. Simply add to your
configuration:
(add-to-list 'mu4e-view-actions
'("ViewInBrowser" . mu4e-action-view-in-browser) t)
Now, when viewing such a difficult message, type aV, and the
message opens inside a web browser. You can influence the browser with
browse-url-generic-program; and see *note Privacy aspects::.
D.3.11 How can I read encrypted messages that I sent?
-----------------------------------------------------
Since you do not own the recipients key you typically cannot read those
mails — so the trick is to encrypt outgoing mails with your key, too.
This can be automated by adding the following snippet to your
configuration (courtesy of user kpachnis):
(require 'epg-config)
(setq mml2015-use 'epg
epg-user-id "gpg_key_id"
mml2015-encrypt-to-self t
mml2015-sign-with-sender t)
D.3.12 Can I bounce or resend messages?
-------------------------------------------
Somewhat — it is possible to edit a (copy of) an existing message and
then send it, using M-x mu4e-compose-resend. This gives you a raw
copy of the message, including all headers, encoded parts and so on.
Reason for this is that for resending, it is important not to change
anything (except perhaps for the To: address when bouncing); since we
cannot losslessly decode an existing message, you get the raw version.

File: mu4e.info, Node: Writing messages, Next: Known issues, Prev: Reading messages, Up: FAQ
D.4 Writing messages
====================
D.4.1 Whats the deal with replies to messages I wrote myself?
--------------------------------------------------------------
Like many other mail-clients, mu4e treats replies to messages you wrote
yourself as special — these messages keep the same To: and Cc: as the
original message. This is to ease the common case of following up to a
message you wrote earlier.
D.4.2 How can I automatically set the From:-address for a reply-message?
------------------------------------------------------------------------
See *note Compose hooks::.
D.4.3 How can I dynamically determine the folders for draft/sent/trashed messages?
----------------------------------------------------------------------------------
See *note Dynamic folders::.
D.4.4 How can I define aliases for (groups of) e-mail addresses?
----------------------------------------------------------------
See *note (emacs) Mail Aliases::.
D.4.5 How can I automatically add some header to an outgoing message?
---------------------------------------------------------------------
See *note Compose hooks::.
D.4.6 How can I influence the way the original message looks when replying/forwarding?
--------------------------------------------------------------------------------------
Since mu4e-compose-mode derives from message-mode, you can re-use
many of its facilities. *note (message)Insertion Variables::.
D.4.7 How can I easily include attachments in the messages I write?
-------------------------------------------------------------------
You can drag-and-drop from your desktop; alternatively, you can use
dired — see *note Dired::.
D.4.8 mu4e seems to remove myself from the Cc:-list; how can I prevent that?
----------------------------------------------------------------------------
Set mu4e-compose-keep-self-cc to t in your configuration.
D.4.9 mu4e include myself from the Cc:-list; how can I prevent that?
--------------------------------------------------------------------
You need list your personal addresses by passing one or more
--my-address=... to mu init. Note that the
mu4e-user-mail-address-list which was used in older mu4e versions is
no longer used. Also see the entries for version 1.4 in NEWS.org (N)
in the main-menu.
D.4.10 How can I start a new message-thread from a reply?
---------------------------------------------------------
Remove the In-Reply-To header, and mu4e automatically removes the
(hidden) References header as well when sending it. This makes the
message show up as a top-level message rather than as a response.
D.4.11 How can I attach an existing message?
--------------------------------------------
Use mu4e-action-capture-message (i.e., a c in the headers view) to
capture the to-be-attached message, then when editing the message, use
M-x mu4e-compose-attach-captured-message.
D.4.12 How can I sign or encrypt messages?
------------------------------------------
You can do so using Emacs MIME-support — check the Attachments-menu
while composing a message. Also see *note Signing and encrypting::.
You can do so using Emacs MIME-support — check the Attachments-menu
while composing a message. Also see *note Signing and encrypting::.
D.4.13 Address auto-completion does not work?
---------------------------------------------
If you have set mu4e-compose-complete-only-personal to non-nil, mu4e
only completes personal addresses - so you tell it about your e-mail
addresses when setting up the database (mu init); *note Initializing the
message store::.
D.4.14 Can I use BBDB with mu4e?
--------------------------------
Yes, with releases of BBDB after 3.1.2. *note BBDB::.
D.4.15 How can I get rid of the message buffer after sending?
-------------------------------------------------------------
(setq message-kill-buffer-on-exit t)
D.4.16 Sending big messages is slow and blocks emacs — what can I do about it?
------------------------------------------------------------------------------
For this, theres <https://github.com/jwiegley/emacs-async> (also
available from the Emacs package repository); add the following snippet
to your configuration:
(require 'smtpmail-async)
(setq
send-mail-function 'async-smtpmail-send-it
message-send-mail-function 'async-smtpmail-send-it)
With this, messages are sent using a background Emacs instance.
A word of warning though, this tends to not be as reliable as sending
the message in the normal, synchronous fashion, and people have reported
silent failures, where mail sending fails for some reason without any
indication of that.
You can check the progress of the background by checking the
*Messages*-buffer, which should show something like:
Delivering message to "William Shakespeare" <will@example.com>...
Mark set
Saving file /home/djcb/Maildir/sent/cur/20130706-044350-darklady:2,S...
Wrote /home/djcb/Maildir/sent/cur/20130706-044350-darklady:2,S
Sending...done
The first and final messages are the most important, and there may be
considerable time between them, depending on the size of the message.
D.4.17 Is it possible to compose messages in a separate frame?
--------------------------------------------------------------
Yes — set the variable mu4e-compose-in-new-frame to t.
D.4.18 How can I apply format=flowed to my outgoing messages?
-------------------------------------------------------------
This enables receiving clients that support this feature to reflow
paragraphs. Plain text emails with Content-Type: text/plain;
format=flowed can be reflowed (i.e. line endings removed, paragraphs
refilled) by receiving clients that support this standard. Clients that
dont support this, show them as is, which means this feature is truly
non-invasive.
Heres an explanatory blog post which also shows why this is a
desirable feature: <https://mathiasbynens.be/notes/gmail-plain-text> (if
you dont have it, your mails mostly look quite bad especially on mobile
devices) and heres the RFC with all the details:
<https://www.ietf.org/rfc/rfc2646.txt>.
Since version 0.9.17, mu4e sends emails with format=flowed by setting
(setq mu4e-compose-format-flowed t)
in your Emacs init file (~/.emacs or ~/.emacs.d/init.el). The
transformation of your message into the proper format is done at the
time of sending. For this to happen properly, you should write each
paragraph of your message of as a long line (i.e. without carriage
return). If you introduce unwanted newlines in your paragraph, use
M-q to reformat it as a single line.
If you want to send the message with paragraphs on single lines but
without format=flowed (because, say, the receiver does not understand
the latter as it is the case for Google or Github), use M-x
use-hard-newlines (to turn use-hard-newlines off) or uncheck the box
format=flowed in the Text menu when composing a message.
D.4.19 How can I force images to be shown at the end of my messages, regardless of where I insert them?
-------------------------------------------------------------------------------------------------------
User Marcin Borkowski has a solution:
(defun mml-attach-file--go-to-eob (orig-fun &rest args)
"Go to the end of buffer before attaching files."
(save-excursion
(save-restriction
(widen)
(goto-char (point-max))
(apply orig-fun args))))
(advice-add 'mml-attach-file :around #'mml-attach-file--go-to-eob)
D.4.20 How can I avoid Outlook display issues?
----------------------------------------------
Limited testing shows that certain Outlook clients do not work well with
inline replies, and the entire message including-and-below the first
quoted section is collapsed. This means recipients may not even notice
important inline text, especially if there is some top-posted content.
This has been observed on OS X, Windows, and Web-based Outlook clients
accessing Office 365.
It appears the bug is triggered by the standard reply regex "On ...
wrote:". Changing "On", or removing the trailing ":" appears to fix the
bug (in limited testing). Therefore, a simple work-around is to set
message-citation-line-format to something slightly non-standard, such
as:
(setq message-citation-line-format "On %Y-%m-%d at %R %Z, %f wrote...")

File: mu4e.info, Node: Known issues, Prev: Writing messages, Up: FAQ
D.5 Known issues
================
Although they are not really _questions_, we end this chapter with a
list of known issues and/or missing features in mu4e. Thus, users wont
have to search in vain for things that are not there (yet), and the
author can use it as a todo-list.
D.5.1 UTF-8 language environment is required
--------------------------------------------
mu4e does not work well if the Emacs language environment is not UTF-8;
so, if you encounter problems with encodings, be sure to have
(set-language-environment "UTF-8") in your ~/.emacs (or its moral
equivalents in other places).
D.5.2 Thread handling is incomplete
-----------------------------------
While threads are calculated and are visible in the headers buffer, you
cannot collapse/open them.
D.5.3 Key-bindings are _somewhat_ hard-coded.
---------------------------------------------
That is, the main menu assumes the default key-bindings, as do the
clicks-on-bookmarks.
For a more complete list, please refer to the issues-list in the
github-repository.

File: mu4e.info, Node: Tips and Tricks, Next: How it works, Prev: FAQ, Up: Top
Appendix E Tips and Tricks
**************************
* Menu:
* Fancy characters:: Non-ascii characters in the UI
* Refiling messages:: Moving message to some archive folder
* Saving outgoing messages:: Automatically save sent messages
* Confirmation before sending:: Check messages before sending

File: mu4e.info, Node: Fancy characters, Next: Refiling messages, Up: Tips and Tricks
E.1 Fancy characters
====================
When using fancy characters (mu4e-use-fancy-chars) with the
_Inconsolata_-font (and likely others as well), the display may be
slightly off; the reason for this issue is that Inconsolata does not
contain the glyphs for the fancy arrows and the glyphs that are used
as replacements are too high.
To fix this, you can use something like the following workaround (in
your .emacs-file):
(when (equal window-system 'x)
(set-fontset-font "fontset-default" 'unicode "Dejavu Sans Mono")
(set-face-font 'default "Inconsolata-10"))
Other fonts with good support for Unicode are unifont and symbola.
For a more complete solution, but with greater overhead, you can also
try the _unicode-fonts_ package:
(require 'unicode-fonts)
(require 'persistent-soft) ; To cache the fonts and reduce load time
(unicode-fonts-setup)

File: mu4e.info, Node: Refiling messages, Next: Saving outgoing messages, Prev: Fancy characters, Up: Tips and Tricks
E.2 Refiling messages
=====================
By setting mu4e-refile-folder to a function, you can dynamically
determine where messages are to be refiled. If you want to do this
based on the subject of a message, you can use a function that matches
the subject against a list of regexes in the following way. First, set
up a variable my-mu4e-subject-alist containing regexes plus associated
mail folders:
(defvar my-mu4e-subject-alist '(("kolloqui\\(um\\|a\\)" . "/Kolloquium")
("Calls" . "/Calls")
("Lehr" . "/Lehre")
("webseite\\|homepage\\|website" . "/Webseite"))
"List of subjects and their respective refile folders.")
Now you can use the following function to automatically refile
messages based on their subject line:
(defun my-mu4e-refile-folder-function (msg)
"Set the refile folder for MSG."
(let ((subject (mu4e-message-field msg :subject))
(folder (or (cdar (member* subject my-mu4e-subject-alist
:test #'(lambda (x y)
(string-match (car y) x))))
"/General")))
folder))
Note the "/General" folder: it is the default folder in case the
subject does not match any of the regexes in my-mu4e-subject-alist.
In order to make this work, youll of course need to set
mu4e-refile-folder to this function:
(setq mu4e-refile-folder 'my-mu4e-refile-folder-function)
If you have multiple accounts, you can accommodate them as well:
(defun my-mu4e-refile-folder-function (msg)
"Set the refile folder for MSG."
(let ((maildir (mu4e-message-field msg :maildir))
(subject (mu4e-message-field msg :subject))
folder)
(cond
((string-match "Account1" maildir)
(setq folder (or (catch 'found
(dolist (mailing-list my-mu4e-mailing-lists)
(if (mu4e-message-contact-field-matches
msg :to (car mailing-list))
(throw 'found (cdr mailing-list)))))
"/Account1/General")))
((string-match "Gmail" maildir)
(setq folder "/Gmail/All Mail"))
((string-match "Account2" maildir)
(setq folder (or (cdar (member* subject my-mu4e-subject-alist
:test #'(lambda (x y)
(string-match
(car y) x))))
"/Account2/General"))))
folder))
This function actually uses different methods to determine the refile
folder, depending on the account: for _Account2_, it uses
my-mu4e-subject-alist, for the _Gmail_ account it simply uses the
folder “All Mail”. For Account1, it uses another method: it files the
message based on the mailing list to which it was sent. This requires
another variable:
(defvar my-mu4e-mailing-lists
'(("mu-discuss@googlegroups.com" . "/Account1/mu4e")
("pandoc-discuss@googlegroups.com" . "/Account1/Pandoc")
("auctex@gnu.org" . "/Account1/AUCTeX"))
"List of mailing list addresses and folders where
their messages are saved.")

File: mu4e.info, Node: Saving outgoing messages, Next: Confirmation before sending, Prev: Refiling messages, Up: Tips and Tricks
E.3 Saving outgoing messages
============================
Like mu4e-refile-folder, the variable mu4e-sent-folder can also be
set to a function, in order to dynamically determine the save folder.
One might, for example, wish to automatically put messages going to
mailing lists into the trash (because youll receive them back from the
list anyway). If you have set up the variable my-mu4e-mailing-lists
as mentioned, you can use the following function to determine a save
folder:
(defun my-mu4e-sent-folder-function (msg)
"Set the sent folder for the current message."
(let ((from-address (message-field-value "From"))
(to-address (message-field-value "To")))
(cond
((string-match "my.address@account1.example.com" from-address)
(if (member* to-address my-mu4e-mailing-lists
:test #'(lambda (x y)
(string-match (car y) x)))
"/Trash"
"/Account1/Sent"))
((string-match "my.address@gmail.com" from-address)
"/Gmail/Sent Mail")
(t (mu4e-ask-maildir-check-exists "Save message to maildir: ")))))
Note that this function doesnt use (mu4e-message-field msg
:maildir) to determine which account the message is being sent from.
The reason is that the function in mu4e-sent-folder is called when you
send the message, but before mu4e has created the message struct from
the compose buffer, so that mu4e-message-field cannot be used.
Instead, the function uses message-field-value, which extracts the
values of the headers in the compose buffer. This means that it is not
possible to extract the account name from the messages maildir, so
instead the from address is used to determine the account.
Again, the function shows three different possibilities: for the
first account (my.address@account1.example.com) it uses
my-mu4e-mailing-lists again to determine if the message goes to a
mailing list. If so, the message is put in the trash folder, if not, it
is saved in /Account1/Sent. For the second (Gmail) account, sent mail
is simply saved in the Sent Mail folder.
If the from address is not associated with Account1 or with the Gmail
account, the function uses mu4e-ask-maildir-check-exists to ask the
user for a maildir to save the message in.

File: mu4e.info, Node: Confirmation before sending, Prev: Saving outgoing messages, Up: Tips and Tricks
E.4 Confirmation before sending
===============================
To protect yourself from sending messages too hastily, you can add a
final confirmation, which you can of course make as elaborate as you
wish.
(add-hook 'message-send-hook
(lambda ()
(unless (yes-or-no-p "Sure you want to send this?")
(signal 'quit nil))))
Another option is to simply set message-confirm-send to non-nil so
the question “Send message?” is asked for confirmation.

File: mu4e.info, Node: How it works, Next: Debugging, Prev: Tips and Tricks, Up: Top
Appendix F How it works
***********************
While perhaps not interesting for all users of mu4e, some curious souls
may want to know how mu4e does its job.
* Menu:
* High-level overview::How the pieces fit together
* mu server::The mu process running in the background
* Reading from the server::Processing responses from the server
* The message s-expression::What messages look like from the inside

File: mu4e.info, Node: High-level overview, Next: mu server, Up: How it works
F.1 High-level overview
=======================
At a high level, we can summarize the structure of the mu4e system using
some ascii-art:
+---------+
| emacs |
| +------+
+----| mu4e | --> send mail (smtpmail)
+------+
| A
V | ---/ search, view, move mail
+---------+ \
| mu |
+---------+
| A
V |
+---------+
| Maildir | <--- receive mail (fetchmail,
+---------+ offlineimap, ...)
In words:
• Your e-mail messages are stored in a Maildir-directory (typically,
~/Maildir and its subdirectories), and new mail comes in using
tools like fetchmail, offlineimap, or through a local mail server.
• mu indexes these messages periodically, so you can quickly search
for them. mu can run in a special server-mode, where it provides
services to client software.
• mu4e, which runs inside Emacs is such a client; it communicates
with mu (in its server-mode) to search for messages, and
manipulate them.
• mu4e uses the facilities offered by Emacs (the Gnus message editor
and smtpmail) to send messages.

File: mu4e.info, Node: mu server, Next: Reading from the server, Prev: High-level overview, Up: How it works
F.2 mu server
=============
mu4e is based on the mu e-mail searching/indexer. The latter is a
C++-program; there are different ways to communicate with a client that
is emacs-based.
One way to implement this, would be to call the mu command-line tool
with some parameters and then parse the output. In fact, that was the
first approach — mu4e would invoke e.g., mu find and process the output
in Emacs.
However, with this approach, we need to load the entire e-mail
_Xapian_ database (in which the message is stored) for each invocation.
Wouldnt it be nicer to keep a running mu instance around? Indeed, it
would — and thus, the mu server sub-command was born. Running mu server
starts a simple shell, in which you can give commands to mu, which
then spits out the results/errors. mu server is not meant for humans,
but it can be used manually, which is great for debugging.

File: mu4e.info, Node: Reading from the server, Next: The message s-expression, Prev: mu server, Up: How it works
F.3 Reading from the server
===========================
In the design, the next question was what format mu should use for its
output for mu4e (Emacs) to process. Some other programs use JSON here,
but it seemed easier (and possibly, more efficient) just to talk to
Emacs in its native language: _s-expressions_, and interpret those using
the Emacs-function read-from-string. See *note The message
s-expression:: for details on the format.
So, now lets look at how we process the data from mu server in
Emacs. Well leave out a lot of details, mu4e-specifics, and look at a
bit more generic approach.
The first thing to do is to create a process (for example, with
start-process), and then register a filter function for it, which is
invoked whenever the process has some data for us. Something like:
(let ((proc (start-process <arguments>)))
(set-process-filter proc 'my-process-filter)
(set-process-sentinel proc 'my-process-sentinel))
Note, the process sentinel is invoked when the process is terminated
— so there you can clean things up. The function my-process-filter is
a user-defined function that takes the process and the chunk of output
as arguments; in mu4e it looks something like (pseudo-lisp):
(defun my-process-filter (proc str)
;; mu4e-buf: a global string variable to which data gets appended
;; as we receive it
(setq mu4e-buf (concat mu4e-buf str))
(when <we-have-received-a-full-expression>
<eat-expression-from mu4e-buf>
<evaluate-expression>))
<evaluate-expression> de-multiplexes the s-expression we got. For
example, if the s-expression looks like an e-mail message header, it is
processed by the header-handling function, which appends it to the
header list. If the s-expression looks like an error message, it is
reported to the user. And so on.
The language between frontend and backend is documented partly in the
mu-server man-page and more completely in the output of mu server
--commands.
mu4e can log these communications; you can use M-x
mu4e-toggle-logging to turn logging on and off, and you can view the
log using M-x mu4e-show-log (<$>).

File: mu4e.info, Node: The message s-expression, Prev: Reading from the server, Up: How it works
F.4 The message s-expression
============================
A typical message s-expression looks something like the following:
(:docid 32461
:from (("Nikola Tesla" . "niko@example.com"))
:to (("Thomas Edison" . "tom@example.com"))
:cc (("Rupert The Monkey" . "rupert@example.com"))
:subject "RE: what about the 50K?"
:date (20369 17624 0)
:size 4337
:message-id "C8233AB82D81EE81AF0114E4E74@123213.mail.example.com"
:path "/home/tom/Maildir/INBOX/cur/133443243973_1.10027.atlas:2,S"
:maildir "/INBOX"
:priority normal
:flags (seen)
:parts ( (:index 1 :mime-type "text/plain" :size 12345 :attachment nil)
(:index 2 :name "photo.jpg" :mime-type "image/jpeg"
:size 147331 :attachment t)
(:index 3 :name "book.pdf" :mime-type "application/pdf"
:size 192220 :attachment t))
:references ("C8384574032D81EE81AF0114E4E74@123213.mail.example.com"
"38203498230942D81EE81AF0114E4E74@123213.mail.example.com")
:in-reply-to "38203498230942D81EE81AF0114E4E74@123213.mail.example.com"
:body-txt "Hi Tom,
....
")
This s-expression forms a property list (plist), and we can get
values from it using plist-get; for example (plist-get msg :subject)
would get you the message subject. However, its better to use the
function mu4e-message-field to shield you from some of the
implementation details that are subject to change; and see the other
convenience functions in mu4e-message.el.
Some notes on the format:
• The address fields are _lists_ of pairs (name . email), where
name can be nil.
• The date is in format Emacs uses (for example in
current-time).(1)
• Attachments are a list of elements with fields :index (the number
of the MIME-part), :name (the file name, if any), :mime-type (the
MIME-type, if any) and :size (the size in bytes, if any).
• Messages in the *note Headers view:: come from the database and do
not have :attachments. :body-txt or :body-html fields. Message in
the *note Message view:: use the actual message file, and do
include these fields.
F.4.1 Example: ping-pong
------------------------
As an example of the communication between mu4e and mu, lets look at
the ping-pong-sequence. When mu4e starts, it sends a command ping to
the mu server backend, to learn about its version. mu server then
responds with a pong s-expression to provide this information (this is
implemented in mu-cmd-server.c).
We start this sequence when mu4e is invoked (when the program is
started). It calls mu4e-proc-ping, and registers a (lambda) function
for mu4e-proc-pong-func, to handle the response.
-> (ping)
<-<prefix>(:pong "mu" :props (:version "x.x.x" :doccount 78545))
When we receive such a pong (in mu4e-proc.el), the lambda function
we registered is called, and it compares the version we got from the
pong with the version we expected, and raises an error if they differ.
---------- Footnotes ----------
(1) Emacs 32-bit integers have only 29 bits available for the actual
number; the other bits are use by Emacs for internal purposes.
Therefore, we need to split time_t in two numbers.

File: mu4e.info, Node: Debugging, Next: GNU Free Documentation License, Prev: How it works, Up: Top
Appendix G Debugging
********************
As explained in *note How it works::, mu4e communicates with its backend
(mu server) by sending commands and receiving responses (s-expressions).
For debugging purposes, it can be very useful to see this data. For
this reason, mu4e can log all these messages. Note that the protocol
is documented to some extent in the mu-server manpage.
You can enable (and disable) logging with M-x mu4e-toggle-logging.
The log-buffer is called *mu4e-log*, and in the *note Main view::, *note
Headers view:: and *note Message view::, theres a keybinding <$> that
takes you there. You can quit it by pressing <q>.
Logging can be a bit resource-intensive, so you may not want to leave
it on all the time. By default, the log only maintains the most recent
1200 lines. mu itself keeps a log as well, you can find it in
<MUHOME>/mu.log, on Unix typically ~/.cache/mu/mu.log.

File: mu4e.info, Node: GNU Free Documentation License, Prev: Debugging, Up: Top
Appendix H GNU Free Documentation License
*****************************************
Version 1.2, November 2002
Copyright © 2000,2001,2002 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document “free” in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or
noncommercially. Secondarily, this License preserves for the
author and publisher a way to get credit for their work, while not
being considered responsible for modifications made by others.
This License is a kind of “copyleft”, which means that derivative
works of the document must themselves be free in the same sense.
It complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for
free software, because free software needs free documentation: a
free program should come with manuals providing the same freedoms
that the software does. But this License is not limited to
software manuals; it can be used for any textual work, regardless
of subject matter or whether it is published as a printed book. We
recommend this License principally for works whose purpose is
instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium,
that contains a notice placed by the copyright holder saying it can
be distributed under the terms of this License. Such a notice
grants a world-wide, royalty-free license, unlimited in duration,
to use that work under the conditions stated herein. The
“Document”, below, refers to any such manual or work. Any member
of the public is a licensee, and is addressed as “you”. You accept
the license if you copy, modify or distribute the work in a way
requiring permission under copyright law.
A “Modified Version” of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A “Secondary Section” is a named appendix or a front-matter section
of the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Documents overall
subject (or to related matters) and contains nothing that could
fall directly within that overall subject. (Thus, if the Document
is in part a textbook of mathematics, a Secondary Section may not
explain any mathematics.) The relationship could be a matter of
historical connection with the subject or with related matters, or
of legal, commercial, philosophical, ethical or political position
regarding them.
The “Invariant Sections” are certain Secondary Sections whose
titles are designated, as being those of Invariant Sections, in the
notice that says that the Document is released under this License.
If a section does not fit the above definition of Secondary then it
is not allowed to be designated as Invariant. The Document may
contain zero Invariant Sections. If the Document does not identify
any Invariant Sections then there are none.
The “Cover Texts” are certain short passages of text that are
listed, as Front-Cover Texts or Back-Cover Texts, in the notice
that says that the Document is released under this License. A
Front-Cover Text may be at most 5 words, and a Back-Cover Text may
be at most 25 words.
A “Transparent” copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed
of pixels) generic paint programs or (for drawings) some widely
available drawing editor, and that is suitable for input to text
formatters or for automatic translation to a variety of formats
suitable for input to text formatters. A copy made in an otherwise
Transparent file format whose markup, or absence of markup, has
been arranged to thwart or discourage subsequent modification by
readers is not Transparent. An image format is not Transparent if
used for any substantial amount of text. A copy that is not
“Transparent” is called “Opaque”.
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format,
SGML or XML using a publicly available DTD, and standard-conforming
simple HTML, PostScript or PDF designed for human modification.
Examples of transparent image formats include PNG, XCF and JPG.
Opaque formats include proprietary formats that can be read and
edited only by proprietary word processors, SGML or XML for which
the DTD and/or processing tools are not generally available, and
the machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.
The “Title Page” means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the
material this License requires to appear in the title page. For
works in formats which do not have any title page as such, “Title
Page” means the text near the most prominent appearance of the
works title, preceding the beginning of the body of the text.
A section “Entitled XYZ” means a named subunit of the Document
whose title either is precisely XYZ or contains XYZ in parentheses
following text that translates XYZ in another language. (Here XYZ
stands for a specific section name mentioned below, such as
“Acknowledgements”, “Dedications”, “Endorsements”, or “History”.)
To “Preserve the Title” of such a section when you modify the
Document means that it remains a section “Entitled XYZ” according
to this definition.
The Document may include Warranty Disclaimers next to the notice
which states that this License applies to the Document. These
Warranty Disclaimers are considered to be included by reference in
this License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and
has no effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License
applies to the Document are reproduced in all copies, and that you
add no other conditions whatsoever to those of this License. You
may not use technical measures to obstruct or control the reading
or further copying of the copies you make or distribute. However,
you may accept compensation in exchange for copies. If you
distribute a large enough number of copies you must also follow the
conditions in section 3.
You may also lend copies, under the same conditions stated above,
and you may publicly display copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly
have printed covers) of the Document, numbering more than 100, and
the Documents license notice requires Cover Texts, you must
enclose the copies in covers that carry, clearly and legibly, all
these Cover Texts: Front-Cover Texts on the front cover, and
Back-Cover Texts on the back cover. Both covers must also clearly
and legibly identify you as the publisher of these copies. The
front cover must present the full title with all words of the title
equally prominent and visible. You may add other material on the
covers in addition. Copying with changes limited to the covers, as
long as they preserve the title of the Document and satisfy these
conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto
adjacent pages.
If you publish or distribute Opaque copies of the Document
numbering more than 100, you must either include a machine-readable
Transparent copy along with each Opaque copy, or state in or with
each Opaque copy a computer-network location from which the general
network-using public has access to download using public-standard
network protocols a complete Transparent copy of the Document, free
of added material. If you use the latter option, you must take
reasonably prudent steps, when you begin distribution of Opaque
copies in quantity, to ensure that this Transparent copy will
remain thus accessible at the stated location until at least one
year after the last time you distribute an Opaque copy (directly or
through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of
the Document well before redistributing any large number of copies,
to give them a chance to provide you with an updated version of the
Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document
under the conditions of sections 2 and 3 above, provided that you
release the Modified Version under precisely this License, with the
Modified Version filling the role of the Document, thus licensing
distribution and modification of the Modified Version to whoever
possesses a copy of it. In addition, you must do these things in
the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title
distinct from that of the Document, and from those of previous
versions (which should, if there were any, be listed in the
History section of the Document). You may use the same title
as a previous version if the original publisher of that
version gives permission.
B. List on the Title Page, as authors, one or more persons or
entities responsible for authorship of the modifications in
the Modified Version, together with at least five of the
principal authors of the Document (all of its principal
authors, if it has fewer than five), unless they release you
from this requirement.
C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license
notice giving the public permission to use the Modified
Version under the terms of this License, in the form shown in
the Addendum below.
G. Preserve in that license notice the full lists of Invariant
Sections and required Cover Texts given in the Documents
license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled “History”, Preserve its Title,
and add to it an item stating at least the title, year, new
authors, and publisher of the Modified Version as given on the
Title Page. If there is no section Entitled “History” in the
Document, create one stating the title, year, authors, and
publisher of the Document as given on its Title Page, then add
an item describing the Modified Version as stated in the
previous sentence.
J. Preserve the network location, if any, given in the Document
for public access to a Transparent copy of the Document, and
likewise the network locations given in the Document for
previous versions it was based on. These may be placed in the
“History” section. You may omit a network location for a work
that was published at least four years before the Document
itself, or if the original publisher of the version it refers
to gives permission.
K. For any section Entitled “Acknowledgements” or “Dedications”,
Preserve the Title of the section, and preserve in the section
all the substance and tone of each of the contributor
acknowledgements and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document, unaltered
in their text and in their titles. Section numbers or the
equivalent are not considered part of the section titles.
M. Delete any section Entitled “Endorsements”. Such a section
may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled
“Endorsements” or to conflict in title with any Invariant
Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no
material copied from the Document, you may at your option designate
some or all of these sections as invariant. To do this, add their
titles to the list of Invariant Sections in the Modified Versions
license notice. These titles must be distinct from any other
section titles.
You may add a section Entitled “Endorsements”, provided it contains
nothing but endorsements of your Modified Version by various
parties—for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of
a standard.
You may add a passage of up to five words as a Front-Cover Text,
and a passage of up to 25 words as a Back-Cover Text, to the end of
the list of Cover Texts in the Modified Version. Only one passage
of Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document
already includes a cover text for the same cover, previously added
by you or by arrangement made by the same entity you are acting on
behalf of, you may not add another; but you may replace the old
one, on explicit permission from the previous publisher that added
the old one.
The author(s) and publisher(s) of the Document do not by this
License give permission to use their names for publicity for or to
assert or imply endorsement of any Modified Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under
this License, under the terms defined in section 4 above for
modified versions, provided that you include in the combination all
of the Invariant Sections of all of the original documents,
unmodified, and list them all as Invariant Sections of your
combined work in its license notice, and that you preserve all
their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name
but different contents, make the title of each such section unique
by adding at the end of it, in parentheses, the name of the
original author or publisher of that section if known, or else a
unique number. Make the same adjustment to the section titles in
the list of Invariant Sections in the license notice of the
combined work.
In the combination, you must combine any sections Entitled
“History” in the various original documents, forming one section
Entitled “History”; likewise combine any sections Entitled
“Acknowledgements”, and any sections Entitled “Dedications”. You
must delete all sections Entitled “Endorsements.”
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other
documents released under this License, and replace the individual
copies of this License in the various documents with a single copy
that is included in the collection, provided that you follow the
rules of this License for verbatim copying of each of the documents
in all other respects.
You may extract a single document from such a collection, and
distribute it individually under this License, provided you insert
a copy of this License into the extracted document, and follow this
License in all other respects regarding verbatim copying of that
document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other
separate and independent documents or works, in or on a volume of a
storage or distribution medium, is called an “aggregate” if the
copyright resulting from the compilation is not used to limit the
legal rights of the compilations users beyond what the individual
works permit. When the Document is included in an aggregate, this
License does not apply to the other works in the aggregate which
are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half
of the entire aggregate, the Documents Cover Texts may be placed
on covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic
form. Otherwise they must appear on printed covers that bracket
the whole aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section
4. Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also
include the original English version of this License and the
original versions of those notices and disclaimers. In case of a
disagreement between the translation and the original version of
this License or a notice or disclaimer, the original version will
prevail.
If a section in the Document is Entitled “Acknowledgements”,
“Dedications”, or “History”, the requirement (section 4) to
Preserve its Title (section 1) will typically require changing the
actual title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided for under this License. Any other
attempt to copy, modify, sublicense or distribute the Document is
void, and will automatically terminate your rights under this
License. However, parties who have received copies, or rights,
from you under this License will not have their licenses terminated
so long as such parties remain in full compliance.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of
the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
<http://www.gnu.org/copyleft/>.
Each version of the License is given a distinguishing version
number. If the Document specifies that a particular numbered
version of this License “or any later version” applies to it, you
have the option of following the terms and conditions either of
that specified version or of any later version that has been
published (not as a draft) by the Free Software Foundation. If the
Document does not specify a version number of this License, you may
choose any version ever published (not as a draft) by the Free
Software Foundation.
ADDENDUM: How to use this License for your documents
====================================================
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:
Copyright (C) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the “with...Texts.” line with this:
with the Invariant Sections being LIST THEIR TITLES, with
the Front-Cover Texts being LIST, and with the Back-Cover Texts
being LIST.
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of free
software license, such as the GNU General Public License, to permit
their use in free software.

Tag Table:
Node: Top628
Ref: Top-Footnote-12909
Ref: Top-Footnote-22955
Ref: Top-Footnote-33051
Node: Introduction3176
Node: Why another e-mail client3556
Node: Other mail clients4166
Ref: Other mail clients-Footnote-14947
Ref: Other mail clients-Footnote-24982
Ref: Other mail clients-Footnote-35026
Ref: Other mail clients-Footnote-45062
Node: What mu4e does not do5093
Ref: What mu4e does not do-Footnote-16164
Ref: What mu4e does not do-Footnote-26203
Ref: What mu4e does not do-Footnote-36243
Node: Becoming a mu4e user6280
Ref: Becoming a mu4e user-Footnote-17687
Node: Getting started7740
Node: Requirements8581
Ref: Requirements-Footnote-19475
Ref: Requirements-Footnote-29505
Node: Installation9552
Ref: Building from a release tarball12083
Ref: Building from git12474
Ref: Installation-Footnote-114204
Ref: Installation-Footnote-214250
Ref: Installation-Footnote-314360
Node: Getting mail14394
Ref: Getting mail-Footnote-115596
Node: Initializing the message store15767
Node: Indexing your messages16720
Node: Basic configuration18236
Node: Folders18856
Ref: Folders-Footnote-119659
Node: Retrieval and indexing19938
Node: Sending mail24191
Node: Running mu4e26414
Node: Main view27461
Node: MV Overview27990
Node: Basic actions29148
Node: MV Bookmarks30001
Node: Miscellaneous31374
Node: Headers view32249
Node: HV Overview33009
Ref: HV Overview-Footnote-137331
Ref: HV Overview-Footnote-237422
Ref: HV Overview-Footnote-337529
Node: Keybindings37629
Node: HV Marking39679
Node: Sorting and threading40842
Ref: Sorting and threading-Footnote-142418
Node: HV Custom headers42509
Node: HV Actions44692
Node: Split view45402
Node: Message view46838
Node: MSGV Overview47674
Node: MSGV Keybindings48873
Node: MSGV Rich-text and images51417
Node: MSGV Custom headers53526
Node: MSGV Actions54062
Node: Editor view54819
Node: EV Overview55618
Node: EV Keybindings56033
Node: Address autocompletion56689
Ref: Address autocompletion-Footnote-158791
Node: Compose hooks58836
Node: Signing and encrypting62139
Node: Queuing mail63153
Node: Message signatures64447
Node: Other settings65081
Node: Searching65813
Node: Queries66778
Ref: Queries-Footnote-169887
Node: Bookmarks70001
Ref: Bookmarks-Footnote-174160
Node: Maildir searches74203
Node: Other search functionality76706
Ref: Including related messages78610
Ref: Skipping duplicates79229
Node: Marking79818
Node: Marking messages80653
Node: What to mark for81445
Ref: What to mark for-Footnote-183022
Ref: What to mark for-Footnote-283119
Node: Executing the marks83315
Node: Trashing messages83761
Node: Leaving the headers buffer84385
Node: Built-in marking functions84818
Node: Custom mark functions85374
Node: Adding a new kind of mark87723
Node: Contexts90923
Node: What are contexts92090
Node: Context policies93742
Node: Contexts and special folders95215
Node: Contexts example96611
Node: Dynamic folders101484
Node: Smart refiling102751
Ref: Smart refiling-Footnote-1105284
Node: Other dynamic folders105329
Node: Actions106597
Node: Defining actions107492
Ref: Defining actions-Footnote-1108768
Ref: Defining actions-Footnote-2108944
Node: Headers view actions109131
Node: Message view actions110061
Node: Attachment actions110895
Node: Example actions111680
Node: Extending mu4e112071
Node: Extension points112602
Node: Available functions114394
Node: Message functions115305
Node: Contact functions118421
Node: Utility functions119659
Node: Old message view120881
Ref: Old message view-Footnote-1122302
Node: OMSGV Overview122352
Node: OMSGV Keybindings124598
Node: Attachments127459
Ref: Attachments-Footnote-1128897
Ref: Attachments-Footnote-2128960
Node: Viewing images inline129068
Ref: Viewing images inline-Footnote-1129896
Node: Displaying rich-text messages129934
Ref: Html2text functions132592
Ref: Privacy aspects133347
Ref: Displaying rich-text messages-Footnote-1133686
Ref: Displaying rich-text messages-Footnote-2133851
Node: OMSGV Crypto133893
Ref: Decryption134982
Ref: Verifying signatures135699
Node: OMSGV Custom headers136704
Node: OMSGV Actions137250
Node: Other tools139113
Node: Emacs default139849
Node: Org-mode links140477
Node: Org-contacts143205
Ref: Org-contacts-Footnote-1144286
Node: BBDB144360
Ref: BBDB-Footnote-1145730
Node: iCalendar145783
Node: Sauron149031
Ref: Sauron-Footnote-1150569
Node: Speedbar150739
Node: Dired151626
Node: Hydra152142
Ref: Hydra-Footnote-1153244
Node: iCalendar Integration153287
Node: Example configs154283
Node: Minimal configuration154826
Node: Longer configuration156037
Node: Gmail configuration158733
Node: CONF Other settings164112
Node: FAQ164657
Node: General165177
Ref: mu-mu4e-differ165370
Node: Retrieving mail170081
Ref: Retrieving mail-Footnote-1173747
Node: Reading messages173780
Node: Writing messages179376
Node: Known issues187930
Node: Tips and Tricks189064
Node: Fancy characters189451
Node: Refiling messages190467
Node: Saving outgoing messages194065
Node: Confirmation before sending196599
Node: How it works197203
Node: High-level overview197704
Node: mu server199204
Node: Reading from the server200229
Node: The message s-expression202585
Ref: The message s-expression-Footnote-1205810
Node: Debugging205997
Node: GNU Free Documentation License207036

End Tag Table

Local Variables:
coding: utf-8
End: