literate-dotfiles/mail.org

54 KiB

Mail Configuration

Synchronize Mailboxes - Mbsync

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 Master/Slave] 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
  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
  # 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
  # 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

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
  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
  Channel esrf
  Master :esrf-remote:
  Slave :esrf-local:

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

  Channel esrf-download
  Master :esrf-remote:"INBOX"
  Slave :esrf-local:Inbox
  Create Slave
  Expunge Slave
  Sync Pull

ULG Student Account

  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
  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
  Channel ulg
  Master :ulg-remote:
  Slave :ulg-local:

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

  Channel ulg-download
  Master :ulg-remote:"Inbox"
  Slave :ulg-local:Inbox
  Create Slave
  Expunge Slave
  Sync Pull

ULG Personal Account

  IMAPAccount uliege
  Host mail.ulg.ac.be
  User tdehaeze@uliege.be
  PassCmd "pass email/tdehaeze@uliege.be"
  SSLType IMAPS
  AuthMechs LOGIN
  IMAPStore uliege-remote
  Account uliege

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

  Channel uliege-Home
  Master :uliege-remote:"Inbox"
  Slave :uliege-local:Inbox

  Channel uliege-Drafts
  Master :uliege-remote:"Drafts"
  Slave :uliege-local:Drafts

  Channel uliege-Archive
  Master :uliege-remote:"Archive"
  Slave :uliege-local:Archive

  Channel uliege-Sent
  Master :uliege-remote:"Sent"
  Slave :uliege-local:Sent

  Channel uliege-Trash
  Master :uliege-remote:"Trash"
  Slave :uliege-local:Trash
  Channel uliege
  Master :uliege-remote:
  Slave :uliege-local:

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

  Channel uliege-download
  Master :uliege-remote:"Inbox"
  Slave :uliege-local:Inbox
  Create Slave
  Expunge Slave
  Sync Pull

Send Mails - Msmtp

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"

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"

ULG Account

  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"

ULIEGE Account

  account        uliege
  host           smtp.ulg.ac.be
  port           587
  protocol       smtp
  from           tdehaeze@uliege.be
  user           u231244
  tls_starttls   on
  passwordeval   "pass email/tdehaeze@uliege.be"

Default Account

  account default : gmail

Mail Indexer - Mu

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'

Mail Client - NeoMutt

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 and Pager

  bind pager k  previous-line
  bind pager j  next-line

  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
  bind pager l view-attachments

  bind pager gg top
  bind pager 0 top

  bind pager G bottom
  bind pager $ bottom

  macro index h "<change-folder>?" "Go back to the list of mailboxes"
  bind pager h exit
  bind pager q 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 za collapse-thread
  bind index zA collapse-all # Missing :folddisable/foldenable

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>"
  # bind index,pager U toggle-new

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-drag-and-drop --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 t tag-entry

  bind browser q exit

Generic

Enter Command

  bind generic,index,pager : enter-command

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"

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>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
  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(']', '}').replace('\n', ' ')
  subject = (subject[:75] + '..') if len(subject) > 75 else subject

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

  p.wait()

Colors

Basic colors

  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

Index

  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)

Sidebar

 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

Message headers

  color hdrdefault color006       color000
  color header     brightcolor006 color000 "^(From)"
  color header     brightcolor004 color000 "^(Subject)"

Attachments

  # 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"

Body

  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

PGP

  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.*"

Urls

  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<>\"]"

Emails

  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]\\])"

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 = "+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
  folder-hook uliege/*   source ~/.config/neomutt/accounts/uliege

  macro index,pager gl "<change-folder>+uliege/Inbox<enter>" "go to inbox"
  macro index,pager gu "<change-folder>+ulg/Inbox<enter>" "go to inbox"
  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 = "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 \
    "<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 = "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 \
    "<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

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

ULG

Configuration
  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 \
    "<save-message>+ulg/Archive<enter>" \
    "Move message to the Archive"

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

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

ULIEGE

Configuration
  set from     = "tdehaeze@uliege.be"
  set sendmail = "msmtp -a uliege"

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

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

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

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

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 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

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
  named-mailboxes " ULG" =empty/ulg
  named-mailboxes "   Inbox" =ulg/Inbox
  named-mailboxes "   Sent" =ulg/Sent
  named-mailboxes "   Drafts" =ulg/Drafts
  named-mailboxes " ﮊ  Archive" =ulg/Archive
  named-mailboxes "   Trash" =ulg/Trash
  named-mailboxes " ULIEGE" =empty/uliege
  named-mailboxes "   Inbox" =uliege/Inbox
  named-mailboxes "   Sent" =uliege/Sent
  named-mailboxes "   Drafts" =uliege/Drafts
  named-mailboxes " ﮊ  Archive" =uliege/Archive
  named-mailboxes "   Trash" =uliege/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

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; 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;

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