;;; +mail.el -*- lexical-binding: t; -*- (setq +mu4e-personal-addresses '("me@maxschlueter.com" "maxsc@fsfe.org")) (set-email-account! "mailbox.org" '((mu4e-sent-folder . "/mailbox.org/Sent") (mu4e-drafts-folder . "/mailbox.org/Drafts") (mu4e-trash-folder . "/mailbox.org/Trash") (mu4e-refile-folder . "/mailbox.org/Archive") (smtpmail-smtp-user . "me@maxschlueter.com") (mu4e-maildir-shortcuts (:maildir "/mailbox.org/Inbox" :key ?i) (:maildir "/mailbox.org/Sent" :key ?s) (:maildir "/mailbox.org/Drafts" :key ?d) (:maildir "/mailbox.org/Trash" :key ?t) (:maildir "/mailbox.org/Archive" :key ?a)) (mu4e-compose-signature . nil)) 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) ;; fix https://github.com/hlissner/doom-emacs/issues/3294 (setq mu4e-attachment-dir "~/Downloads") ;; Sign sent email automatically ;; (add-hook 'message-send-hook 'mml-secure-message-sign-smime) (setq mml-secure-openpgp-encrypt-to-self t) ;; Render buttons to verify&decrypt messages (setq mm-decrypt-option 'always mm-verify-option 'always gnus-buttonized-mime-types '("multipart/encrypted" "multipart/signed")) (defun max/mu4e-view-import-attachment-calendar (msg attnum) (let* ((att (mu4e~view-get-attach msg attnum)) (index (plist-get att :index)) (docid (mu4e-message-field msg :docid)) (mtype (plist-get att :mime-type)) (fname (plist-get att :name)) (fpath (concat (mu4e~get-attachment-dir fname mtype) "/" fname))) (if (string= "text/calendar" mtype) (progn (mu4e~proc-extract 'save docid index mu4e-decryption-policy fpath) (let ((org-caldav-inbox (max/org-caldav-get-inbox))) (org-caldav-import-ics-to-org fpath))) (mu4e-error "Invalid mime-type for a calendar event: `%s'" mtype)))) ;; XXX (add-to-list 'mu4e-view-attachment-actions '("cImport in calendar" . max/mu4e-view-import-attachment-calendar) t) (add-to-list 'mu4e-bookmarks (make-mu4e-bookmark :name "All Inboxes" :query "maildir:/mailbox.org/Inbox" :key ?i))) ;; 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) (require 'mu4e) (+workspace-switch +mu4e-workspace-name t) (mu4e~start (lambda () (mu4e-headers-search (mu4e-get-bookmark-query ?i))))) (map! "" #'max/=mu4e) (map! :after mu4e :map mu4e-headers-mode-map :vne "l" #'max/capture-msg-to-agenda) (setq +org-capture-emails-file (expand-file-name "newgtd/actionable.org" org-directory)) ;; Modified version of `+mu4e/capture-msg-to-agenda'. (defun max/capture-msg-to-agenda (arg) "Refile a message and add a entry in `+org-capture-emails-file'." (interactive "p") (let ((sec "^* Actions") (msg (mu4e-message-at-point))) (when msg ;; put the message in the agenda (with-current-buffer (find-file-noselect (expand-file-name +org-capture-emails-file org-directory)) (save-excursion ;; find header section (goto-char (point-min)) (when (re-search-forward sec nil t) (let (org-M-RET-may-split-line (lev (org-outline-level)) (folded-p (invisible-p (point-at-eol))) (from (plist-get msg :from))) ;; (when (consp (car from)) ; Occurs when using mu4e 1.8+. ;; (setq from (car from))) (unless (keywordp (car from)) ; If using mu4e <= 1.6. (setq from (list :name (or (caar from) (cdar from))))) ;; place the subheader (when folded-p (show-branches)) ; unfold if necessary (org-end-of-meta-data) ; skip property drawer (org-insert-heading) ; insert a todo heading (when (= (org-outline-level) lev) ; demote if necessary (org-do-demote)) ;; insert message and add deadline (insert (concat "NEXT Reply to " "[[mu4e:msgid:" (plist-get msg :message-id) "][" (truncate-string-to-width (plist-get from :name) 25 nil nil t) " - " (truncate-string-to-width (plist-get msg :subject) 40 nil nil t) "]] :email:\n")) (org-time-stamp-inactive '(16)) (org-update-parent-todo-statistics) ;; refold as necessary (if folded-p (progn (org-up-heading-safe) (hide-subtree)) (hide-entry)))))) ;; refile the message and update ;; (cond ((eq major-mode 'mu4e-view-mode) ;; (mu4e-view-mark-for-refile)) ;; ((eq major-mode 'mu4e-headers-mode) ;; (mu4e-headers-mark-for-refile))) (message "Added \"%s\" to the agenda" (truncate-string-to-width (plist-get msg :subject) 40 nil nil t))))) (use-package! jl-encrypt :config (setq mml-secure-insert-signature 'encrypted)) (after! mu4e-alert (when IS-MAC (mu4e-alert-set-default-style 'notifier)))