I use mu4e
for email. An attachment is simply text:
<#part filename="/absolute/path/to/file" disposition=attachment>
<#/part>
Can mu4e
resize the attachment upon sending, e.g. converting a 3 MB JPEG image to a much smaller size?
One way of doing this is to find the attached filename and send it to the convert command. You would then have to specify the output filename and add it in place of the original attachment.
I would probably use mu4e-resize-image-attachments
interactively, assuming it works, but you could also add it to the message-send-hook
to do the conversion automatically before sending the message, which I think is what your question suggests.
Edit: For macOS, mmorin suggests using "sips --resampleWidth 600 %s --out %s"
as an alternative to ImageMagick.
Edit: mmorin suggested a variable mu4e-inhibit-resize
that you can toggle with M-x mu4e-inhibit-resize RET
if you want to disable the resizing for a single message, based on this thread.
(defvar mu4e-resize-image-types '("jpg" "png" "svg" "jpeg")
"List of attached image types to resize.")
(defvar mu4e-inhibit-resize nil)
(defun mu4e-resize-image-attachments ()
(unless mu4e-inhibit-resize
(let (cmds
(image-types
(mapconcat #'identity mu4e-resize-image-types "\\|")))
(save-excursion
(message-goto-body-1)
(while (re-search-forward
(format "<#part.+\\(filename=\"\\)\\(.+\\(\\.%s\\)\\)\""
image-types)
nil t)
(let* ((infile (match-string-no-properties 2))
(outfile (concat (temporary-file-directory)
(file-name-nondirectory infile))))
(push (format "convert %s -resize 600 %s"
(shell-quote-argument infile)
(shell-quote-argument outfile))
cmds)
(replace-match outfile t t nil 2)))
(mapcar #'shell-command cmds)))))
(add-hook 'message-send-hook 'mu4e-resize-image-attachments)
(defun mu4e-inhibit-resize()
(interactive)
(set (make-local-variable 'mu4e-inhibit-resize) t))