I am resurrecting this old thread to report that (with the help of Claude) I have got a solution to this problem, using org-msg. Here are the notes that I put together with Claude's help. I'm pasting markdown so I'm not sure how it will look. I've extracted this from my more complicated mu4e setup so I've not tested it in isolation but I think it will work. Please test carefully before using for anything important!
## The fix
The solution reuses org-msg's reply machinery for forwards. When composing a
reply, org-msg exports the parent email's HTML to a temp file, stores it in the
`:reply-to` property, and at send time merges your composed text directly into
the original HTML DOM — producing a single `text/html` part with no MIME
wrapping. This is why replies display correctly in Outlook.
The fix intercepts the forward compose buffer after org-msg has finished its
setup, exports the parent HTML using the same reply mechanism, strips the
gnus-generated forward block from the buffer body, and sets `:reply-to` so
org-msg treats the forward exactly like a reply at send time.
## Requirements
- mu4e
- [org-msg](
https://github.com/jeremy-compostella/org-msg)
## org-msg configuration
A working org-msg configuration compatible with this fix. The key settings are
`org-msg-default-alternatives` (which controls whether HTML is generated for
new messages, replies to HTML, and replies to plain text) and
`org-msg-convert-citation` (which styles quoted text).
```elisp
(use-package org-msg
:after (org mu4e)
:config
;; set mu4e as email agent
(setq mail-user-agent 'mu4e-user-agent)
(setq org-msg-options "html-postamble:nil H:5 num:nil ^:{} toc:nil author:nil email:nil \\n:t"
org-msg-startup "hidestars indent inlineimages"
org-msg-greeting-fmt nil
org-msg-greeting-name-limit 1 ; use first name only
org-msg-default-alternatives '((new . (text html))
(reply-to-html . (text html))
(reply-to-text . (text)))
org-msg-convert-citation t ; style quoted text nicely
org-msg-signature
"
#+begin_signature
--
Your signature here
#+end_signature")
;; Key bindings in the org-msg compose buffer
;; send
(define-key org-msg-edit-mode-map (kbd "C-c C-c") #'org-msg-ctrl-c-ctrl-c)
;; save as draft
(define-key org-msg-edit-mode-map (kbd "C-c C-d") #'message-dont-send)
(org-msg-mode))
```
## Implementation
Add the following to your Emacs config after org-msg is loaded:
```elisp
(defun my/org-msg-fix-forward ()
"For HTML forwards, replace the gnus MML block with an org-msg reply-to.
This causes org-msg to merge the forwarded content directly into the
HTML body at send time, so Outlook displays it inline rather than as
an attachment."
(when (and (eq mu4e-compose-type 'forward)
(eq major-mode 'org-msg-edit-mode)
(org-msg-mua-call 'article-htmlp))
(let ((reply-to-files (org-msg-save-article-for-reply-mu4e)))
(when reply-to-files
(when (bound-and-true-p org-appear-mode)
(org-appear-mode -1))
;; Delete the gnus forward block between the start/end banners,
;; leaving the org-msg options, properties, and signature intact.
(save-excursion
(goto-char (point-min))
(when (re-search-forward
"^-+ Start of forwarded message -+$" nil t)
(let ((start (line-beginning-position)))
(when (re-search-forward
"^-+ End of forwarded message -+$" nil t)
(delete-region start (1+ (line-end-position)))))))
(org-msg-set-prop "reply-to" reply-to-files)
(setq mml-content-disposition-alist
(append (org-msg--mml-content-disposition-alist)
mml-content-disposition-alist))
(when (bound-and-true-p org-appear-mode)
(org-appear-mode 1))))))
;; Depth 10 ensures this runs after org-msg-post-setup.
(add-hook 'mu4e-compose-mode-hook #'my/org-msg-fix-forward 10)
```
### With mu4e-send-delay
If you are using
[mu4e-send-delay](
https://github.com/krisbalintona/mu4e-send-delay)
then some modifications to that package are needed for compatibility
with this. Let me know if this is of interest.
## How it works
1. `mu4e-compose-forward` opens the compose buffer and runs
`mu4e-compose-mode-hook`.
2. `org-msg-post-setup` (depth 0) activates `org-msg-edit-mode` and inserts the
org-msg options, properties block, and signature. The gnus-generated forward
block (text + HTML MIME parts wrapped in start/end banners) is left in the
buffer body below the signature.
3. `my/org-msg-fix-forward` (depth 10) runs after org-msg setup is complete. It
calls `org-msg-save-article-for-reply-mu4e` to export the parent email's HTML
to a temp file, deletes the gnus forward block from the buffer, and sets the
`:reply-to` property to the exported HTML path.
4. At send time, `org-msg-prepare-to-send` sees `:reply-to` set and calls
`org-msg-build`, which parses the exported HTML and merges your composed text
above it in a single `text/html` part — identical to how a reply is
constructed. No `message/rfc822` wrapping, no attachment.
## Notes
- This only applies to forwards of HTML emails. Plain-text forwards are
unaffected (`org-msg-mua-call 'article-htmlp` returns nil and the function
exits early).
- If you use `org-appear-mode`, it is briefly disabled and re-enabled during
setup to avoid a harmless but noisy `args-out-of-range` error caused by buffer
contents changing while org-appear's post-command hook is running.
- The forwarded email's content appears in the sent message exactly as it would
in a reply — the original HTML is preserved and displayed inline by Outlook
and other clients.