diff --git a/email.el b/email.el index b22ae75..a7af2df 100644 --- a/email.el +++ b/email.el @@ -1,127 +1,130 @@ ;;; email.el -*- lexical-binding: t; -*- -(after! mu4e - ;; Recommended msmtp config from doom module documentation - (setq sendmail-program (executable-find "msmtp") - send-mail-function #'smtpmail-send-it - message-sendmail-f-is-evil t - message-sendmail-extra-arguments '("--read-envelope-from") - message-send-mail-function #'message-send-mail-with-sendmail) +;; Start mu4e in the background +;; https://github.com/djcb/mu/issues/2282 +(require 'mu4e) +(mu4e 'background) - ;; `set-email-account!' doesn't accept a custom match-func - (setq mu4e-contexts - (list - ;; (make-mu4e-context - ;; :name "upcycling" - ;; :enter-func - ;; (lambda () (mu4e-message "Switched to upcycling")) - ;; :leave-func - ;; (lambda () (progn (setq +mu4e-personal-addresses nil) - ;; (mu4e-clear-caches))) - ;; :match-func - ;; (lambda (msg) - ;; (when msg - ;; (mu4e-message-contact-field-matches msg - ;; :to "upcycling@fsfe.org"))) - ;; :vars '((user-mail-address . "upcycling@fsfe.org") - ;; (user-full-name . "FSFE Team Upcycling Android"))) - (make-mu4e-context - :name "mailbox" - :enter-func - (lambda () (mu4e-message "Switched to mailbox")) - :leave-func - (lambda () (progn (setq +mu4e-personal-addresses nil) - (mu4e-clear-caches))) - :match-func - (lambda (msg) - (when msg - (string-prefix-p "/mailbox" - (mu4e-message-field msg :maildir) t))) - :vars '((user-mail-address . "me@maxschlueter.com") - (user-full-name . "Max Schlueter") - (+mu4e-personal-addresses ("me@maxschlueter.com") - ("maxsc@fsfe.org")) - )))) +;; Recommended msmtp config from doom module documentation +(setq sendmail-program (executable-find "msmtp") + send-mail-function #'smtpmail-send-it + message-sendmail-f-is-evil t + message-sendmail-extra-arguments '("--read-envelope-from") + message-send-mail-function #'message-send-mail-with-sendmail) - (setq mu4e-attachment-dir "~/Downloads" - mu4e-sent-folder "/mailbox/Sent" - mu4e-drafts-folder "/mailbox/Drafts" - mu4e-trash-folder "/mailbox/Trash" - mu4e-refile-folder "/mailbox/Archive" - ;; TODO create context-aware variable - mu4e-spam-folder "/mailbox/Junk" - mu4e-compose-signature nil - mu4e-maildir-shortcuts (list (list :maildir "/mailbox/Inbox" - :key ?i) - (list :maildir "/mailbox/Sent" - :key ?s) - (list :maildir "/mailbox/Drafts" - :key ?d) - (list :maildir "/mailbox/Trash" - :key ?t) - (list :maildir "/mailbox/Archive" - :key ?a)) - mu4e-bookmarks (list (list :name "All Inboxes" - :query "maildir:/mailbox/Inbox" - :key ?i) - (list :name "Unread messages" - :query "flag:unread AND NOT flag:trashed" - :key ?u) - (list :name "Today's messages" - :query "date:today..now" - :key ?t) - (list :name "Last 7 days" - :query "date:7d..now" - :hide-unread t - :key ?t))) +;; `set-email-account!' doesn't accept a custom match-func +(setq mu4e-contexts + (list + ;; (make-mu4e-context + ;; :name "upcycling" + ;; :enter-func + ;; (lambda () (mu4e-message "Switched to upcycling")) + ;; :leave-func + ;; (lambda () (progn (setq +mu4e-personal-addresses nil) + ;; (mu4e-clear-caches))) + ;; :match-func + ;; (lambda (msg) + ;; (when msg + ;; (mu4e-message-contact-field-matches msg + ;; :to "upcycling@fsfe.org"))) + ;; :vars '((user-mail-address . "upcycling@fsfe.org") + ;; (user-full-name . "FSFE Team Upcycling Android"))) + (make-mu4e-context + :name "mailbox" + :enter-func + (lambda () (mu4e-message "Switched to mailbox")) + :leave-func + (lambda () (progn (setq +mu4e-personal-addresses nil) + (mu4e-clear-caches))) + :match-func + (lambda (msg) + (when msg + (string-prefix-p "/mailbox" + (mu4e-message-field msg :maildir) t))) + :vars '((user-mail-address . "me@maxschlueter.com") + (user-full-name . "Max Schlueter") + (+mu4e-personal-addresses ("me@maxschlueter.com") + ("maxsc@fsfe.org")) + )))) - ;; Render buttons to verify&decrypt messages - (setq mm-decrypt-option 'always - mm-verify-option 'always - gnus-buttonized-mime-types '("multipart/encrypted" "multipart/signed") - mml-secure-openpgp-encrypt-to-self t) +(setq mu4e-attachment-dir "~/Downloads" + mu4e-sent-folder "/mailbox/Sent" + mu4e-drafts-folder "/mailbox/Drafts" + mu4e-trash-folder "/mailbox/Trash" + mu4e-refile-folder "/mailbox/Archive" + ;; TODO create context-aware variable + mu4e-spam-folder "/mailbox/Junk" + mu4e-compose-signature nil + mu4e-maildir-shortcuts (list (list :maildir "/mailbox/Inbox" + :key ?i) + (list :maildir "/mailbox/Sent" + :key ?s) + (list :maildir "/mailbox/Drafts" + :key ?d) + (list :maildir "/mailbox/Trash" + :key ?t) + (list :maildir "/mailbox/Archive" + :key ?a)) + mu4e-bookmarks (list (list :name "All Inboxes" + :query "maildir:/mailbox/Inbox" + :key ?i) + (list :name "Unread messages" + :query "flag:unread AND NOT flag:trashed" + :key ?u) + (list :name "Today's messages" + :query "date:today..now" + :key ?t) + (list :name "Last 7 days" + :query "date:7d..now" + :hide-unread t + :key ?t))) - ;; Move message to the trash folder but do not set the trash flag - ;; https://github.com/djcb/mu/issues/1136#issuecomment-1066303788 - (setf (alist-get 'trash mu4e-marks) - (list :char '("d" . "▼") - :prompt "dtrash" - :dyn-target (lambda (target msg) - (mu4e-get-trash-folder msg)) - :action (lambda (docid msg target) - ;; Here's the main difference to the regular trash mark, - ;; no +T before -N so the message is not marked as - ;; IMAP-deleted: - (mu4e--server-move docid (mu4e--mark-check-target target) "+S-u-N")))) +;; Render buttons to verify&decrypt messages +(setq mm-decrypt-option 'always + mm-verify-option 'always + gnus-buttonized-mime-types '("multipart/encrypted" "multipart/signed") + mml-secure-openpgp-encrypt-to-self t) - (add-to-list 'mu4e-marks - '(spam - :char "S" - :prompt "Spam" - :shot-target (lambda (target) mu4e-spam-folder) - :action (lambda (docid msg target) - (mu4e--server-move docid mu4e-spam-folder "+S-u-N")))) +;; Move message to the trash folder but do not set the trash flag +;; https://github.com/djcb/mu/issues/1136#issuecomment-1066303788 +(setf (alist-get 'trash mu4e-marks) +(list :char '("d" . "▼") + :prompt "dtrash" + :dyn-target (lambda (target msg) + (mu4e-get-trash-folder msg)) + :action (lambda (docid msg target) + ;; Here's the main difference to the regular trash mark, + ;; no +T before -N so the message is not marked as + ;; IMAP-deleted: + (mu4e--server-move docid (mu4e--mark-check-target target) "+S-u-N")))) - (defun my:mu4e-mark-for-spam() - "Mark as read and move to spam." - (interactive) - (mu4e-headers-mark-and-next 'spam)) +(add-to-list 'mu4e-marks + '(spam + :char "S" + :prompt "Spam" + :shot-target (lambda (target) mu4e-spam-folder) + :action (lambda (docid msg target) + (mu4e--server-move docid mu4e-spam-folder "+S-u-N")))) - (map! :map mu4e-headers-mode-map :n "S" #'my:mu4e-mark-for-spam) +(defun my:mu4e-mark-for-spam() + "Mark as read and move to spam." + (interactive) + (mu4e-headers-mark-and-next 'spam)) - (add-to-list 'mu4e-view-mime-part-actions - '(:name "calendar" - :handler (lambda (file) - (shell-command - (format "khal import --batch %s" file)) - (khalel-import-events)) - :receives temp)) +(map! :map mu4e-headers-mode-map :n "S" #'my:mu4e-mark-for-spam) - ;; Sign sent email automatically - ;; (add-hook 'message-send-hook 'mml-secure-message-sign-smime) +(add-to-list 'mu4e-view-mime-part-actions + '(:name "calendar" + :handler (lambda (file) + (shell-command + (format "khal import --batch %s" file)) + (khalel-import-events)) + :receives temp)) - (require 'khalel-icalendar) - ) +;; Sign sent email automatically +;; (add-hook 'message-send-hook 'mml-secure-message-sign-smime) + +(require 'khalel-icalendar) ;; (defun max/mu4e-view-import-attachment-calendar (msg attnum) ;; (let* ((att (mu4e~view-get-attach msg attnum)) @@ -139,9 +142,6 @@ ;; (add-to-list 'mu4e-view-attachment-actions ;; '("cImport in calendar" . max/mu4e-view-import-attachment-calendar) t) -;; Autoload this command so that the mbsync service can update the index -(autoload #'mu4e-update-index "mu4e" nil t) - (defun max/=mu4e () "Start email client and view all inboxes." (interactive)