#+TITLE: Email Configuration * Initial Setup Before installing any packages with emacs, there is some initial setup that needs to be done. ** Exporting TLS Certificates After installing the ~proton-mail-bridge~, you will need to export the certificates by going to Settings > Advanced settings > Export TLS certificates. From here you should place this at the path ~~/.config/protonmail/bridge/~. ** Mu4e Installation In this section, I'm setting up ~mu4e~ to give emacs the capability to send emails using my gmail account. To start, you need to install the ~mu4e~ package outside of Emacs. #+begin_src bash yay -S mu #+end_src After installing the ~mu~ client, I also need to run a initial index using the following command: #+begin_src bash mkdir ~/.mail && mbsync -a mu init --maildir=~/.mail --my-address=jadenprovost@gmail.com mu index #+end_src * Custom Functions #+begin_src emacs-lisp (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)) (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 :from from-filters) (mu4e-message-contact-field-matches msg :bcc bcc-filters)) (setq folder filter-folder)))) (if folder folder "/Archive")))) #+end_src * Mu4e This section contains the ~mu4e~ emacs specific configuration. #+begin_src emacs-lisp (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/Newsletters" :key ?n)))) #+end_src Adding some configuration to correct ~mu4e~'s default values. #+begin_src emacs-lisp (setq user-full-name "Jaden Provost Maxwell-Comfort") (setq user-mail-address "jadenprovost@proton.me") #+end_src * 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 [[https://www.djcbsoftware.nl/code/mu/mu4e/Gmail-configuration.html][here]]. #+begin_src emacs-lisp (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) #+end_src When running this however, you need to authenticate by creating an ~~/.authinfo~ file. This file is formatted as follows: #+begin_src authinfo # For gmail machine smtp.gmail.com port 465 login "" password "" # For Proton Mail # Copy the remaining information from the proton-mail-bridge for both IMAP and SMTP machine 127.0.0.1 port login "" password "" machine 127.0.0.1 port login "" password "" #+end_src Similarly to the password configured above for the IMAP server, you can also pass an ~authinfo.gpg~ file for some added security. If you are using proton mail, make sure this matches the path set in your ~.mbsyncrc~ file.