If you want to change some setting, or execute some custom action before message composition starts, you can define a hook function. mu4e offers two hooks:
mu4e-compose-pre-hook: this hook is run before composition starts; if you are composing a reply, forward a message, or edit an existing message, the variable
mu4e-compose-parent-messagepoints to the message being replied to, forwarded or edited, and you can use
mu4e-message-fieldto get the value of various properties (and see Message functions).
mu4e-compose-mode-hook: this hook is run just before composition starts, when the whole buffer has already been set up. This is a good place for editing-related settings.
mu4e-compose-parent-message(see above) is also at your disposal.
Let’s look at some examples. First, suppose we want to set the From:-address for a reply message based on the receiver of the original:
;; 1) messages to email@example.com should be replied with From:firstname.lastname@example.org ;; 2) messages to email@example.com should be replied with From:firstname.lastname@example.org ;; 3) all other mail should use From:email@example.com (add-hook 'mu4e-compose-pre-hook (defun my-set-from-address () "Set the From address based on the To address of the original." (let ((msg mu4e-compose-parent-message)) ;; msg is shorter... (when msg (setq user-mail-address (cond ((mu4e-message-contact-field-matches msg :to "firstname.lastname@example.org") "email@example.com") ((mu4e-message-contact-field-matches msg :to "firstname.lastname@example.org") "email@example.com") (t "firstname.lastname@example.org")))))))
Secondly, as mentioned,
mu4e-compose-mode-hook is especially
useful for editing-related settings. For example:
(add-hook 'mu4e-compose-mode-hook (defun my-do-compose-stuff () "My settings for message composition." (set-fill-column 72) (flyspell-mode)))
This hook is also useful for adding headers or changing headers, since the
message is fully formed when this hook runs. For example, to add a
Bcc:-header, you could add something like the following, using
(add-hook 'mu4e-compose-mode-hook (defun my-add-bcc () "Add a Bcc: header." (save-excursion (message-add-header "Bcc: email@example.com\n"))))
Or to something context-specific:
(add-hook 'mu4e-compose-mode-hook (lambda() (let* ((ctx (mu4e-context-current)) (name (if ctx (mu4e-context-name ctx)))) (when name (cond ((string= name "account1") (save-excursion (message-add-header "Bcc: firstname.lastname@example.org\n"))) ((string= name "account2") (save-excursion (message-add-header "Bcc: email@example.com\n"))))))))
For a more general discussion about extending mu4e, see Extending mu4e.