literate-dotfiles/mail.org

43 KiB

Mail Configuration

Installation:

sudo apt install mbsync msmtp maildir-utils neomutt lynx

mbsync - Synchronize Mailboxes

http://isync.sourceforge.net/

Global Defaults

# Automatically create missing mailboxes, both locally and on the server
Create Both
# Save the synchronization state files in the relevant directory
SyncState *
# Permanently remove all messages [on the Far/Near] marked for deletion.
Expunge Both

Gmail Account

IMAPAccount gmail
Host imap.gmail.com
User dehaeze.thomas@gmail.com
PassCmd "pass email/dehaeze.thomas@gmail.com"
SSLType IMAPS
AuthMechs LOGIN
CertificateFile /etc/ssl/certs/ca-certificates.crt
IMAPStore gmail-remote
Account gmail

MaildirStore gmail-local
Path ~/.mail/gmail/
Inbox ~/.mail/gmail/Inbox

Channel gmail-Home
Far :gmail-remote:INBOX
Near :gmail-local:Inbox

Channel gmail-Drafts
Far :gmail-remote:"[Gmail]/Drafts"
Near :gmail-local:Drafts

Channel gmail-Sent
Far :gmail-remote:"[Gmail]/Sent Mail"
Near :gmail-local:Sent

Channel gmail-Trash
Far :gmail-remote:"[Gmail]/Trash"
Near :gmail-local:Trash

Channel gmail-Archive
Far :gmail-remote:"[Imap]/Archive"
Near :gmail-local:Archive
# Catch-all for everything else: note that the `Patterns` have to exclude both
# the remote and local names for all the folders we want to exclude (except
# "INBOX", which is special-cased, it would seem).
Channel gmail
Far :gmail-remote:
Near :gmail-local:
# Exclude everything under the internal [Gmail] folder, except the interesting folders
Patterns *
Patterns !INBOX
Patterns ![Gmail]*
Patterns !Drafts
Patterns !Sent Mail
Patterns !Trash
# Patterns ![Imap]/Archive
# For doing a quick sync of just the INBOX with `mbsync gmail-download`.
Channel gmail-download
Far :gmail-remote:INBOX
Near :gmail-local:Inbox
Create Near
Expunge Near
Sync Pull

ESRF Account

IMAPAccount esrf
Host imaps.esrf.fr
User dehaeze
PassCmd "pass email/thomas.dehaeze@esrf.fr"
SSLType IMAPS
AuthMechs LOGIN
IMAPStore esrf-remote
Account esrf

MaildirStore esrf-local
Path ~/.mail/esrf/
Inbox ~/.mail/esrf/Inbox

Channel esrf-Home
Far :esrf-remote:INBOX
Near :esrf-local:Inbox

Channel esrf-Drafts
Far :esrf-remote:Drafts
Near :esrf-local:Drafts

Channel esrf-Archive
Far :esrf-remote:Archive
Near :esrf-local:Archive

Channel esrf-Sent
Far :esrf-remote:Sent
Near :esrf-local:Sent

Channel esrf-Trash
Far :esrf-remote:Trash
Near :esrf-local:Trash
Channel esrf
Far :esrf-remote:
Near :esrf-local:

For doing a quick sync of just the INBOX with mbsync esrf-download.

Channel esrf-download
Far :esrf-remote:INBOX
Near :esrf-local:Inbox
Create Near
Expunge Near
Sync Pull

msmtp - Send Mails

https://marlam.de/msmtp/

Defaults

defaults
auth          on
tls           on
tls_certcheck off

Gmail Account

account      gmail
host         smtp.gmail.com
port         587
protocol     smtp
from         dehaeze.thomas@gmail.com
user         dehaeze.thomas@gmail.com
passwordeval "pass email/dehaeze.thomas@gmail.com"
proxy_host localhost
proxy_port 8080

ESRF Account

account        esrf
host           smtps.esrf.fr
port           465
protocol       smtp
from           thomas.dehaeze@esrf.fr
user           dehaeze
tls_starttls   off
passwordeval   "pass email/thomas.dehaeze@esrf.fr"

Default Account

account default : esrf

mu - Mail Indexer

Mu (github) it used as a "maildir indexer/searcher". Useful commands are described in the Cheat-sheet.

For instance, to find mails with pdf attachments:

mu find 'mime:application/pdf'

neomutt - Mail Client

https://neomutt.org/

Documentation:

man neomutt
man neomuttrc

Bindings

Unding all the key bindings

bind generic,pager,editor,index a noop
bind generic,pager,editor,index b noop
bind generic,pager,editor,index c noop
bind generic,pager,editor,index d noop
bind generic,pager,editor,index e noop
bind generic,pager,editor,index f noop
bind generic,pager,editor,index g noop
bind generic,pager,editor,index h noop
bind generic,pager,editor,index i noop
bind generic,pager,editor,index j noop
bind generic,pager,editor,index k noop
bind generic,pager,editor,index l noop
bind generic,pager,editor,index m noop
bind generic,pager,editor,index n noop
bind generic,pager,editor,index o noop
bind generic,pager,editor,index p noop
bind generic,pager,editor,index q noop
bind generic,pager,editor,index r noop
bind generic,pager,editor,index s noop
bind generic,pager,editor,index t noop
bind generic,pager,editor,index u noop
bind generic,pager,editor,index v noop
bind generic,pager,editor,index w noop
bind generic,pager,editor,index x noop
bind generic,pager,editor,index y noop
bind generic,pager,editor,index z noop
bind generic,pager,editor,index A noop
bind generic,pager,editor,index B noop
bind generic,pager,editor,index C noop
bind generic,pager,editor,index D noop
bind generic,pager,editor,index E noop
bind generic,pager,editor,index F noop
bind generic,pager,editor,index G noop
bind generic,pager,editor,index H noop
bind generic,pager,editor,index I noop
bind generic,pager,editor,index J noop
bind generic,pager,editor,index K noop
bind generic,pager,editor,index L noop
bind generic,pager,editor,index M noop
bind generic,pager,editor,index N noop
bind generic,pager,editor,index O noop
bind generic,pager,editor,index P noop
bind generic,pager,editor,index Q noop
bind generic,pager,editor,index R noop
bind generic,pager,editor,index S noop
bind generic,pager,editor,index T noop
bind generic,pager,editor,index U noop
bind generic,pager,editor,index V noop
bind generic,pager,editor,index W noop
bind generic,pager,editor,index X noop
bind generic,pager,editor,index Y noop
bind generic,pager,editor,index Z noop

bind generic,pager,editor,index <Tab>      noop
bind generic,pager,editor,index <Space>    noop
bind generic,pager,editor,index <PageUp>   noop
bind generic,pager,editor,index <PageDown> noop
bind generic,pager,editor,index <Home>     noop
bind generic,pager,editor,index <End>      noop
bind generic,pager,editor,index <Insert>   noop
bind generic,pager,editor,index <Delete>   noop
bind generic,pager,editor,index <Up>       noop
bind generic,pager,editor,index <Down>     noop
bind generic,pager,editor,index <Left>     noop
bind generic,pager,editor,index <Right>    noop
bind generic,pager,editor,index <Enter>    noop
bind generic,pager,editor,index <Return>   noop

bind generic,pager,editor,index | noop

bind generic,pager,editor,index 1 noop
bind generic,pager,editor,index 2 noop
bind generic,pager,editor,index 3 noop
bind generic,pager,editor,index 4 noop
bind generic,pager,editor,index 5 noop
bind generic,pager,editor,index 6 noop
bind generic,pager,editor,index 7 noop
bind generic,pager,editor,index 8 noop
bind generic,pager,editor,index 9 noop
bind generic,pager,editor,index 0 noop
bind generic,pager,editor,index ! noop
bind generic,pager,editor,index @ noop
bind generic,pager,editor,index $ noop
bind generic,pager,editor,index % noop
bind generic,pager,editor,index ^ noop
bind generic,pager,editor,index & noop
bind generic,pager,editor,index * noop
bind generic,pager,editor,index ( noop
bind generic,pager,editor,index ) noop

bind generic,pager,editor,index \Ca noop
bind generic,pager,editor,index \Cb noop
bind generic,pager,editor,index \Cc noop
bind generic,pager,editor,index \Cd noop
bind generic,pager,editor,index \Ce noop
bind generic,pager,editor,index \Cf noop
bind generic,pager,editor,index \Cg noop
bind generic,pager,editor,index \Ch noop
bind generic,pager,editor,index \Ci noop
bind generic,pager,editor,index \Cj noop
bind generic,pager,editor,index \Ck noop
bind generic,pager,editor,index \Cl noop
bind generic,pager,editor,index \Cm noop
bind generic,pager,editor,index \Cn noop
bind generic,pager,editor,index \Co noop
bind generic,pager,editor,index \Cp noop
bind generic,pager,editor,index \Cq noop
bind generic,pager,editor,index \Cr noop
bind generic,pager,editor,index \Cs noop
bind generic,pager,editor,index \Ct noop
bind generic,pager,editor,index \Cu noop
bind generic,pager,editor,index \Cv noop
bind generic,pager,editor,index \Cw noop
bind generic,pager,editor,index \Cx noop
bind generic,pager,editor,index \Cy noop
bind generic,pager,editor,index \Cz noop
bind generic,pager,editor,index \CA noop
bind generic,pager,editor,index \CB noop
bind generic,pager,editor,index \CC noop
bind generic,pager,editor,index \CD noop
bind generic,pager,editor,index \CE noop
bind generic,pager,editor,index \CF noop
bind generic,pager,editor,index \CG noop
bind generic,pager,editor,index \CH noop
bind generic,pager,editor,index \CI noop
bind generic,pager,editor,index \CJ noop
bind generic,pager,editor,index \CK noop
bind generic,pager,editor,index \CL noop
bind generic,pager,editor,index \CM noop
bind generic,pager,editor,index \CN noop
bind generic,pager,editor,index \CO noop
bind generic,pager,editor,index \CP noop
bind generic,pager,editor,index \CQ noop
bind generic,pager,editor,index \CR noop
bind generic,pager,editor,index \CS noop
bind generic,pager,editor,index \CT noop
bind generic,pager,editor,index \CU noop
bind generic,pager,editor,index \CV noop
bind generic,pager,editor,index \CW noop
bind generic,pager,editor,index \CX noop
bind generic,pager,editor,index \CY noop
bind generic,pager,editor,index \CZ noop

bind generic,pager,editor,index \C<Tab>      noop
bind generic,pager,editor,index \C<Space>    noop
bind generic,pager,editor,index \C<PageUp>   noop
bind generic,pager,editor,index \C<PageDown> noop
bind generic,pager,editor,index \C<Home>     noop
bind generic,pager,editor,index \C<End>      noop
bind generic,pager,editor,index \C<Insert>   noop
bind generic,pager,editor,index \C<Delete>   noop
bind generic,pager,editor,index \C<Up>       noop
bind generic,pager,editor,index \C<Down>     noop
bind generic,pager,editor,index \C<Left>     noop
bind generic,pager,editor,index \C<Right>    noop
bind generic,pager,editor,index \C<Enter>    noop
bind generic,pager,editor,index \C<Return>   noop

bind generic,pager,editor,index \C1 noop
bind generic,pager,editor,index \C2 noop
bind generic,pager,editor,index \C3 noop
bind generic,pager,editor,index \C4 noop
bind generic,pager,editor,index \C5 noop
bind generic,pager,editor,index \C6 noop
bind generic,pager,editor,index \C7 noop
bind generic,pager,editor,index \C8 noop
bind generic,pager,editor,index \C9 noop
bind generic,pager,editor,index \C0 noop
bind generic,pager,editor,index \C! noop
bind generic,pager,editor,index \C$ noop
bind generic,pager,editor,index \C% noop
bind generic,pager,editor,index \C^ noop
bind generic,pager,editor,index \C& noop
bind generic,pager,editor,index \C* noop
bind generic,pager,editor,index \C( noop
bind generic,pager,editor,index \C) noop

bind generic,pager,editor,index <Esc>a noop
bind generic,pager,editor,index <Esc>b noop
bind generic,pager,editor,index <Esc>c noop
bind generic,pager,editor,index <Esc>d noop
bind generic,pager,editor,index <Esc>e noop
bind generic,pager,editor,index <Esc>f noop
bind generic,pager,editor,index <Esc>g noop
bind generic,pager,editor,index <Esc>h noop
bind generic,pager,editor,index <Esc>i noop
bind generic,pager,editor,index <Esc>j noop
bind generic,pager,editor,index <Esc>k noop
bind generic,pager,editor,index <Esc>l noop
bind generic,pager,editor,index <Esc>m noop
bind generic,pager,editor,index <Esc>n noop
bind generic,pager,editor,index <Esc>o noop
bind generic,pager,editor,index <Esc>p noop
bind generic,pager,editor,index <Esc>q noop
bind generic,pager,editor,index <Esc>r noop
bind generic,pager,editor,index <Esc>s noop
bind generic,pager,editor,index <Esc>t noop
bind generic,pager,editor,index <Esc>u noop
bind generic,pager,editor,index <Esc>v noop
bind generic,pager,editor,index <Esc>w noop
bind generic,pager,editor,index <Esc>x noop
bind generic,pager,editor,index <Esc>y noop
bind generic,pager,editor,index <Esc>z noop
bind generic,pager,editor,index <Esc>A noop
bind generic,pager,editor,index <Esc>B noop
bind generic,pager,editor,index <Esc>C noop
bind generic,pager,editor,index <Esc>D noop
bind generic,pager,editor,index <Esc>E noop
bind generic,pager,editor,index <Esc>F noop
bind generic,pager,editor,index <Esc>G noop
bind generic,pager,editor,index <Esc>H noop
bind generic,pager,editor,index <Esc>I noop
bind generic,pager,editor,index <Esc>J noop
bind generic,pager,editor,index <Esc>K noop
bind generic,pager,editor,index <Esc>L noop
bind generic,pager,editor,index <Esc>M noop
bind generic,pager,editor,index <Esc>N noop
bind generic,pager,editor,index <Esc>O noop
bind generic,pager,editor,index <Esc>P noop
bind generic,pager,editor,index <Esc>Q noop
bind generic,pager,editor,index <Esc>R noop
bind generic,pager,editor,index <Esc>S noop
bind generic,pager,editor,index <Esc>T noop
bind generic,pager,editor,index <Esc>U noop
bind generic,pager,editor,index <Esc>V noop
bind generic,pager,editor,index <Esc>W noop
bind generic,pager,editor,index <Esc>X noop
bind generic,pager,editor,index <Esc>Y noop
bind generic,pager,editor,index <Esc>Z noop

bind generic,pager,editor,index <Esc><Tab>      noop
bind generic,pager,editor,index <Esc><Space>    noop
bind generic,pager,editor,index <Esc><PageUp>   noop
bind generic,pager,editor,index <Esc><PageDown> noop
bind generic,pager,editor,index <Esc><Home>     noop
bind generic,pager,editor,index <Esc><End>      noop
bind generic,pager,editor,index <Esc><Insert>   noop
bind generic,pager,editor,index <Esc><Delete>   noop
bind generic,pager,editor,index <Esc><Up>       noop
bind generic,pager,editor,index <Esc><Down>     noop
bind generic,pager,editor,index <Esc><Left>     noop
bind generic,pager,editor,index <Esc><Right>    noop
bind generic,pager,editor,index <Esc><Enter>    noop
bind generic,pager,editor,index <Esc><Return>   noop

bind generic,pager,editor,index <Esc>1 noop
bind generic,pager,editor,index <Esc>2 noop
bind generic,pager,editor,index <Esc>3 noop
bind generic,pager,editor,index <Esc>4 noop
bind generic,pager,editor,index <Esc>5 noop
bind generic,pager,editor,index <Esc>6 noop
bind generic,pager,editor,index <Esc>7 noop
bind generic,pager,editor,index <Esc>8 noop
bind generic,pager,editor,index <Esc>9 noop
bind generic,pager,editor,index <Esc>0 noop
bind generic,pager,editor,index <Esc>! noop
bind generic,pager,editor,index <Esc>@ noop
bind generic,pager,editor,index <Esc>$ noop
bind generic,pager,editor,index <Esc>% noop
bind generic,pager,editor,index <Esc>^ noop
bind generic,pager,editor,index <Esc>& noop
bind generic,pager,editor,index <Esc>* noop
bind generic,pager,editor,index <Esc>( noop
bind generic,pager,editor,index <Esc>) noop

Quit Neomutt

bind index,pager,compose Q exit
macro index q "<shell-escape>if [ $TMUX ]; then tmux detach; fi<enter>"

Generic

bind generic Q exit

bind generic <Return> select-entry
bind generic l select-entry

bind generic,index k previous-entry
bind generic,index j next-entry

bind generic,index 0 first-entry
bind generic,index $ last-entry

bind generic,index \031 previous-entry # Mouse wheel
bind generic,index \005 next-entry # Mouse wheel

bind generic,index gg first-entry
bind generic,index G last-entry

bind generic,index,pager \Cu half-up
bind generic,index,pager \Cd half-down

bind generic,index,pager \Ce next-line
bind generic,index,pager \Cy previous-line

Index (list of mails)

bind index <space> collapse-thread

bind index,pager K previous-entry
bind index,pager J next-entry

bind index l  display-message
bind index <Return> display-message

macro index h "<change-folder>?" "Go back to the list of mailboxes"
bind pager h exit

macro index c "<change-folder>?<toggle-mailboxes>" "change folder"

bind index,pager u undelete-message

bind index,pager P print-message

# Compose a new email (not a reply) to the sender
bind index,pager @ compose-to-sender

# Marl All message as read
macro index \Cr \
    "<tag-pattern>~N<enter><tag-prefix><clear-flag>N<untag-pattern>.<enter>" \
    "mark all new as read"
bind index U toggle-new

Copy and move mails

macro index C "<copy-message>?<toggle-mailboxes>" "copy a message to a mailbox"
macro index M "<save-message>?<toggle-mailboxes>" "move a message to a mailbox"

Pager (One mail opened)

bind pager k  previous-line
bind pager j  next-line
bind pager l view-attachments

# Display mode information
bind pager i display-toggle-weed

bind pager gg top
bind pager 0 top

bind pager G bottom
bind pager $ bottom

bind pager q exit

macro pager L "<pipe-message> urlscan<Enter>" "call urls
bind index z collapse-thread
bind index Z collapse-all

Write/Reply/Forward mail

bind index,pager p recall-message
bind index,pager m mail
bind index,pager M resend-message
bind index,pager r reply
bind index,pager R group-reply
bind index,pager b bounce-message
bind index,pager f forward-message

Sync Mailbox

bind index,pager s sync-mailbox

Sync email

macro index,pager o "<shell-escape>$HOME/.config/neomutt/bin/get_new_mail.sh<enter>"
macro index,pager O "<shell-escape>$HOME/.config/neomutt/bin/get_new_mail.sh -a<enter>"

Make quick html view macro

macro index,pager H "<view-attachments><search>html<enter><view-mailcap><exit>"

Open mail with Vim

macro index,pager V "<view-attachments><search>plain<enter><view-mailcap><exit>"

Labels

bind index,pager y edit-label
bind index,pager Y modify-labels

Limit

bind index L limit
macro index a <limit>all<enter>

Search

bind generic,index,pager / search

bind index,pager n search-next
bind index,pager N search-opposite

Attachments

bind attach l view-attach

bind attach h exit
bind attach q exit

bind attach <return> view-mailcap

macro attach W <save-entry><kill-line>~/Downloads/<enter>y "Save entry"

Compose

bind compose p postpone-message

bind compose R rename-attachment

bind compose a attach-file

Open another instance of neomutt in readonly mode while composing

macro compose M "<shell-escape>$TERMINAL -e \"neomutt -R\"<enter>"

Attach multiple files using ranger

macro compose A "<shell-escape>bash $HOME/.config/neomutt/bin/rangerpick<enter><enter-command>source /tmp/rangerpick<enter><shell-escape>bash $HOME/.config/neomutt/bin/rangerpick clean<enter>" "Attach with Ranger"

Attach file by drooping from GUI

macro compose B "<shell-escape>bash $HOME/.config/neomutt/bin/rangerpick dragon<enter><enter-command>source /tmp/rangerpick<enter><shell-escape>bash $HOME/.config/neomutt/bin/rangerpick clean<enter>" "Attach with Ranger"
Attach with Ranger Script
tmpfile=/tmp/rangerpick
if [ -z "$1" ]; then
    ranger --choosefiles $tmpfile && sed -i 's/\s/\\ /g' $tmpfile && echo "$(awk 'BEGIN {printf "%s", "push "} {printf "%s", "<attach-file>"$0"<enter>"}'  $tmpfile)" > $tmpfile
elif [ $1 == "dragon" ]; then
    dragon --target --print-path --keep > $tmpfile && sed -i 's/\s/\\ /g' $tmpfile && echo "$(awk 'BEGIN {printf "%s", "push "} {printf "%s", "<attach-file>"$0"<enter>"}' $tmpfile)" > $tmpfile
elif [ $1 == "clean" ]; then
    ls $tmpfile
fi
Send HTML mails using Markdown

Write html emails using markdown

# macro compose M "F pandoc -s -f markdown -t html \ny^T^Utext/html; charset=us-ascii\n"

Browser

bind browser l select-entry
macro browser h "<top-page><select-entry>"

bind browser q exit

Generic

Enter Command

bind generic,index,pager : enter-command

Sidebar

bind index,pager \Cp sidebar-prev
bind index,pager \Cn sidebar-next
bind index,pager \Co sidebar-open

bind index,pager \Ch sidebar-toggle-visible

Reload Configuration

macro generic,index,pager,editor ,<Space> ":source ~/.config/neomutt/neomuttrc\n" "Reload mutt's configuration file"

urlview - Open URL in emails

Use urlview to extract urls from the mail.

macro attach,compose,index,pager \cw "\
  :set my_tmp_pipe_decode=\$pipe_decode\n\
  :set pipe_decode\n\
  <pipe-message>urlview\n\
  :set pipe_decode=\$my_tmp_pipe_decode\n\
  :unset my_tmp_pipe_decode\n" \
  'call urlview to extract URLs out of a message'

Searching using Mu

macro index,pager \Cf "<shell-escape>$HOME/.config/neomutt/bin/search_mail.sh<enter><change-folder-readonly>~/.mail/search<enter>" \
                         "test"
# macro index,pager \Cf "<shell-escape>mu find --clearlinks --format=links --linksdir=~/.mail/search " \
#                          "mu find"
macro index,pager gf "<change-folder-readonly>~/.mail/search<enter>" \
                         "mu find results"

Link to Orgmode

https://www.donarmstrong.com/posts/org_mode_mutt_capture/ https://upsilon.cc/~zack/blog/posts/2010/02/integrating_Mutt_with_Org-mode/

macro index,pager S "<pipe-message>$HOME/.config/neomutt/bin/mutt-save-org-link.py\n"
Link mail to orgmode - Script

https://orgmode.org/manual/The-capture-protocol.html#The-capture-protocol

import sys
import email
from email import policy
import subprocess
import urllib.parse

# Parse the email from standard input
message_bytes = sys.stdin.buffer.read()
message = email.message_from_bytes(message_bytes, policy=policy.default)

# Grab the relevant message headers
message_id = urllib.parse.quote(message['message-id'][1:-1])
subject = message['subject']
message_to = message['to']

# Ask emacsclient to save a link to the message
subprocess.Popen([
    'emacsclient',
    f'org-protocol://capture?template=ps&url={message_id}&title={subject}&body={message_to}'
])

Colors

color attachment  color109 color235
color bold        color229 color235
color error       color167 color235
color hdrdefault  color246 color235
color indicator   color223 color237
color markers     color243 color235
color normal      color223 color235
color prompt      color223 color235
color quoted      color250 color235
color quoted1     color108 color235
color quoted2     color250 color235
color quoted3     color108 color235
color quoted4     color250 color235
color quoted5     color108 color235
color search      color235 color208
color signature   color108 color235
color status      color245 color235
color tilde       color243 color235
color tree        color142 color235
color underline   color223 color239

color sidebar_divider    color250 color235
color sidebar_new        color142 color235

color index color142 color235 ~N
color index color108 color235 ~O
color index color109 color235 ~P
color index color214 color235 ~F
color index color175 color235 ~Q
color index color167 color235 ~=
color index color235 color223 ~T
color index color235 color167 ~D

color header color214 color235 "^(To:|Cc:|Bcc:|From:)"
color header color142 color235 "^Subject:"
color header color108 color235 "^X-Spam-Status:"
color header color108 color235 "^Received:"

color body color142 color235 "[a-z]{3,256}://[-a-zA-Z0-9@:%._\\+~#=/?&,]+"
color body color208 color235 "[-a-z_0-9.%$]+@[-a-z_0-9.]+\\.[-a-z][-a-z]+"
color body color208 color235 "mailto:[-a-z_0-9.]+@[-a-z_0-9.]+"
color body color235 color214 "[;:]-*[)>(<lt;|]"
color body color229 color235 "\\*[- A-Za-z]+\\*"

color body color214 color235 "^-.*PGP.*-*"
color body color142 color235 "^gpg: Good signature from"
color body color167 color235 "^gpg: Can't.*$"
color body color214 color235 "^gpg: WARNING:.*$"
color body color167 color235 "^gpg: BAD signature from"
color body color167 color235 "^gpg: Note: This key has expired!"
color body color214 color235 "^gpg: There is no indication that the signature belongs to the owner."
color body color214 color235 "^gpg: can't handle these multiple signatures"
color body color214 color235 "^gpg: signature verification suppressed"
color body color214 color235 "^gpg: invalid node with packet of type"

Contacts with Mu

set query_command="mu cfind '%s' -o mutt-ab"

bind editor <Tab> complete-query

Paths

set folder           = ~/.mail                         # mail location
set alias_file       = ~/.config/neomutt/alias         # where to store aliases
set header_cache     = ~/.config/neomutt/cache/headers # where to store headers
set message_cachedir = ~/.config/neomutt/cache/bodies  # where to store bodies
set certificate_file = ~/.config/neomutt/certificates  # where to store certs
set mailcap_path     = ~/.config/neomutt/mailcap       # entries for filetypes
set tmpdir           = ~/.config/neomutt/temp          # where to keep temp files

Print

https://unix.stackexchange.com/questions/20456/pretty-print-mails-from-mutt

# set print_command="/usr/bin/muttprint %s -p ctb110c1u"

Accounts

set spoolfile = "+esrf/Inbox" # Default inbox
set realname = "Dehaeze Thomas"
set from = "thomas.dehaeze@esrf.fr"

folder-hook gmail/* source ~/.config/neomutt/accounts/gmail
folder-hook esrf/*  source ~/.config/neomutt/accounts/esrf

macro index,pager ge "<change-folder>+esrf/Inbox<enter>" "go to inbox"
macro index,pager gm "<change-folder>+gmail/Inbox<enter>" "go to inbox"

Gmail

Configuration
set from     = "dehaeze.thomas@gmail.com"
set sendmail = "~/.config/neomutt/bin/send_mail.sh gmail"

# Other special folders.
set mbox      = "+gmail/Archive" # Archive Box
set postponed = "+gmail/Drafts"

unset record # Don't copy send message to Sent folder: Gmail does that for us

set signature = "~/.config/neomutt/accounts/gmail.signature"

macro index,pager d \
  "<save-message>+gmail/Archive<enter>" \
  "Move message to the Archive"

macro index,pager D \
  "<save-message>+gmail/Trash<enter>" \
  "Move message to the Trash"
Signature
Thomas Dehaeze

This empty code block is used to add a new line after signature

ESRF

Configuration
set from     = "thomas.dehaeze@esrf.fr"
set sendmail = "~/.config/neomutt/bin/send_mail.sh esrf"

# Other special folders.
set mbox      = "+esrf/Archive"
set record    = "+esrf/Sent"
set postponed = "+esrf/Drafts"

set signature = "~/.config/neomutt/accounts/esrf.signature"

macro index,pager d \
  "<save-message>+esrf/Archive<enter>" \
  "Move message to the Archive"

macro index,pager D \
  "<save-message>+esrf/Trash<enter>" \
  "Move message to the Trash"
Signature
Thomas DEHAEZE
Mechatronics Engineer
ESRF - The European Synchrotron
Tel: +33 (0)4.76.88.22.34

This empty code block is used to add a new line after signature

Basic Options

set wait_key = no        # shut up, mutt
set mbox_type = Maildir  # mailbox type
set help = no            # No top bar
set timeout = 3          # idle time before scanning
set sleep_time = 0       # how long NeoMutt may wait after an error message
set mail_check = 0       # minimum time between scans
set delete               # don't ask, just do
unset confirmappend      # don't ask, just do!
set quit                 # don't ask, just do!!
set mark_old = no        # read/new is good enough for me
set beep_new             # bell on new mails
# set pipe_decode          # strip headers and eval mimes when piping
set thorough_search      # strip headers and eval mimes before searching
set send_charset="us-ascii:utf-8:iso-8859-1"
set sendmail_wait = 0 # no please don't silently fail, email is important
set use_from             # respect the From: address the editor sends back

# Use Vim to compose email, with a few default options.
set editor = "nvim -c '/\\n--' -c ':noh' -c 'startinsert'"

View Options

Status Bar

set status_on_top = no
set status_chars  = " *%A"
set status_format = "───[ Folder: %f ]───[%r%m messages%?n? (%n new)?%?d? (%d to delete)?%?t? (%t tagged)? ]───%>─%?p?( %p postponed )?───"

Index View Options

set date_format = "%d/%m/%y %H:%M"
set index_format = "[%Z] %D %-20.20F %s"

set sort = threads                         # like gmail
set sort_aux = reverse-last-date-received  # like gmail
set uncollapse_jump                        # don't collapse on an unread message
set sort_re                                # thread based on regex
set reply_regexp = "^(([Rr][Ee]?(\[[0-9]+\])?: *)?(\[[^]]+\] *)?)*"
set folder_format = "%2C %t %N %8s %f"

Pager View Options

set pager_index_lines = 10 # number of index lines to show
set pager_context = 3      # number of context lines to show
set pager_stop             # don't go to next message automatically
set menu_scroll            # scroll in menus
set tilde                  # show tildes like in vim
set markers = no           # no ugly plus signs
set quote_regexp = "^( {0,4}[>|:#%]| {0,4}[a-z0-9]+[>|]+)+"

auto_view text/html                                      # view html automatically
alternative_order text/plain text/enriched text/html     # save html for last

Compose View Options

set sig_dashes                       # dashes before sig
set sig_on_top                       # the signature is just below the response
set edit_headers                     # show headers when composing
set fast_reply                       # skip to compose when replying
set fcc_attach                       # save attachments with the body
set attribution = "On %d, %n wrote:" # format of quoting header
set reply_to                         # reply to Reply to: field
set reverse_name                     # reply as whomever it was to
set include                          # include message in replies

Forward

set forward_format = "Fwd: %s"       # format of subject when forwarding
set forward_decode                   # decode when forwarding
set forward_quote                    # include message in forwards

Headers

ignore *                                # ignore all headers
unignore from: to: cc: date: subject:   # show only these
unhdr_order *
hdr_order from: to: cc: date: subject:  # and in this order

Sidebar

General Config

# Should the Sidebar be shown?
set sidebar_visible = yes

# How wide should the Sidebar be in screen columns?
# Note: Some characters, e.g. Chinese, take up two columns each.
set sidebar_width = 20

# Should the mailbox paths be abbreviated?
set sidebar_short_path = yes

# When abbreviating mailbox path names, use any of these characters as path
# separators.  Only the part after the last separators will be shown.
# For file folders '/' is good.  For IMAP folders, often '.' is useful.
set sidebar_delim_chars = '/.'

# If the mailbox path is abbreviated, should it be indented?
set sidebar_folder_indent = yes

# Indent mailbox paths with this string.
set sidebar_indent_string = '  '

# Make the Sidebar only display mailboxes that contain new, or flagged,
# mail.
set sidebar_new_mail_only = no

# Any mailboxes that are whitelisted will always be visible, even if the
# sidebar_new_mail_only option is enabled.
# sidebar_whitelist '/home/user/mailbox1'
# sidebar_whitelist '/home/user/mailbox2'

# When searching for mailboxes containing new mail, should the search wrap
# around when it reaches the end of the list?
set sidebar_next_new_wrap = no

# Show the Sidebar on the right-hand side of the screen
set sidebar_on_right = no

# The character to use as the divider between the Sidebar and the other Mutt
# panels.
# Note: Only the first character of this string is used.
set sidebar_divider_char = '│'

# Enable extended buffy mode to calculate total, new, and flagged
# message counts for each mailbox.
set mail_check_stats

# Display the Sidebar mailboxes using this format string.
set sidebar_format = '%D %* %?N?[%N]?'

# Sort the mailboxes in the Sidebar using this method:
#       count    - total number of messages
#       flagged  - number of flagged messages
#       new      - number of new messages
#       path     - mailbox path
#       unsorted - do not sort the mailboxes
set sidebar_sort_method = 'unsorted'

Mailboxes to show in the sidebar.

named-mailboxes "   Search" =search
named-mailboxes " GMAIL" =empty/gmail
named-mailboxes "   Inbox" =gmail/Inbox
named-mailboxes "   Sent" =gmail/Sent
named-mailboxes "   Drafts" =gmail/Drafts
named-mailboxes " ﮊ  Archive" =gmail/Archive
named-mailboxes "   Trash" =gmail/Trash
named-mailboxes " ESRF" =empty/esrf
named-mailboxes "   Inbox" =esrf/Inbox
named-mailboxes "   Sent" =esrf/Sent
named-mailboxes "   Drafts" =esrf/Drafts
named-mailboxes " ﮊ  Archive" =esrf/Archive
named-mailboxes "   Trash" =esrf/Trash
unset move

Attachments

Attachment View Options

set attach_format = "[%D %t] %2n [%-7.7m/%10.10M] %.40d %> [%s] "

Open Attachment

Program to open is defined in the mailcap file.

A script openfile.sh is used to open files with the default application using xdg-open.

Attach multiple files at once

First, tag the files you want to send using t, then ; to apply the action on all tagged files and finally <enter> to add them all.

Of ranger can be used with the A keybinding.

Forgotten Attachment

set abort_noattach = ask-yes
set abort_noattach_regex = "\\<(attach(|ed|ments?)|(attaché|attachés|attache|attachons|joint|jointe|joints|jointes|joins|joignons))\\>"

Scripts and other config files

Search Mail

arg_subject=$(rofi -p "Search" -dmenu)

arg_from=$(rofi -p "From" -dmenu)
if [ ! -z "$arg_from" ]; then
    arg_from="from:${arg_from}"
fi

arg_to=$(rofi -p "To" -dmenu)
if [ ! -z "$arg_to" ]; then
    arg_to="to:${arg_to}"
fi

arg_mime=$(echo -e "\napplication/pdf\nimage/*\nvideo/*" | rofi -i -p "Mime" -dmenu)
if [ ! -z "$arg_mime" ]; then
    arg_mime="mime:${arg_mime}"
fi

mu find --clearlinks --format=links --linksdir=~/.mail/search "${arg_from} ${arg_to} ${arg_mime} ${arg_subject}"

Send Mail Script

msmtp -a $1 ${@:2} && \
    if [ $TMUX ]; then
        tmux split -v -l 1 mbsync $1-Sent && tmux select-pane -U
    else
        mbsync $1-Sent
    fi

Sync Mail Script

if [ $TMUX ]; then
    tmux split -v -l 1 checkmail $1 && tmux select-pane -U
else
    checkmail $1
fi

Openfile Scripts

base=$(basename "$1")
ext="${base##*.}"

file=$(mktemp -u --suffix=".$ext")

rm -f "$file"

cp "$1" "$file"

setsid xdg-open "$file" >/dev/null 2>&1 &

urlview Config

REGEXP (((http|https|ftp|gopher)|mailto)[.:][^ >"\t]*|www\.[-a-z0-9.]+)[^ .,;\t>">\):]

COMMAND nohup qutebrowser %s </dev/null &>/dev/null &

Mailcap

Generic

text/plain; nvim %s
video/*; setsid mpv --quiet %s &
image/*; sxiv -a -b %s &
application/pdf; zathura %s &
audio/*; /usr/bin/xdg-open %s; copiousoutput
text/html; export DISPLAY=:0 && setsid qutebrowser %s > /dev/null 2>&1 &; nametemplate=%s.html
text/html; lynx -width ${COLUMNS:-80} -dump %s; nametemplate=%s.html; copiousoutput;

For calendar output, a personal ics-add script is used.

text/calendar; ics-add %s; copiousoutput;
application/ics; ics-add %s; copiousoutput;

Libreoffice

application/docx; libreoffice %s --nologo &; copiousoutput;
application/doc; libreoffice --nologo %s &; copiousoutput;

application/vnd.oasis.opendocument.database; libreoffice --nologo --base '%s'; copiousoutput
application/vnd.oasis.opendocument.chart; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.oasis.opendocument.spreadsheet; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.oasis.opendocument.spreadsheet-template; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.oasis.opendocument.graphics; libreoffice --nologo --draw '%s'; copiousoutput
application/vnd.oasis.opendocument.graphics-template; libreoffice --nologo --draw '%s'; copiousoutput
application/vnd.oasis.opendocument.presentation; libreoffice --nologo --impress '%s'; copiousoutput
application/vnd.oasis.opendocument.presentation-template; libreoffice --nologo --impress '%s'; copiousoutput
application/vnd.oasis.opendocument.formula; libreoffice --nologo --math '%s'; copiousoutput
application/vnd.oasis.opendocument.text; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.oasis.opendocument.text-master; libreoffice --nologo -global '%s'; copiousoutput
application/vnd.oasis.opendocument.text-template; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.oasis.opendocument.text-web; libreoffice --nologo -web '%s'; copiousoutput
application/vnd.sun.xml.base; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.sun.xml.calc; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.sun.xml.calc.template; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.sun.xml.draw; libreoffice --nologo --draw '%s'; copiousoutput
application/vnd.sun.xml.draw.template; libreoffice --nologo --draw '%s'; copiousoutput
application/vnd.stardivision.calc; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.stardivision.chart; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.stardivision.draw; libreoffice --nologo --draw '%s'; copiousoutput
application/vnd.stardivision.impress; libreoffice --nologo --impress '%s'; copiousoutput
application/vnd.stardivision.math; libreoffice --nologo --math '%s'; copiousoutput
application/vnd.stardivision.writer-global; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.stardivision.writer; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.sun.xml.impress; libreoffice --nologo --impress '%s'; copiousoutput
application/vnd.sun.xml.impress.template; libreoffice --nologo --impress '%s'; copiousoutput
application/vnd.sun.xml.math; libreoffice --nologo --math '%s'; copiousoutput
application/vnd.sun.xml.writer; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.sun.xml.writer.global; libreoffice --nologo -global '%s'; copiousoutput
application/vnd.sun.xml.writer.template; libreoffice --nologo --writer '%s'; copiousoutput
text/csv; libreoffice --nologo --calc '%s'; copiousoutput
text/spreadsheet; libreoffice --nologo --calc '%s'; copiousoutput
application/x-quattropro; libreoffice --nologo --calc '%s'; copiousoutput
application/x-dbf; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.ms-excel.sheet.macroEnabled.12; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.ms-excel.template.macroEnabled.12; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.openxmlformats-officedocument.spreadsheetml.template; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.lotus-1-2-3; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.ms-excel; libreoffice --nologo --calc '%s'; copiousoutput
application/msexcel; libreoffice --nologo --calc '%s'; copiousoutput
application/x-dbase; libreoffice --nologo --calc '%s'; copiousoutput
text/x-csv; libreoffice --nologo --calc '%s'; copiousoutput
application/vnd.ms-powerpoint.presentation.macroEnabled.12; libreoffice --nologo --impress '%s'; copiousoutput
application/vnd.ms-powerpoint.slideshow.macroEnabled.12; libreoffice --nologo --impress '%s'; copiousoutput
application/vnd.ms-powerpoint.template.macroEnabled.12; libreoffice --nologo --impress '%s'; copiousoutput
application/vnd.openxmlformats-officedocument.presentationml.presentation; libreoffice --nologo --impress '%s'; copiousoutput
application/vnd.openxmlformats-officedocument.presentationml.slideshow; libreoffice --nologo --impress '%s'; copiousoutput
application/vnd.openxmlformats-officedocument.presentationml.template; libreoffice --nologo --impress '%s'; copiousoutput
application/vnd.ms-powerpoint; libreoffice --nologo --impress '%s'; copiousoutput
application/mspowerpoint; libreoffice --nologo --impress '%s'; copiousoutput
text/mathml; libreoffice --nologo --math '%s'; copiousoutput
application/rtf; libreoffice --nologo --writer '%s'; copiousoutput
application/x-t602; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.wordperfect; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.ms-word.document.macroEnabled.12; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.ms-word.template.macroEnabled.12; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.openxmlformats-officedocument.wordprocessingml.document; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.openxmlformats-officedocument.wordprocessingml.template; libreoffice --nologo --writer '%s'; copiousoutput
application/vnd.ms-works; libreoffice --nologo --writer '%s'; copiousoutput
application/msword; libreoffice --nologo --writer '%s'; copiousoutput
application/wordperfect; libreoffice --nologo --writer '%s'; copiousoutput
text/rtf; libreoffice --nologo --writer '%s'; copiousoutput