emacs/config/email.org

13 KiB

Email Config

Email

  (setq sendmail-program (executable-find "msmtp")
        send-mail-function #'sendmail-send-it
        message-send-mail-function #'message-send-mail-with-sendmail
        message-sendmail-f-is-evil t
        message-sendmail-extra-arguments '("--read-envelope-from")
        message-auto-save-directory nil
        message-kill-buffer-on-exit t
        mail-user-agent 'mu4e-user-agent)

  (set-variable read-mail-command 'mu4e)

  (use-package mu4e
    :bind
    (("C-c m" . mu4e)
     :map mu4e-view-mode-map
     ("o n" . mu4e-org-store-and-capture))
    :custom
    (mu4e-completing-read-function #'completing-read-default)
    (mu4e-split-view 'horizontal)
    (mu4e-attachment-dir "~/Downloads")
    (mu4e-get-mail-command "mbsync -a")
    (mu4e-update-interval (* 5 60)) ; Every 5 minutes
    (mu4e-headers-auto-update nil)
    (mu4e-sent-messages-behavior 'sent)
    (mu4e-change-filenames-when-moving t)
    (mu4e-context-policy 'pick-first)
    (mu4e-compose-context-policy 'ask)
    (mu4e-search-full nil)
    (mu4e-search-include-related t)
    (mu4e-search-threads t)
    (mu4e-search-skip-duplicates t)
    (mu4e-maildir-shortcuts '((:maildir "/Proton/Inbox/" :key ?p)
                              (:maildir "/iCloud/Inbox/" :key ?i)
                              (:maildir "/Outlook/Inbox/" :key ?w)))
    (mu4e-bookmarks '((:name "Inbox" :query "maildir:/inbox/" :key ?i :favorite t)
                      (:name "Today" :query "date:today..now AND maildir:/inbox/" :key ?t)
                      (:name "Flagged" :query "flag:flagged AND NOT flag:trashed AND NOT maildir:/spam/ AND NOT maildir:/junk/" :key ?f)
                      (:name "Unread" :query "flag:unread AND NOT flag:trashed AND NOT maildir:/archive/ AND NOT maildir:/spam/ AND NOT maildir:/junk/" :key ?u :hide-unread t)
                      (:name "Spam" :query "maildir:/spam/ OR maildir:/junk/" :key ?s :hide-unread t)))
    (mu4e-headers-visible-rows 3)
    (mu4e-headers-fields
     '((:human-date . 8)
       (:from . 24)
       (:subject)))
    (mu4e-headers-visible-flags
     '(draft
       flagged
       unread
       passed
       replied
       trashed
       attach
       calendar
       encrypted
       signed
       list
       personal))
    :config
    (setq mu4e-use-fancy-chars t)

    )

Account contexts

  (with-eval-after-load 'mu4e
    (require 'mu4e-context)
    (setq mu4e-contexts
          (list
           (make-mu4e-context
            :name "Xenia"
            :vars '(
                    (user-mail-address . "evie@xenia.me.uk")
                    (mu4e-sent-folder . "/Proton/Sent")
                    (mu4e-drafts-folder . "/Proton/Drafts")
                    (mu4e-trash-folder . "/Proton/Trash")
                    (mu4e-refile-folder . "/Proton/Archive")
                    ))
           (make-mu4e-context
            :name "Proton"
            :match-func (lambda (msg) (when msg (string-prefix-p "/Proton" (mu4e-message-field msg :maildir))))
            :vars '(
                    (user-mail-address . "e.litherlandsmith@proton.me")
                    (mu4e-sent-folder . "/Proton/Sent")
                    (mu4e-drafts-folder . "/Proton/Drafts")
                    (mu4e-trash-folder . "/Proton/Trash")
                    (mu4e-refile-folder . "/Proton/Archive")
                    ))
           (make-mu4e-context
            :name "iCloud"
            :match-func (lambda (msg) (when msg (string-prefix-p "/iCloud" (mu4e-message-field msg :maildir))))
            :vars '(
                    (user-mail-address . "e.litherlandsmith@icloud.com")
                    (mu4e-sent-folder . "/iCloud/Sent Messages")
                    (mu4e-drafts-folder . "/iCloud/Drafts")
                    (mu4e-trash-folder . "/iCloud/Deleted Messages")
                    (mu4e-refile-folder . "/iCloud/Archive")
                    ))
           (make-mu4e-context
            :name "Work"
            :match-func (lambda (msg) (when msg (string-prefix-p "/Outlook" (mu4e-message-field msg :maildir))))
            :vars '(
                    (user-mail-address . "evie.litherland-smith@ukaea.uk")
                    (mu4e-sent-folder . "/Outlook/Sent")
                    (mu4e-drafts-folder . "/Outlook/Drafts")
                    (mu4e-trash-folder . "/Outlook/Trash")
                    (mu4e-refile-folder . "/Outlook/Archive")
                    (message-signature . (concat "Evelyn Litherland-Smith (she/they)\n"
                                                 "Spectroscopy Diagnostic Physicist\n"
                                                 "Plasma Science and Fusion Operations\n"
                                                 "UK Atomic Energy Authority"))
                    )))))

Modeline configuration

  (with-eval-after-load 'mu4e
    (require 'mu4e-modeline)
    (setq mu4e-modeline-all-read '("R:" . " ")
          mu4e-modeline-all-clear '("C:" . " ")
          mu4e-modeline-new-items '("N:" . " ")
          mu4e-modeline-unread-items '("U:" . " "))
    (mu4e-modeline-mode +1))

Headers mode glyphs

  (with-eval-after-load 'mu4e
    (setq mu4e-search-full-label '("F" . " ")
          mu4e-search-hide-label '("H" . " ")
          mu4e-search-related-label '("R" . " ")
          mu4e-search-skip-duplicates-label '("D" . " ")
          mu4e-search-threaded-label'("T" . " ")
          mu4e-headers-draft-mark '("D" . " ")
          mu4e-headers-flagged-mark '("F" . " ")
          mu4e-headers-unread-mark '("u" . " ")
          mu4e-headers-passed-mark '("P" . " ")
          mu4e-headers-replied-mark '("R" . " ")
          mu4e-headers-trashed-mark '("T" . " ")
          mu4e-headers-attach-mark '("a" . " ")
          mu4e-headers-calendar-mark '("c" . " ")
          mu4e-headers-encrypted-mark '("x" . " ")
          mu4e-headers-signed-mark '("s" . " ")
          mu4e-headers-list-mark '("l" . " ")
          mu4e-headers-personal-mark '("p" . " ")
          mu4e-headers-seen-mark '("S" . " ")
          mu4e-headers-new-mark '("N" . " ")
          mu4e-headers-from-or-to-prefix '("   " . "To ")
          mu4e-headers-thread-root-prefix          '("* " . "* ")
          mu4e-headers-thread-duplicate-prefix     '("= " . "= ")
          mu4e-headers-thread-blank-prefix         '("  " . "  ")
          mu4e-headers-thread-single-orphan-prefix '("─>" . "─>")
          mu4e-headers-thread-orphan-prefix        '("┬>" . "┬>")
          mu4e-headers-thread-connection-prefix    '("│ " . "│ ")
          mu4e-headers-thread-first-child-prefix   '("├>" . "├>")
          mu4e-headers-thread-child-prefix         '("├>" . "├>")
          mu4e-headers-thread-last-child-prefix    '("└>" . "╰>")))

Custom marks

  (with-eval-after-load 'mu4e
    (setq mu4e-marks '((refile :char
                               ("r" . " ")
                               :prompt "refile" :dyn-target
                               (lambda
                                 (target msg)
                                 (mu4e-get-refile-folder msg))
                               :action
                               (lambda
                                 (docid msg target)
                                 (mu4e--server-move docid
                                                    (mu4e--mark-check-target target)
                                                    "-N")))
                       (delete :char
                               ("D" . " ")
                               :prompt "Delete" :show-target
                               (lambda
                                 (target)
                                 "delete")
                               :action
                               (lambda
                                 (docid msg target)
                                 (mu4e--server-remove docid)))
                       (flag :char
                             ("+" . " ")
                             :prompt "+flag" :show-target
                             (lambda
                               (target)
                               "flag")
                             :action
                             (lambda
                               (docid msg target)
                               (mu4e--server-move docid nil "+F-u-N")))
                       (move :char
                             ("m" . " ")
                             :prompt "move" :ask-target mu4e--mark-get-move-target :action
                             (lambda
                               (docid msg target)
                               (mu4e--server-move docid
                                                  (mu4e--mark-check-target target)
                                                  "-N")))
                       (read :char
                             ("!" . " ")
                             :prompt "!read" :show-target
                             (lambda
                               (target)
                               "read")
                             :action
                             (lambda
                               (docid msg target)
                               (mu4e--server-move docid nil "+S-u-N")))
                       (trash :char
                              ("d" . " ")
                              :prompt "dtrash" :dyn-target
                              (lambda
                                (target msg)
                                (mu4e-get-trash-folder msg))
                              :action
                              (lambda
                                (docid msg target)
                                (mu4e--server-move docid
                                                   (mu4e--mark-check-target target)
                                                   "+T-N")))
                       (unflag :char
                               ("-" . " ")
                               :prompt "-unflag" :show-target
                               (lambda
                                 (target)
                                 "unflag")
                               :action
                               (lambda
                                 (docid msg target)
                                 (mu4e--server-move docid nil "-F-N")))
                       (untrash :char
                                ("=" . " ")
                                :prompt "=untrash" :show-target
                                (lambda
                                  (target)
                                  "untrash")
                                :action
                                (lambda
                                  (docid msg target)
                                  (mu4e--server-move docid nil "-T")))
                       (unread :char
                               ("?" . " ")
                               :prompt "?unread" :show-target
                               (lambda
                                 (target)
                                 "unread")
                               :action
                               (lambda
                                 (docid msg target)
                                 (mu4e--server-move docid nil "-S+u-N")))
                       (unmark :char " " :prompt "unmark" :action
                               (mu4e-error "No action for unmarking"))
                       (action :char
                               ("a" . " ")
                               :prompt "action" :ask-target
                               (lambda nil
                                 (mu4e-read-option "Action: " mu4e-headers-actions))
                               :action
                               (lambda
                                 (docid msg actionfunc)
                                 (save-excursion
                                   (when
                                       (mu4e~headers-goto-docid docid)
                                     (mu4e-headers-action actionfunc)))))
                       (something :char
                                  ("*" . " ")
                                  :prompt "*something" :action
                                  (mu4e-error "No action for deferred mark")))))

Desktop notifications

  (with-eval-after-load 'mu4e
    (require 'mu4e-notification)
    (setq mu4e-notification-support t))

Org-mode integration

  (with-eval-after-load 'mu4e
    (require 'mu4e-org))

iCalendar integration

  (with-eval-after-load 'mu4e
    (require 'mu4e-icalendar)
    (mu4e-icalendar-setup)
    (setq mu4e-icalendar-trash-after-reply nil)
    (require 'gnus-icalendar)
    (setq gnus-icalendar-org-capture-file (expand-file-name "calendar.org" org-directory))
    (setq gnus-icalendar-org-capture-headline '("Inbox"))
    (gnus-icalendar-org-setup))