mu4e: Factor address fetching into `message-fetch-addresses'

master
Pierre Neidhardt 2018-08-10 16:53:51 +02:00
parent ca41fc44db
commit 254e9f7095
1 changed files with 34 additions and 19 deletions

View File

@ -143,21 +143,43 @@ This function is suitable for `mu4e-compose-mode-hook'."
(mml-secure-message-sign-pgpmime)))))
(add-hook 'mu4e-compose-mode-hook 'ambrevar/mu4e-compose-maybe-signed-and-crypted)
(defun ambrevar/message-fetch-addresses ()
"Return a list of (NAME EMAIL) from the message header.
The \"From\", \"To\", \"Cc\" and \"Bcc\" fields are looked up.
Addresses in `mu4e-user-mail-address-list' are filtered out.
Duplicates are removed."
(require 'cl)
(cl-delete-duplicates
(seq-remove
(lambda (contact) (member (cadr contact) mu4e-user-mail-address-list))
(apply 'append
(if (eq major-mode 'mu4e-compose-mode)
(save-restriction
(message-narrow-to-headers)
(mapcar
(lambda (addr) (mail-extract-address-components (message-fetch-field addr) t))
(seq-filter 'message-fetch-field
'("From" "To" "Cc" "Bcc"))))
(unless (buffer-live-p (mu4e-get-headers-buffer))
(mu4e-error "no headers buffer connected"))
(delq nil
(mapcar (lambda (field)
;; `mu4e-message-field' returns a list of (NAME . EMAIL).
(mapcar (lambda (addr) (list (car addr) (cdr addr)))
(mu4e-message-field
(with-current-buffer (mu4e-get-headers-buffer)
;; When loading messages, point might
;; not be over a message yet.
(mu4e-message-at-point))
field)))
'(:from :to :cc :bcc))))))))
(defun ambrevar/message-send-maybe-crypted ()
"Crypt message if all recipients have a trusted key.
This will prompt the user if only some recipients have a suitable public key.
Suitable for `message-send-hook'."
(let (recipients valid-addresses untrusted-recipients)
(setq recipients
(save-restriction
(message-narrow-to-headers)
(apply 'append
(mapcar
(lambda (header)
(mapcar 'cadr (mail-extract-address-components
(message-fetch-field header) t)))
(seq-filter 'message-fetch-field
'("To" "Cc" "Bcc"))))))
(let ((recipients (mapcar 'cadr (ambrevar/message-fetch-addresses)))
valid-addresses untrusted-recipients)
(dolist (key (epg-list-keys (epg-make-context epa-protocol)))
(dolist (user-id (epg-key-user-id-list key))
(when (memq (epg-user-id-validity user-id) '(marginal full ultimate))
@ -288,15 +310,8 @@ This function could be useful in `mu4e-compose-mode-hook'."
"Return a list of (NAME . ADDRESS).
If point has an `email' property, move it to the front of the list.
Addresses in `mu4e-user-mail-address-list' are skipped."
(let (result
(let ((result (ambrevar/message-fetch-addresses))
(message org-store-link-plist))
(setq result (seq-remove
(lambda (contact) (member (cadr contact) mu4e-user-mail-address-list))
(apply 'append
(mapcar (lambda (addr) (mail-extract-address-components addr t))
(delq nil
(mapcar (lambda (field) (mu4e-message-field message field))
'(:from :to :cc :bcc)))))))
;; Move contact at point to front.
(let ((email-at-point (get-text-property (point) 'email))
(contacts result))