Files
dot-emacs/.emacs.d/email.org
2025-08-05 19:11:26 -07:00

4.3 KiB

Custom Functions

(defconst jm/email-filters-path "~/Nextcloud/filters.json")

(defun jm/any-string-match-p (needles haystack)
  (when (listp needles)
    (let (result)
      (dolist (needle needles result)
        (setq result (or result (s-matches-p needle haystack)))))))

(defun jm/load-email-filters (msg)
  (let ((filters (append (json-read-file jm/email-filters-path) nil))
        (trash-flag (member
                     (car (mu4e-string-to-flags "T"))
                     (mu4e-message-field msg :flags)))
        folder)
    (if trash-flag
        "/Trash"
      (dolist (filter filters)
        (let ((subject (mu4e-message-field msg :subject))
              (filter-folder (cdr (assoc-string "folder" filter)))
              (subject-filters (append (cdr (assoc-string "subject" filter)) nil))
              (to-filters (append (cdr (assoc-string "to-contact" filter)) nil))
              (from-filters (append (cdr (assoc-string "from-contact" filter)) nil))
              (bcc-filters (append (cdr (assoc-string "bcc-contact" filter)) nil)))
          (when (or (jm/any-string-match-p subject-filters subject)
                    (mu4e-message-contact-field-matches msg :to to-filters)
                    (mu4e-message-contact-field-matches msg :from from-filters)
                    (mu4e-message-contact-field-matches msg :bcc bcc-filters))
            (setq folder filter-folder))))
      (if folder folder "/Archive"))))

Mu4e

This section contains the mu4e emacs specific configuration.

(use-package mu4e
  :ensure nil
  :bind ("C-x m" . mu4e)
  :config
  (add-hook 'mu4e-compose-mode-hook (lambda () (use-hard-newlines -1)))

  (setq mu4e-mu-binary (executable-find "mu")
        mu4e-change-filenames-when-moving t ; Avoids syncing issues.
        mu4e-search-results-limit 2000 ; Extend header view max message count.
        mu4e-compose-format-flowed t) ; Disable hard line wrapping

  ;; Fix message citation style for gmail.
  (setq message-cite-style message-cite-style-gmail
        message-citation-line-format "On %a, %b %d, %Y at %H:%M %p %f wrote:"
        message-citation-line-function 'message-insert-formatted-citation-line)

  ;; Refresh mail every X seconds. Set to 5 minutes currently
  (setq mu4e-update-interval (* 5 60)
        mu4e-get-mail-command "mbsync -a"
        mu4e-maildir "~/.mail")

  ;; Config mu4e folders
  (setq mu4e-drafts-folder "/Drafts"
        mu4e-sent-folder "/Sent"
        mu4e-trash-folder "/Trash"
        mu4e-refile-folder #'jm/load-email-filters)

  ;; Config mu4e bookmarks
  (setq mu4e-bookmarks
        '((:name "Filtered unread messages" :query "flag:unread AND (maildir:/Archive OR maildir:/INBOX) AND NOT flag:trashed" :key ?u)
          (:name "All unread messages" :query "flag:unread" :key ?U)
          (:name "Today's messages" :query "date:today..now" :key ?t)
          (:name "Last 7 days" :query "date:7d..now" :hide-unread t :key ?w)
          (:name "Flagged messages" :query "flag:flagged" :key ?f)))

  (setq mu4e-maildir-shortcuts
        ;; Proton folders
        '((:maildir "/INBOX" :key ?i)
          (:maildir "/Archive" :key ?a)
          (:maildir "/Drafts" :key ?d)
          (:maildir "/Sent" :key ?s)
          (:maildir "/Spam" :key ?S)
          (:maildir "/Trash" :key ?t)

          ;; My folders
          (:maildir "/Folders/Finance" :key ?f)
          (:maildir "/Folders/Packages" :key ?p)
          (:maildir "/Folders/Work" :key ?w)
          (:maildir "/Folders/Club" :key ?c)
          (:maildir "/Folders/UCSC" :key ?u)
          (:maildir "/Folders/Housing" :key ?h)
          (:maildir "/Folders/Newsletters" :key ?n))))

Adding some configuration to correct mu4e's default values.

(setq user-full-name "Jaden Provost Maxwell-Comfort")
(setq user-mail-address "jadenprovost@proton.me")

SMTP

In order to send mail with mu4e, you must also configure an SMTP client. Based on the mu4e wiki, I was able to shamelessly steal some of the config for the gmail configuration found here.

(use-package smtpmail
  :after mu4e
  :config
  (setq smtpmail-stream-type 'starttls
        smtpmail-smtp-server "127.0.0.1"
        smtpmail-smtp-service 1025))

(setq send-mail-function 'smtpmail-send-it)