Mu4e: More robust Gmail account checking
Emails sent to an @gmail.com account may have been forwarded to a non-gmail mailbox. Thus the current approach is over-eager. Only checking @gmail on send, and then matching a user's maildir (not email) with received messages is a more robust approach. To accommodate this we switch `+mu4e-gmail-addresses' out for `+mu4e-gmail-accounts'. Along the way `mu4e-index-cleanup' and `mu4e-index-lazy-check' customisations were moved into the readme as a recommendation for Gmail-only users, to avoid causing adverse effects for users who have non-gmail accounts too.
This commit is contained in:
parent
611e532d38
commit
2307ae5644
2 changed files with 39 additions and 32 deletions
|
@ -173,10 +173,30 @@ Then configure Emacs to use your email address:
|
||||||
With the =+gmail= flag, integrations are applied which account for the different
|
With the =+gmail= flag, integrations are applied which account for the different
|
||||||
behaviour of Gmail.
|
behaviour of Gmail.
|
||||||
|
|
||||||
The integrations are applied when using addresses which contain =@gmail.com= or
|
The integrations are applied to addresses with /both/ "@gmail.com" in the
|
||||||
have =gmail= in the maildir name. You can use ~+mu4e-gmail-addresses~ when you want
|
account address and "gmail" in the account maildir, as well as accounts listed
|
||||||
an address to be treated as such but it meets neither conditions (e.g. with
|
in ~+mu4e-gmail-accounts~. Any domain can be specified, so G Suite accounts can
|
||||||
Gsuite).
|
benefit from the integrations:
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
;; if "gmail" is missing from the address or maildir, the account must be listed here
|
||||||
|
(setq +mu4e-gmail-accounts '(("hlissner@gmail.com" . "/hlissner")
|
||||||
|
("example@example.com" . "/example")))
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
If you only use Gmail, you can improve performance due to the way Gmail
|
||||||
|
presents messages over IMAP:
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
;; don't need to run cleanup after indexing for gmail
|
||||||
|
(setq mu4e-index-cleanup nil
|
||||||
|
;; because gmail uses labels as folders we can use lazy check since
|
||||||
|
;; messages don't really "move"
|
||||||
|
mu4e-index-lazy-check t)
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Also, note that Gmail's IMAP settings must have "When I mark a message in IMAP
|
||||||
|
as deleted: Auto-Expunge off - Wait for the client to update the server." and
|
||||||
|
"When a message is marked as deleted and expunged from the last visible IMAP
|
||||||
|
folder: Move the message to the trash" for the integrations to work as expected.
|
||||||
|
|
||||||
** OrgMsg
|
** OrgMsg
|
||||||
With the =+org= flag, =org-msg= is installed, and ~org-msg-mode~ is enabled before
|
With the =+org= flag, =org-msg= is installed, and ~org-msg-mode~ is enabled before
|
||||||
|
|
|
@ -387,45 +387,32 @@ Must be set before org-msg is loaded to take effect.")
|
||||||
|
|
||||||
(when (featurep! +gmail)
|
(when (featurep! +gmail)
|
||||||
(after! mu4e
|
(after! mu4e
|
||||||
(defvar +mu4e-gmail-addresses nil
|
(defvar +mu4e-gmail-accounts nil
|
||||||
"A list of email addresses which, despite not:
|
"Gmail accounts that do not contain \"gmail\" in address and maildir.
|
||||||
- having '@gmail.com' in them, or
|
|
||||||
- being in a maildir where the name includes 'gmail'
|
|
||||||
|
|
||||||
Should be treated as a gmail address.")
|
An alist of Gmail addresses of the format \((\"username@domain.com\" . \"account-maildir\"))
|
||||||
|
to which Gmail integrations (behind the `+gmail' flag of the `mu4e' module) should be applied.
|
||||||
|
|
||||||
|
See `+mu4e-msg-gmail-p' and `mu4e-sent-messages-behavior'.")
|
||||||
|
|
||||||
;; don't save message to Sent Messages, Gmail/IMAP takes care of this
|
;; don't save message to Sent Messages, Gmail/IMAP takes care of this
|
||||||
(setq mu4e-sent-messages-behavior
|
(setq mu4e-sent-messages-behavior
|
||||||
(lambda () ;; TODO make use +mu4e-msg-gmail-p
|
(lambda () ;; TODO make use +mu4e-msg-gmail-p
|
||||||
(if (or (string-match-p "@gmail.com\\'" (message-sendmail-envelope-from))
|
(if (or (string-match-p "@gmail.com\\'" (message-sendmail-envelope-from))
|
||||||
(member (message-sendmail-envelope-from) +mu4e-gmail-addresses))
|
(member (message-sendmail-envelope-from)
|
||||||
'delete 'sent))
|
(mapcar #'car +mu4e-gmail-accounts)))
|
||||||
|
'delete 'sent)))
|
||||||
;; don't need to run cleanup after indexing for gmail
|
|
||||||
mu4e-index-cleanup nil
|
|
||||||
|
|
||||||
;; because gmail uses labels as folders we can use lazy check since
|
|
||||||
;; messages don't really "move"
|
|
||||||
mu4e-index-lazy-check t)
|
|
||||||
|
|
||||||
(defun +mu4e-msg-gmail-p (msg)
|
(defun +mu4e-msg-gmail-p (msg)
|
||||||
(or
|
(let ((root-maildir
|
||||||
(string-match-p "@gmail.com"
|
(replace-regexp-in-string "/.*" ""
|
||||||
(cond
|
(substring (mu4e-message-field msg :maildir) 1))))
|
||||||
((member (mu4e-message-field msg :to)
|
(or (string-match-p "gmail" root-maildir)
|
||||||
(append (mu4e-personal-addresses)
|
(member root-maildir (mapcar #'cdr +mu4e-gmail-accounts)))))
|
||||||
+mu4e-gmail-addresses))
|
|
||||||
(mu4e-message-field msg :to))
|
|
||||||
((member (mu4e-message-field msg :from)
|
|
||||||
(append (mu4e-personal-addresses)
|
|
||||||
+mu4e-gmail-addresses))
|
|
||||||
(mu4e-message-field msg :from))
|
|
||||||
(t "")))
|
|
||||||
(string-match-p "gmail" (mu4e-message-field msg :maildir))))
|
|
||||||
|
|
||||||
;; In my workflow, emails won't be moved at all. Only their flags/labels are
|
;; In my workflow, emails won't be moved at all. Only their flags/labels are
|
||||||
;; changed. Se we redefine the trash and refile marks not to do any moving.
|
;; changed. Se we redefine the trash and refile marks not to do any moving.
|
||||||
;; However, the real magic happens in `+mu4e|gmail-fix-flags'.
|
;; However, the real magic happens in `+mu4e-gmail-fix-flags-h'.
|
||||||
;;
|
;;
|
||||||
;; Gmail will handle the rest.
|
;; Gmail will handle the rest.
|
||||||
(defun +mu4e--mark-seen (docid _msg target)
|
(defun +mu4e--mark-seen (docid _msg target)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue