From 06603fae365cf8180d7c14a409cd2c16f3aaa90c Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Mon, 6 Apr 2020 17:10:39 +0200 Subject: [PATCH] Mu4e config --- dotfiles/doom.org | 387 ++++++++++++++++++++++------------------------ 1 file changed, 184 insertions(+), 203 deletions(-) diff --git a/dotfiles/doom.org b/dotfiles/doom.org index fbbcb08..d8b78f8 100644 --- a/dotfiles/doom.org +++ b/dotfiles/doom.org @@ -853,7 +853,7 @@ by spaces. :message "you need to install the programs: pdflatex and imagemagick." :image-input-type "pdf" :image-output-type "png" - :image-size-adjust (0.4 . 0.4) + :image-size-adjust (1.0 . 1.0) :latex-compiler ("pdflatex -interaction nonstopmode -output-directory %o %f") :image-converter ("convert -density %D -trim -antialias %f -quality 100 %O")) (dvipng @@ -2521,209 +2521,21 @@ Map Functions 'append) #+end_src -* Mails With Mu4e -:PROPERTIES: -:header-args:emacs-lisp+: :tangle no -:END: -- https://github.com/kzar/davemail -- http://cachestocaches.com/2017/3/complete-guide-email-emacs-using-mu-and-/ -- http://spacemacs.org/layers/+email/mu4e/README.html -- http://www.djcbsoftware.nl/code/mu/mu4e/index.html#Top -- https://notanumber.io/2016-10-03/better-email-with-mu4e/ -- https://vxlabs.com/2017/02/07/mu4e-0-9-18-e-mailing-with-emacs-now-even-better/ -- http://www.brool.com/post/using-mu4e/ -- https://www.reddit.com/r/emacs/comments/8q84dl/tip_how_to_easily_manage_your_emails_with_mu4e/ -- https://vxlabs.com/2017/02/07/mu4e-0-9-18-e-mailing-with-emacs-now-even-better/ +* Mu4e +** Ressources +Documentation: +- [ ] Mu4e documentation: http://www.djcbsoftware.nl/code/mu/mu4e/index.html#Top +- [ ] https://github.com/djcb/mu -** Set default mail user agent to mu4e - #+begin_src emacs-lisp - (setq mail-user-agent 'mu4e-user-agent) - #+end_src +Use contexts for multiple accounts: +- [ ] https://vxlabs.com/2017/02/07/mu4e-0-9-18-e-mailing-with-emacs-now-even-better/ +- [ ] http://cachestocaches.com/2017/3/complete-guide-email-emacs-using-mu-and-/ +- [ ] https://notanumber.io/2016-10-03/better-email-with-mu4e/ + +Send math and source code: +- [ ] https://vxlabs.com/2015/01/28/sending-emails-with-math-and-source-code/ -** Default config -*** Default behavior -#+begin_src emacs-lisp - (setq mu4e-maildir "~/.mail" - mu4e-update-interval nil - mu4e-compose-signature-auto-include t - mu4e-view-show-images t - mu4e-view-show-addresses t) -#+end_src - -*** Default folders -#+begin_src emacs-lisp - (setq mu4e-sent-folder "/gmail/Sent" - mu4e-drafts-folder "/gmail/Drafts" - mu4e-trash-folder "/gmail/Trash" - mu4e-refile-folder "/gmail/Archive" - mu4e-compose-signature "Thomas Dehaeze\n" - user-mail-address "dehaeze.thomas@gmail.com") -#+end_src - -*** Default signature and email address -#+begin_src emacs-lisp - (setq mu4e-compose-signature "Thomas Dehaeze\n" - user-mail-address "dehaeze.thomas@gmail.com") -#+end_src - -*** Saving the attachment to Downloads directory -#+begin_src emacs-lisp - (setq mu4e-attachment-dir "~/Downloads") -#+end_src - -*** A list of user's e-mail addresses -#+begin_src emacs-lisp - (setq mu4e-user-mail-address-list '("dehaeze.thomas@gmail.com" "thomas.dehaeze@esrf.fr" "thomas.dehaeze@doct.ulg.ac.be")) -#+end_src - -*** Mail directory shortcuts -#+begin_src emacs-lisp - (setq mu4e-maildir-shortcuts - '( - ("/gmail/Inbox" . ?g) - ("/esrf/Inbox" . ?e) - ("/ulg/Inbox" . ?u) - )) -#+end_src - -** TODO Contexts - Email accounts -#+begin_src emacs-lisp :tangle no - (setq mu4e-contexts - `( ,(make-mu4e-context - :name "gmail" - :enter-func (lambda () (mu4e-message "Entering Gmail context")) - :leave-func (lambda () (mu4e-message "Leaving Gmail context")) - :match-func (lambda (msg) - (when msg - (string-match-p "^/gmail" (mu4e-message-field msg :maildir)))) - :vars '( - (mu4e-sent-messages-behavior . (delete)) - (user-mail-address . "dehaeze.thomas@gmail.com") - (mu4e-sent-folder . "/gmail/Sent") - (mu4e-trash-folder . "/gmail/Trash") - (mu4e-drafts-folder . "/gmail/Drafts") - (mu4e-refile-folder . "/gmail/Archive") - (mu4e-compose-signature . - (concat - "Thomas Dehaeze\n" - "\n")) - )) - ,(make-mu4e-context - :name "esrf" - :enter-func (lambda () (mu4e-message "Entering ESRF context")) - :leave-func (lambda () (mu4e-message "Leaving ESRF context")) - :match-func (lambda (msg) - (when msg - (string-match-p "^/esrf" (mu4e-message-field msg :maildir)))) - :vars '( - (user-mail-address . "thomas.dehaeze@esrf.fr") - (mu4e-sent-folder . "/esrf/Sent") - (mu4e-trash-folder . "/esrf/Trash") - (mu4e-drafts-folder . "/esrf/Drafts") - (mu4e-refile-folder . "/esrf/Archive") - (mu4e-compose-signature . - (concat - "Thomas Dehaeze\n" - "\n")) - )) - ,(make-mu4e-context - :name "ulg" - :enter-func (lambda () (mu4e-message "Entering ULG context")) - :leave-func (lambda () (mu4e-message "Leaving ULG context")) - :match-func (lambda (msg) - (when msg - (string-match-p "^/ulg" (mu4e-message-field msg :maildir)))) - :vars '( - (user-mail-address . "thomas.dehaeze@doct.ulg.ac.be") - (mu4e-sent-folder . "/ulg/Sent") - (mu4e-trash-folder . "/ulg/Trash") - (mu4e-drafts-folder . "/ulg/Drafts") - (mu4e-refile-folder . "/ulg/Archive") - (mu4e-compose-signature . - (concat - "Thomas Dehaeze\n" - "\n")) - )) - )) - (setq mu4e-context-policy 'pick-first) -#+end_src - -** Receiving emails - Mbsync -Let systemd get the mail, then pressing =U= will just run =mu= to reindex everything. -#+begin_src emacs-lisp - (setq mu4e-get-mail-command "true") -#+end_src - -Fix for mbsync found [[http://pragmaticemacs.com/emacs/fixing-duplicate-uid-errors-when-using-mbsync-and-mu4e/][here]]. -#+begin_src emacs-lisp - (setq mu4e-change-filenames-when-moving t) -#+end_src - -** Sending emails - Msmtp -#+begin_src emacs-lisp - (setq smtpmail-default-smtp-server "smtp.gmail.com" - smtpmail-smtp-server "smtp.gmail.com" - smtpmail-smtp-service 587) - - (setq message-send-mail-function 'message-send-mail-with-sendmail - sendmail-program "msmtp" - user-full-name "Thomas Dehaeze") -#+end_src - -** Bookmarks -#+begin_src emacs-lisp :tangle no - (setq mu4e-bookmarks - `(("flag:unread AND NOT flag:trashed" "Unread messages" ?u) - ("date:today..now" "Today's messages" ?t) - ("date:7d..now" "Last 7 days" ?w) - ("mime:image/*" "Messages with images" ?p) - (,(mapconcat 'identity - (mapcar - (lambda (maildir) - (concat "maildir:" (car maildir))) - mu4e-maildir-shortcuts) " OR ") - "All inboxes" ?i))) -#+end_src - -** TODO Notifications -#+begin_src emacs-lisp - (with-eval-after-load 'mu4e-alert - (mu4e-alert-set-default-style 'libnotify)) - (mu4e-alert-enable-notifications) -#+end_src - -Mode-line notifications -#+begin_src emacs-lisp - (setq mu4e-enable-mode-line t) -#+end_src - -** Use Org-Mode Tables In Emails -#+begin_src emacs-lisp - (add-hook 'message-mode-hook 'turn-on-orgtbl) - (add-hook 'message-mode-hook 'turn-on-orgstruct++) -#+end_src - -** TODO Integration with Org-Mode -Store link to message if in header view, not to header query -#+begin_src emacs-lisp - (setq org-mu4e-link-query-in-headers-mode nil) -#+end_src - -** TODO When putting something on the Trash, it will be in the archive folder on gmail -Even when totally deleting it. It will stay on gmail. How to fix that? - -** TODO Verify that sending mails with gmail account works and that there is no duplicate - -Should check this variable: mu4e-sent-messages-behavior -#+begin_src emacs-lisp :tangle no - (setq mu4e-sent-messages-behavior 'delete) -#+end_src - -And [[https://www.djcbsoftware.nl/code/mu/mu4e/Gmail-configuration.html][here]]. -If I put it to delete, it works for gmail but not for the other ones... -Check [[https://github.com/djcb/mu/issues/179][here]]. - -** TODO Cheatsheet +** Cheatsheet | Command | Usage | |---------+-----------------------| | =C-j= | Next mail | @@ -2732,6 +2544,175 @@ Check [[https://github.com/djcb/mu/issues/179][here]]. | =t= | Move to Archive | | =d= | Move to Trash | +** Helping function +This is a helper to help determine which account context I am in based on the folder in my maildir the email (eg. ~/.mail/nine27) is located in. +#+begin_src emacs-lisp + (defun mu4e-message-maildir-matches (msg rx) + (when rx + (if (listp rx) + ;; If rx is a list, try each one for a match + (or (mu4e-message-maildir-matches msg (car rx)) + (mu4e-message-maildir-matches msg (cdr rx))) + ;; Not a list, check rx + (string-match rx (mu4e-message-field msg :maildir))))) +#+end_src + +Choose account label to feed msmtp -a option based on From header in Message buffer; This function must be added to message-send-mail-hook for on-the-fly change of From address before sending message since message-send-mail-hook is processed right before sending message. +#+begin_src emacs-lisp + (defun choose-msmtp-account () + (if (message-mail-p) + (save-excursion + (let* + ((from (save-restriction + (message-narrow-to-headers) + (message-fetch-field "from"))) + (account + (cond + ((string-match "dehaeze.thomas@gmail.com" from) "gmail") + ((string-match "thomas.dehaeze@esrf.fr" from) "esrf")))) + (setq message-sendmail-extra-arguments (list '"-a" account)))))) +#+end_src + +** Basic Config +#+begin_src emacs-lisp + (use-package! mu4e + :config + (setq mail-user-agent 'mu4e-user-agent + mu4e-mu-binary "/usr/bin/mu" + mu4e-maildir "~/.mail" + mu4e-compose-format-flowed t + mu4e-compose-in-new-frame nil + mu4e-view-show-images t + mu4e-html2text-command "w3m -dump -T text/html" + mu4e-use-fancy-chars t + mu4e-headers-include-related t + mu4e-attachment-dir "~/Downloads" + message-kill-buffer-on-exit t + mu4e-compose-signature-auto-include t + mu4e-view-show-images t + mu4e-view-show-addresses t) + ) +#+end_src + +** Additional config +#+begin_src emacs-lisp + (use-package! mu4e + :config + ;; Use imagemagick, if available. + (when (fboundp 'imagemagick-register-types) + (imagemagick-register-types)) + + ;; Sometimes html email is just not readable in a text based client, this lets me open the + ;; email in my browser. + (add-to-list 'mu4e-view-actions '("View in browser" . mu4e-action-view-in-browser) t) + + ;; Spell checking ftw. + (add-hook 'mu4e-compose-mode-hook 'flyspell-mode) + + ;; Use Helm to select mailboxes + (setq mu4e-completing-read-function 'completing-read) + ;; Don't ask for a 'context' upon opening mu4e + (setq mu4e-context-policy 'pick-first) + ;; Don't ask to quit... why is this the default? + (setq mu4e-confirm-quit nil) + ) +#+end_src + +** Provide Information +#+begin_src emacs-lisp + (use-package! mu4e + :config + (setq mu4e-user-mail-address-list '("dehaeze.thomas@gmail.com" "thomas.dehaeze@esrf.fr") + mu4e-compose-signature "Thomas Dehaeze\n" + user-mail-address "dehaeze.thomas@gmail.com") + ;; Default Folders + (setq mu4e-sent-folder "/gmail/Sent" + mu4e-drafts-folder "/gmail/Drafts" + mu4e-trash-folder "/gmail/Trash" + mu4e-refile-folder "/gmail/Archive") + ) +#+end_src + +** Receiving emails using mbsync +#+begin_src emacs-lisp + (use-package! mu4e + :config + (setq mu4e-get-mail-command "~/scripts/checkmail.sh" + mu4e-update-interval nil + mu4e-change-filenames-when-moving t) ;; Fix for mbsync + ) +#+end_src + +** Contexts +#+begin_src emacs-lisp + (use-package! mu4e + :config + (setq mu4e-contexts + `( ,(make-mu4e-context + :name "gmail" + :enter-func (lambda () (mu4e-message "Switch to the gmail context")) + :match-func (lambda (msg) (when msg + (string-prefix-p "/gmail" (mu4e-message-field msg :maildir)))) + :leave-func (lambda () (mu4e-clear-caches)) + :vars '( + (user-mail-address . "dehaeze.thomas@gmail.com") + (user-full-name . "Thomas Dehaeze") + (mu4e-sent-folder . "/gmail/Sent") + (mu4e-trash-folder . "/gmail/Trash") + (mu4e-drafts-folder . "/gmail/Drafts") + (mu4e-refile-folder . "/gmail/Archive") + (mu4e-compose-signature . "Thomas Dehaeze\n") + )) + ,(make-mu4e-context + :name "esrf" + :enter-func (lambda () (mu4e-message "Switch to the esrf context")) + :match-func (lambda (msg) (when msg + (string-prefix-p "/esrf" (mu4e-message-field msg :maildir)))) + :leave-func (lambda () (mu4e-clear-caches)) + :vars '( + (user-mail-address . "thomas.dehaeze@esrf.fr") + (user-full-name . "Thomas Dehaeze") + (mu4e-sent-folder . "/esrf/Sent") + (mu4e-trash-folder . "/esrf/Trash") + (mu4e-drafts-folder . "/esrf/Drafts") + (mu4e-refile-folder . "/esrf/Archive") + (mu4e-compose-signature . "Thomas Dehaeze\n") + )) + )) + ) +#+end_src + +** Sending mails +#+begin_src emacs-lisp + (use-package! mu4e + :config + (setq message-send-mail-function 'message-send-mail-with-sendmail + sendmail-program "/usr/bin/msmtp" + user-full-name "Thomas Dehaeze") + + ;; This prevents saving the email to the Sent folder since gmail will do this for us on their end. + (setq mu4e-sent-messages-behavior 'delete) + + ;; Use the correct account context when sending mail based on the from header. + (setq message-sendmail-envelope-from 'header) + (add-hook 'message-send-mail-hook 'choose-msmtp-account) + ) +#+end_src + +** Bookmarks +#+begin_src emacs-lisp + (use-package! mu4e + :config + (setq mu4e-bookmarks `(,(make-mu4e-bookmark + :name "All Inboxes" + :query "maildir:/gmail/Inbox OR maildir:/esrf/Inbox" + :key ?i) + ("flag:unread" "Unread messages" ?u) + ("date:today..now" "Today's messages" ?t) + ("date:7d..now" "Last 7 days" ?w))) + ) +#+end_src + * PDF-Tools #+begin_src emacs-lisp (use-package! pdf-tools @@ -2894,7 +2875,7 @@ they are implemented. sh ; she sells {ba,z,fi}sh shells on the C xor :email - ;;(mu4e +gmail) + (mu4e +gmail) :app calendar