#+title: Minimail

#+html: <a href="https://elpa.gnu.org/packages/minimail.html"><img alt="GNU ELPA" src="https://elpa.gnu.org/packages/minimail.svg"/></a>
#+html: <img src="https://codeberg.org/astoff/minimail/raw/branch/images/monolith.jpg" align="right" width="50%">

Minimail is a simple, non-blocking IMAP email client for Emacs.  It is
a rather new package but covers the basics needed for reading and
replying to messages:

- Displaying messages, including MIME content (rendering via Gnus)
- Composing, replying to and forwarding messages
- Multi-account support
- Search, via transient menu
- Moving messages between mailboxes (also archive, move to trash, move
  to junk folder)
- Sorting by thread, in two modes:
  - “Shallow” threading (just one nesting level, sorted by date)
    using server-side thread information if available or subject lines
    as a fallback.
  - Optionally, hierarchical threads based on reference message IDs.

Here is a list of planned features:

- Watching for new messages and notifications
- Virtual mailboxes a.k.a. bookmarked searches
- Login via OAuth
- Various optimizations, perhaps a persistent cache

Minimail is an [[https://www.rfc-editor.org/rfc/rfc1733][online]] IMAP client.  It is intended to coexist
peacefully with other clients accessing the same account.  Moreover,
it is intended to remain no more complicated than your regular webmail
app.  In line with that, the following are some features which are not
planned:

- Filtering (use server-side filtering instead)
- Offline access
- POP, NNTP, RSS, Maildir, instant messaging, microblogging, social
  media, virtual reality, etc.

** Try it out

Minimail comes pre-configured to access the Emacs mailing lists served
by [[https://yhetil.org/][Yhetil]] via anonymous IMAP.  Just type =M-x minimail-show-mailboxes RET=
to try it out.

** Configuration

Just set =mail-user-agent= to =minimail= and customize the variable
=minimail-accounts=.  The latter accepts many different options, so it
might be convenient to explore it using the Customize interface (even
if you later decide to simply copy the Lisp expression to your init
file).  That said, the only required option is =:incoming-url=.  In
order to send emails, you should also set the =:mail-address= option
as well as the =message-server-alist= variable from the [[https://www.gnu.org/software/emacs/manual/html_node/message][Message]]
package.

Here is an illustrative example:

#+begin_src emacs-lisp
(setq mail-user-agent 'minimail
      minimail-accounts
      '((gmail ;; This can be any symbol you like to identify the account
         :mail-address "somebody@gmail.com"
         :incoming-url "imaps://imap.gmail.com")
        (work ;; Assuming Evil Corp. uses "Google Workspace" as email provider
         :mail-address "webmaster@evilcorp.com"
         :incoming-url "imaps://imap.gmail.com"
         :signature (file "~/work/.signature"))
        (uni
         :mail-address "somebody@math.niceuni.edu"
         ;; Include a username in the IMAP server URL if it doesn't
         ;; match your email address.  Use `imap' as URL scheme if the
         ;; server only supports STARTTLS.
         :incoming-url "imap://username@imap.niceuni.edu"))
      message-server-alist
      '(("somebody@gmail.com" . "smtp smtp.gmail.com 465 somebody@gmail.com")
        ("webmaster@evilcorp.com" . "smtp smtp.gmail.com 465 webmaster@evilcorp.com")
        ("somebody@math.niceuni.edu" . "smtp smtp.niceuni.edu 587 username")))
#+end_src

In addition to the above, you need to configure [[https://www.gnu.org/software/emacs/manual/html_mono/auth.html][auth-source]] to supply
the passwords.  Some email providers require you to first create an
"app password" (for Gmail, see [[https://support.google.com/accounts/answer/185833][this]]).  Then your =~/.authinfo= file
should look something like this:

#+begin_src
machine imap.gmail.com login somebody@gmail.com password xxxxxxxxxxxxxxxx
machine smtp.gmail.com login somebody@gmail.com password xxxxxxxxxxxxxxxx

machine imap.gmail.com login webmaster@evilcorp.com password yyyyyyyyyyyyyyyy
machine smtp.gmail.com login webmaster@evilcorp.com password yyyyyyyyyyyyyyyy

machine imap.niceuni.edu login username password zzzzzzzzzzzzzzzz
machine smtp.niceuni.edu login username password zzzzzzzzzzzzzzzz
#+end_src

Once you get the basics up and running, try
=M-x customize-group minimail RET= to explore all customization
options.

** Usage

This package has two main entry points.  The command
=minimail-show-mailboxes= displays the mailbox hierarchy of your
accounts, while =minimail-find-mailbox= directly opens a mailbox you
choose from the minibuffer.  In a mailbox or message buffer, hit =h=
to see a list of available commands.
