#+TITLE: Mail Configuration #+SETUPFILE: ./setup/org-setup-file.org Installation: #+begin_src bash :tangle no sudo apt install mbsync msmtp maildir-utils neomutt lynx #+end_src * =mbsync= - Synchronize Mailboxes :PROPERTIES: :header-args:conf: :tangle ~/.mbsyncrc :header-args:conf+: :comments both :mkdirp yes :CUSTOM_ID: mbsync :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 Far/Near] 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 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 #+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 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 #+END_SRC #+BEGIN_SRC conf # 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 #+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 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 #+END_SRC #+BEGIN_SRC conf Channel esrf Far :esrf-remote: Near :esrf-local: #+END_SRC For doing a quick sync of just the INBOX with =mbsync esrf-download=. #+BEGIN_SRC conf Channel esrf-download Far :esrf-remote:INBOX Near :esrf-local:Inbox Create Near Expunge Near Sync Pull #+END_SRC * =msmtp= - Send Mails :PROPERTIES: :header-args:conf: :tangle ~/.config/msmtp/config :header-args:conf+: :comments both :mkdirp yes :CUSTOM_ID: msmtp :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" proxy_host localhost proxy_port 8080 #+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 ** Default Account #+BEGIN_SRC conf account default : esrf #+END_SRC * =mu= - Mail Indexer :PROPERTIES: :header-args:conf: :tangle ~/.config/neomutt/neomuttrc :header-args:conf+: :comments both :mkdirp yes :CUSTOM_ID: mu :END: =Mu= ([[https://github.com/djcb/mu][github]]) it used as a "maildir indexer/searcher". Useful commands are described in the [[http://www.djcbsoftware.nl/code/mu/cheatsheet.html][Cheat-sheet]]. For instance, to find mails with =pdf= attachments: #+begin_src bash :eval no :tangle no mu find 'mime:application/pdf' #+end_src * =neomutt= - Mail Client :PROPERTIES: :header-args:conf: :tangle ~/.config/neomutt/neomuttrc :header-args:conf+: :comments both :mkdirp yes :CUSTOM_ID: neomutt :END: https://neomutt.org/ Documentation: #+begin_src bash :results none :exports code :tangle no 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 Q exit 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 (list of mails) #+begin_src conf 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 macro index h "?" "Go back to the list of mailboxes" bind pager h 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 U toggle-new #+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 *** Pager (One mail opened) #+BEGIN_SRC conf 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 " urlscan" "call urls #+END_SRC #+begin_src conf bind index z collapse-thread bind index Z collapse-all #+end_src Write/Reply/Forward mail #+BEGIN_SRC conf 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 #+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 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 *** Compose #+BEGIN_SRC conf bind compose p postpone-message bind compose R rename-attachment bind compose a attach-file #+END_SRC Open another instance of neomutt in readonly mode while composing #+BEGIN_SRC conf macro compose M "$TERMINAL -e \"neomutt -R\"" #+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 file by drooping from GUI #+begin_src conf macro compose B "bash $HOME/.config/neomutt/bin/rangerpick dragonsource /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/\s/\\ /g' $tmpfile && echo "$(awk 'BEGIN {printf "%s", "push "} {printf "%s", ""$0""}' $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", ""$0""}' $tmpfile)" > $tmpfile elif [ $1 == "clean" ]; then ls $tmpfile fi #+end_src **** Send HTML mails using Markdown 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 *** 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 *** Sidebar #+BEGIN_SRC conf 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 #+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 "$HOME/.config/neomutt/bin/search_mail.sh~/.mail/search" \ "test" # 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 https://www.donarmstrong.com/posts/org_mode_mutt_capture/ https://upsilon.cc/~zack/blog/posts/2010/02/integrating_Mutt_with_Org-mode/ #+begin_src conf macro index,pager S "$HOME/.config/neomutt/bin/mutt-save-org-link.py\n" #+end_src **** Link mail to orgmode - Script :PROPERTIES: :header-args: :tangle ~/.config/neomutt/bin/mutt-save-org-link.py :header-args+: :comments both :mkdirp yes :header-args+: :shebang "#!/usr/bin/env python3" :END: https://orgmode.org/manual/The-capture-protocol.html#The-capture-protocol #+begin_src python 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}' ]) #+end_src ** Colors #+begin_src conf 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 "[;:]-*[)>( 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 = "+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 "+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 = "~/.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 \ "+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 signature #+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 = "~/.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 \ "+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 Mechatronics Engineer ESRF - The European Synchrotron Tel: +33 (0)4.76.88.22.34 #+end_src This empty code block is used to add a new line after signature #+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 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'" #+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 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 #+END_SRC *** Forward #+BEGIN_SRC conf set forward_format = "Fwd: %s" # format of subject when forwarding set forward_decode # decode when forwarding 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 = '%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' #+END_SRC *** Mailboxes to show in the sidebar. #+BEGIN_SRC conf 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 #+END_SRC #+BEGIN_SRC conf 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. Of ranger can be used with the =A= keybinding. *** 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 :PROPERTIES: :header-args: :comments both :mkdirp yes :header-args+: :shebang "#!/usr/bin/env bash" :END: *** Search Mail #+begin_src bash :tangle ~/.config/neomutt/bin/search_mail.sh 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}" #+end_src *** Send Mail Script #+begin_src bash :tangle ~/.config/neomutt/bin/send_mail.sh msmtp -a $1 ${@:2} && \ if [ $TMUX ]; then tmux split -v -l 1 mbsync $1-Sent && tmux select-pane -U else mbsync $1-Sent fi #+end_src *** Sync Mail Script #+begin_src bash :tangle ~/.config/neomutt/bin/get_new_mail.sh if [ $TMUX ]; then tmux split -v -l 1 checkmail $1 && tmux select-pane -U else checkmail $1 fi #+end_src *** Openfile Scripts #+begin_src bash :tangle ~/.config/neomutt/bin/openfile.sh 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 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; #+END_SRC For calendar output, a personal =ics-add= script is used. #+BEGIN_SRC conf text/calendar; ics-add %s; copiousoutput; application/ics; ics-add %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