#+TITLE: Mail Configuration * Synchronize Mailboxes - Mbsync :PROPERTIES: :header-args:conf: :tangle ~/.mbsyncrc :header-args:conf+: :comments both :mkdirp yes :END: http://isync.sourceforge.net/ ** Global Defaults #+BEGIN_SRC conf # 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 Master/Slave] marked for deletion. Expunge Both #+END_SRC ** Gmail Account #+BEGIN_SRC conf 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 #+END_SRC #+BEGIN_SRC conf IMAPStore gmail-remote Account gmail MaildirStore gmail-local Path ~/.mail/gmail/ Inbox ~/.mail/gmail/Inbox Channel gmail-Home Master :gmail-remote:"INBOX" Slave :gmail-local:Inbox Channel gmail-Drafts Master :gmail-remote:"[Gmail]/Drafts" Slave :gmail-local:Drafts Channel gmail-Sent Master :gmail-remote:"[Gmail]/Sent Mail" Slave :gmail-local:Sent Channel gmail-Trash Master :gmail-remote:"[Gmail]/Trash" Slave :gmail-local:Trash Channel gmail-All Master :gmail-remote:"[Gmail]/All Mail" Slave :gmail-local:Archive #+END_SRC #+BEGIN_SRC conf # 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 Master :gmail-remote: Slave :gmail-local: # Exclude everything under the internal [Gmail] folder, except the interesting folders Patterns * Patterns !INBOX Patterns ![Gmail]* Patterns !Archive Patterns !Drafts Patterns !Sent Mail Patterns !Trash Patterns !Spam Patterns !Starred #+END_SRC #+BEGIN_SRC conf # For doing a quick sync of just the INBOX with `mbsync gmail-download`. Channel gmail-download Master :gmail-remote:"INBOX" Slave :gmail-local:Inbox Create Slave Expunge Slave Sync Pull #+END_SRC ** ESRF Account #+BEGIN_SRC conf IMAPAccount esrf Host imaps.esrf.fr User dehaeze PassCmd "pass email/thomas.dehaeze@esrf.fr" SSLType IMAPS AuthMechs LOGIN #+END_SRC #+BEGIN_SRC conf IMAPStore esrf-remote Account esrf MaildirStore esrf-local Path ~/.mail/esrf/ Inbox ~/.mail/esrf/Inbox Channel esrf-Home Master :esrf-remote:"Inbox" Slave :esrf-local:Inbox Channel esrf-Drafts Master :esrf-remote:"Drafts" Slave :esrf-local:Drafts Channel esrf-Archive Master :esrf-remote:"Archive" Slave :esrf-local:Archive Channel esrf-Sent Master :esrf-remote:"Sent" Slave :esrf-local:Sent Channel esrf-Trash Master :esrf-remote:"Trash" Slave :esrf-local:Trash #+END_SRC #+BEGIN_SRC conf Channel esrf Master :esrf-remote: Slave :esrf-local: #+END_SRC For doing a quick sync of just the INBOX with `mbsync esrf-download`. #+BEGIN_SRC conf Channel esrf-download Master :esrf-remote:"INBOX" Slave :esrf-local:Inbox Create Slave Expunge Slave Sync Pull #+END_SRC ** ULG Account #+BEGIN_SRC conf IMAPAccount ulg Host mail.ulg.ac.be User thomas.dehaeze@doct.uliege.be PassCmd "pass email/thomas.dehaeze@doct.uliege.be" SSLType IMAPS AuthMechs LOGIN #+END_SRC #+BEGIN_SRC conf IMAPStore ulg-remote Account ulg MaildirStore ulg-local Path ~/.mail/ulg/ Inbox ~/.mail/ulg/Inbox Channel ulg-Home Master :ulg-remote:"Inbox" Slave :ulg-local:Inbox Channel ulg-Drafts Master :ulg-remote:"Drafts" Slave :ulg-local:Drafts Channel ulg-Archive Master :ulg-remote:"Archive" Slave :ulg-local:Archive Channel ulg-Sent Master :ulg-remote:"Sent" Slave :ulg-local:Sent Channel ulg-Trash Master :ulg-remote:"Trash" Slave :ulg-local:Trash #+END_SRC #+BEGIN_SRC conf Channel ulg Master :ulg-remote: Slave :ulg-local: #+END_SRC For doing a quick sync of just the INBOX with `mbsync ulg-download`. #+BEGIN_SRC conf Channel ulg-download Master :ulg-remote:"Inbox" Slave :ulg-local:Inbox Create Slave Expunge Slave Sync Pull #+END_SRC * Send Mails - Msmtp :PROPERTIES: :header-args:conf: :tangle ~/.msmtprc :header-args:conf+: :comments both :mkdirp yes :END: https://marlam.de/msmtp/ ** Defaults #+BEGIN_SRC conf defaults auth on tls on tls_certcheck off #+END_SRC ** Gmail Account #+BEGIN_SRC conf 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" #+END_SRC ** ESRF Account #+BEGIN_SRC conf 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" #+END_SRC ** ULG Account #+BEGIN_SRC conf account ulg host smtp.ulg.ac.be port 587 protocol smtp from thomas.dehaeze@doct.uliege.be user s177313 tls_starttls on passwordeval "pass email/thomas.dehaeze@doct.uliege.be" #+END_SRC ** Default Account #+BEGIN_SRC conf account default : gmail #+END_SRC * TODO Mail Indexer - Mu http://www.djcbsoftware.nl/code/mu/ ** Cheatsheet http://www.djcbsoftware.nl/code/mu/cheatsheet.html * Mail Client - NeoMutt :PROPERTIES: :header-args:conf: :tangle ~/.config/neomutt/neomuttrc :header-args:conf+: :comments both :mkdirp yes :END: https://neomutt.org/ Documentation: #+begin_src bash :results none :exports code man neomutt man neomuttrc #+end_src ** Bindings *** Unding all the key bindings #+begin_src conf 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 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 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 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 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 \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 \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 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 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 noop bind generic,pager,editor,index noop bind generic,pager,editor,index 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 #+end_src *** Quit Neomutt #+begin_src conf bind index,pager,compose Q exit macro index q "if [ $TMUX ]; then tmux detach; fi" #+end_src *** Generic #+begin_src conf bind generic 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 #+end_src *** Index and Pager #+BEGIN_SRC conf bind pager k previous-line bind pager j next-line bind index collapse-thread bind index,pager K previous-entry bind index,pager J next-entry bind index l display-message bind index display-message bind pager l view-attachments bind pager gg top bind pager 0 top bind pager G bottom bind pager $ bottom macro index h "?" "Go back to the list of mailboxes" bind pager h exit bind pager q exit macro index c "?" "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 \ "~NN." \ "mark all new as read" #+END_SRC #+begin_src conf bind index za collapse-thread bind index zA collapse-all # Missing :folddisable/foldenable #+end_src Write/Reply/Forward mail #+BEGIN_SRC conf bind index,pager p recall-message bind index,pager m mail bind index,pager r reply bind index,pager R group-reply bind index,pager b bounce-message bind index,pager f forward-message #+END_SRC Sync Mailbox #+begin_src conf bind index,pager s sync-mailbox #+end_src Sync email #+BEGIN_SRC conf macro index,pager o "$HOME/.config/neomutt/bin/get_new_mail.sh" macro index,pager O "$HOME/.config/neomutt/bin/get_new_mail.sh -a" #+END_SRC Make quick html view macro #+BEGIN_SRC conf macro index,pager H "html" #+END_SRC Open mail with Vim #+begin_src conf macro index,pager V "plain" #+end_src #+begin_src conf # bind index,pager U toggle-new #+end_src Labels #+BEGIN_SRC conf bind index,pager y edit-label bind index,pager Y modify-labels #+END_SRC *** Limit #+begin_src conf bind index L limit macro index a all #+end_src *** Search #+begin_src conf bind generic,index,pager / search bind index,pager n search-next bind index,pager N search-opposite #+end_src *** Attachments #+begin_src conf bind attach l view-attach bind attach h exit bind attach q exit bind attach view-mailcap macro attach W ~/Downloads/y "Save entry" #+end_src Attach multiple files using ranger #+begin_src conf macro compose A "bash $HOME/.config/neomutt/bin/rangerpicksource /tmp/rangerpickbash $HOME/.config/neomutt/bin/rangerpick clean" "Attach with Ranger" #+end_src **** Attach with Ranger Script :PROPERTIES: :header-args: :tangle ~/.config/neomutt/bin/rangerpick :header-args+: :comments both :mkdirp yes :header-args+: :shebang "#!/usr/bin/env bash" :END: #+begin_src bash tmpfile=/tmp/rangerpick if [ -z "$1" ]; then ranger --choosefiles $tmpfile && sed -i 's/^//' $tmpfile && sed -i 's/$//' $tmpfile && sed -i ':a;N;$!ba;s/\n//g' $tmpfile && sed -i 's/^/push /' $tmpfile elif [ $1 == "clean" ]; then rm $tmpfile fi #+end_src *** TODO Compose #+BEGIN_SRC conf bind compose p postpone-message bind compose R rename-attachment bind compose a attach-file #+END_SRC Write html emails using markdown #+BEGIN_SRC conf # macro compose M "F pandoc -s -f markdown -t html \ny^T^Utext/html; charset=us-ascii\n" #+END_SRC Open another instance of neomutt in readonly mode while composing #+BEGIN_SRC conf macro compose M "termite -e \"neomutt -R\"" #+END_SRC *** Browser #+begin_src conf bind browser l select-entry macro browser h "" bind browser q exit #+end_src *** Generic Enter Command #+begin_src conf bind generic,index,pager : enter-command #+end_src *** Copy and move mails #+BEGIN_SRC conf macro index C "?" "copy a message to a mailbox" macro index M "?" "move a message to a mailbox" #+END_SRC *** Sidebar #+BEGIN_SRC conf bind index,pager \Ck sidebar-prev bind index,pager \Cj sidebar-next bind index,pager \Cl sidebar-open bind index,pager \Ch sidebar-toggle-visible #+END_SRC *** Reload Configuration #+begin_src conf macro generic,index,pager,editor , ":source ~/.config/neomutt/neomuttrc\n" "Reload mutt's configuration file" #+end_src *** urlview - Open URL in emails Use =urlview= to extract urls from the mail. #+begin_src conf macro attach,compose,index,pager \cw "\ :set my_tmp_pipe_decode=\$pipe_decode\n\ :set pipe_decode\n\ 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' #+end_src *** Searching using Mu #+begin_src conf macro index,pager \Cf "mu find --clearlinks --format=links --linksdir=~/.mail/search " \ "mu find" macro index,pager gf "~/.mail/search" \ "mu find results" #+end_src *** Link to Orgmode #+begin_src conf macro index,pager S "$HOME/scripts/mutt-save-org-link.py\n" #+end_src **** Link mail to orgmode - Script :PROPERTIES: :header-args: :tangle ~/scripts/mutt-save-org-link.py :header-args+: :comments both :mkdirp yes :header-args+: :shebang "#!/usr/bin/env python3" :END: #+begin_src python import sys import email import subprocess import urllib.parse # Parse the email from standard input message_bytes = sys.stdin.buffer.read() message = email.message_from_bytes(message_bytes) # Grab the relevant message headers message_id = urllib.parse.quote(message['message-id'].strip()[1:-1]) subject = message['subject'].replace('[', '{').replace(']', '}') # Ask emacsclient to save a link to the message p = subprocess.Popen([ 'emacsclient', f'org-protocol://store-link?url=message://{message_id}&title={subject}' ]) p.wait() #+end_src ** Colors *** Basic colors #+BEGIN_SRC conf color normal color021 color000 color error color021 color000 color tilde color021 color000 color message color021 color000 color markers color021 color000 color attachment color021 color000 color search color000 color003 color status color016 color000 color indicator color000 color021 color tree color021 color000 color progress color000 color021 # basic monocolor screen mono bold bold mono underline underline mono indicator reverse mono error bold #+END_SRC *** Index #+begin_src conf color index color021 color000 "~A" # All messages color index brightcolor006 color000 "~N" # New messages color index color020 color000 "~O" # Old messages color index color020 color000 "~Q" # messages that have been replied to color index color021 color000 "~R" # read messages color index color006 color000 "~U" # unread messages color index color021 color000 "~R~p!~F" # messages to me color index brightcolor006 color000 "~N~p!~F" # new messages to me color index brightcolor006 color000 "~U~p!~F" # unread messages to me color index color005 color000 "~F" # flagged messages color index color005 color000 "~F~p" # flagged messages to me color index brightcolor006 color000 "~N~F" # new flagged messages color index brightcolor006 color000 "~N~F~p" # new flagged messages to me color index brightcolor006 color000 "~U~F~p" # new flagged messages to me color index brightcolor000 color001 "~D" # deleted messages color index brightcolor021 color019 "~v~(!~N)" # collapsed thread with no unread color index brightcolor006 color019 "~v~(~N)" # collapsed thread with some unread color index brightcolor006 color019 "~N~v~(~N)" # collapsed thread with unread parent color index brightcolor005 color019 "~v~(~F)!~N" # collapsed thread with flagged, no unread color index brightcolor006 color019 "~v~(~F~N)" # collapsed thread with some unread & flagged color index brightcolor006 color019 "~N~v~(~F~N)" # collapsed thread with unread parent & flagged color index brightcolor005 color019 "~N~v~(~F)" # collapsed thread with unread parent, no unread inside, but some flagged color index brightcolor000 color001 "~v~(~D)" # thread with deleted (doesn't differentiate between all or partial) #+end_src *** Sidebar #+begin_src conf color sidebar_indicator color000 color021 # Mailbox is open color sidebar_highlight color000 color003 # Mailbox is highlighted color sidebar_new brightcolor006 color000 # Mailbox contains new mail color sidebar_ordinary color021 color000 # Mailbox contains new mail #+end_src *** Message headers #+BEGIN_SRC conf color hdrdefault color006 color000 color header brightcolor006 color000 "^(From)" color header brightcolor004 color000 "^(Subject)" #+END_SRC *** Attachments #+begin_src conf # Color if the attachment is autoviewed color attach_headers brightgreen default "Autoview" # Color only the brackets around the headers color attach_headers brightyellow default "^\\[--" color attach_headers brightyellow default "--]$" # Color the mime type and the size color attach_headers green default "Type: [a-z]+/[a-z0-9\-]+" color attach_headers green default "Size: [0-9\.]+[KM]" # Color GPGME signature checks color attach_headers brightgreen default "Good signature from.*" color attach_headers brightred default "Bad signature from.*" color attach_headers brightred default "BAD signature from.*" color attach_headers brightred default "Note: This key has expired!" color attach_headers brightmagenta default "Problem signature from.*" color attach_headers brightmagenta default "WARNING: This key is not certified with a trusted signature!" color attach_headers brightmagenta default " There is no indication that the signature belongs to the owner." color attach_headers brightmagenta default "can't handle these multiple signatures" color attach_headers brightmagenta default "signature verification suppressed" color attach_headers brightmagenta default "invalid node with packet of type" #+end_src *** Body #+BEGIN_SRC conf color quoted color002 color000 color quoted1 color003 color000 color quoted2 color004 color000 color quoted3 color005 color000 color quoted4 color006 color000 color signature color021 color000 color bold brightcolor021 color000 color underline brightcolor021 color000 color normal color021 color000 #+END_SRC *** PGP #+BEGIN_SRC conf color body color001 color000 "(BAD signature)" color body color002 color000 "(Good signature)" color body color002 color000 "^gpg: Good signature .*" color body color002 color000 "^gpg: " color body color002 color000 "^gpg: BAD signature from.*" #+END_SRC *** Urls #+BEGIN_SRC conf color body color006 color000 "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]" #+END_SRC *** Emails #+BEGIN_SRC conf color body color006 color000 "((@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\]),)*@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\]):)?[0-9a-z_.+%$-]+@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\])" #+END_SRC ** Contacts with Mu #+BEGIN_SRC conf set query_command="mu cfind '%s' -o mutt-ab" bind editor complete-query #+END_SRC ** Paths #+BEGIN_SRC conf 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 #+END_SRC ** Print https://unix.stackexchange.com/questions/20456/pretty-print-mails-from-mutt #+BEGIN_SRC conf # set print_command="/usr/bin/muttprint %s -p ctb110c1u" #+END_SRC ** Accounts #+BEGIN_SRC conf set spoolfile = "+gmail/Inbox" # Default inbox set realname = "Dehaeze Thomas" set from = "dehaeze.thomas@gmail.com" folder-hook gmail/* source ~/.config/neomutt/accounts/gmail folder-hook esrf/* source ~/.config/neomutt/accounts/esrf folder-hook ulg/* source ~/.config/neomutt/accounts/ulg macro index,pager gu "+ulg/Inbox" "go to inbox" macro index,pager ge "+esrf/Inbox" "go to inbox" macro index,pager gm "+gmail/Inbox" "go to inbox" #+END_SRC *** Gmail **** Configuration #+begin_src conf :tangle ~/.config/neomutt/accounts/gmail :comments none set from = "dehaeze.thomas@gmail.com" set sendmail = "msmtp -a gmail" # Other special folders. set mbox = "+gmail/Archive" unset record # Don't copy send message to Sent folder: Gmail does that for us set postponed = "+gmail/Drafts" set signature = "~/.config/neomutt/accounts/gmail.signature" macro index,pager d \ "+gmail/Archive" \ "Move message to the Archive" macro index,pager D \ "+gmail/Trash" \ "Move message to the Trash" #+end_src **** Signature #+begin_src conf :tangle ~/.config/neomutt/accounts/gmail.signature :comments none :padline no Thomas Dehaeze #+end_src This empty code block is used to add a new line after signatude #+begin_src conf :tangle ~/.config/neomutt/accounts/gmail.signature :comments none :padline no #+end_src *** ESRF **** Configuration #+begin_src conf :tangle ~/.config/neomutt/accounts/esrf :comments none set from = "thomas.dehaeze@esrf.fr" set sendmail = "msmtp -a 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 \ "+esrf/Archive" \ "Move message to the Archive" macro index,pager D \ "+esrf/Trash" \ "Move message to the Trash" #+end_src **** Signature #+begin_src conf :tangle ~/.config/neomutt/accounts/esrf.signature :comments none :padline no Thomas Dehaeze #+end_src This empty code block is used to add a new line after signatude #+begin_src conf :tangle ~/.config/neomutt/accounts/esrf.signature :comments none :padline no #+end_src *** ULG **** Configuration #+begin_src conf :tangle ~/.config/neomutt/accounts/ulg :comments none set from = "thomas.dehaeze@doct.uliege.be" set sendmail = "msmtp -a ulg" # Other special folders. set mbox = "+ulg/Archive" set record = "+ulg/Sent" set postponed = "+ulg/Drafts" set signature = "~/.config/neomutt/accounts/ulg.signature" macro index,pager d \ "+ulg/Archive" \ "Move message to the Archive" macro index,pager D \ "+ulg/Trash" \ "Move message to the Trash" #+end_src **** Signature #+begin_src conf :tangle ~/.config/neomutt/accounts/ulg.signature :comments none :padline no Thomas Dehaeze #+end_src This empty code block is used to add a new line after signatude #+begin_src conf :tangle ~/.config/neomutt/accounts/esrf.signature :comments none :padline no #+end_src ** Basic Options #+BEGIN_SRC conf 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 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' -c ':Goyo'" #+END_SRC ** View Options *** Status Bar #+BEGIN_SRC conf 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 )?───" #+END_SRC *** Index View Options #+BEGIN_SRC conf 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" #+END_SRC *** Pager View Options #+BEGIN_SRC conf 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 #+END_SRC *** Compose View Options #+BEGIN_SRC conf set envelope_from # which from? 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 askcc # ask for CC: set fcc_attach # save attachments with the body set mime_forward = yes # forward attachments as part of body set forward_format = "Fwd: %s" # format of subject when forwarding set forward_decode # decode when forwarding 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 set forward_quote # include message in forwards #+END_SRC *** Headers #+BEGIN_SRC conf 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 #+END_SRC ** Sidebar *** General Config #+BEGIN_SRC conf # 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 = '%B %?N?(%N)?%* %S' # 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' #+END_SRC *** Mailboxes to show in the sidebar. #+BEGIN_SRC conf mailboxes \ +search \ "+Google" \ +gmail/Inbox \ +gmail/Archive \ +gmail/Drafts \ +gmail/Sent \ +gmail/Trash \ "+ESRF" \ +esrf/Inbox \ +esrf/Archive \ +esrf/Drafts \ +esrf/Sent \ +esrf/Trash \ "+ULG" \ +ulg/Inbox \ +ulg/Archive \ +ulg/Drafts \ +ulg/Sent \ +ulg/Trash \ set sendmail_wait = 0 # no please don't silently fail, email is important unset move #+END_SRC ** Attachments *** Attachment View Options #+BEGIN_SRC conf set attach_format = "[%D %t] %2n [%-7.7m/%10.10M] %.40d %> [%s] " #+END_SRC *** 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 == to add them all. *** Forgotten Attachment #+begin_src conf set abort_noattach = ask-yes set abort_noattach_regex = "\\<(attach(|ed|ments?)|(attaché|attachés|attache|attachons|joint|jointe|joints|jointes|joins|joignons))\\>" #+end_src ** Scripts and other config files *** Sync Mail script :PROPERTIES: :header-args: :tangle ~/.config/neomutt/bin/get_new_mail.sh :header-args+: :comments both :mkdirp yes :header-args+: :shebang "#!/usr/bin/env bash" :END: #+begin_src bash if [ $TMUX ]; then tmux split -v -l 1 ~/scripts/checkmail.sh $1 && tmux select-pane -U else ~/scripts/checkmail.sh $1 fi #+end_src *** Openfile Scripts :PROPERTIES: :header-args: :tangle ~/.config/neomutt/bin/openfile.sh :header-args+: :comments both :mkdirp yes :header-args+: :shebang "#!/usr/bin/env bash" :END: #+begin_src bash base=$(basename "$1") ext="${base##*.}" file=$(mktemp -u --suffix=".$ext") rm -f "$file" cp "$1" "$file" setsid xdg-open "$file" >/dev/null 2>&1 & #+end_src *** urlview Config :PROPERTIES: :header-args:conf+: :tangle ~/.urlview :header-args:conf+: :comments both :mkdirp yes :END: #+BEGIN_SRC conf REGEXP (((http|https|ftp|gopher)|mailto)[.:][^ >"\t]*|www\.[-a-z0-9.]+)[^ .,;\t>">\):] COMMAND nohup qutebrowser %s /dev/null & #+END_SRC *** Mailcap :PROPERTIES: :header-args:conf: :tangle ~/.config/neomutt/mailcap :header-args:conf+: :comments both :mkdirp yes :END: Generic #+BEGIN_SRC conf text/plain; nvim %s audio/*; /usr/bin/xdg-open %s; copiousoutput video/*; setsid mpv --quiet %s &; copiousoutput image/*; ~/.config/neomutt/bin/openfile.sh %s; application/pdf; ~/.config/neomutt/bin/openfile.sh %s; text/html; export DISPLAY=:0 && setsid qutebrowser %s; nametemplate=%s.html text/html; w3m -I %{charset} -T text/html; copiousoutput; text/calendar; khal import --batch -a home %s && khal printics %s; copiousoutput; application/ics; khal import --batch -a home %s && khal printics %s; copiousoutput; #+END_SRC Libreoffice #+begin_src conf 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 #+end_src