]> git.notmuchmail.org Git - notmuch/blobdiff - emacs/notmuch-mua.el
emacs: Add References header to forwarded messages
[notmuch] / emacs / notmuch-mua.el
index e205fa4c92ff9ce7451e1e9c908acac101a978aa..23f3d8b12cf10dbca3f6e8cdc8079718fbc04ab5 100644 (file)
@@ -115,8 +115,45 @@ multiple parts get a header."
                (function :tag "Other"))
   :group 'notmuch-reply)
 
+(defcustom notmuch-mua-attachment-regexp
+  "\\b\\(attache\?ment\\|attached\\|attach\\|pi[èe]ce\s+jointe?\\)\\b"
+  "Message body text indicating that an attachment is expected.
+
+This is not used unless `notmuch-mua-attachment-check' is added
+to `notmuch-mua-send-hook'.")
+
 ;;
 
+(defun notmuch-mua-attachment-check ()
+  "Signal an error if the message text indicates that an
+attachment is expected but no MML referencing an attachment is
+found.
+
+Typically this is added to `notmuch-mua-send-hook'."
+  (when (and
+        ;; When the message mentions attachment...
+        (save-excursion
+          (message-goto-body)
+          (loop while (re-search-forward notmuch-mua-attachment-regexp (point-max) t)
+                ;; For every instance of the "attachment" string
+                ;; found, examine the text properties. If the text
+                ;; has either a `face' or `syntax-table' property
+                ;; then it is quoted text and should *not* cause the
+                ;; user to be asked about a missing attachment.
+                if (let ((props (text-properties-at (match-beginning 0))))
+                     (not (or (memq 'syntax-table props)
+                              (memq 'face props))))
+                return t
+                finally return nil))
+        ;; ...but doesn't have a part with a filename...
+        (save-excursion
+          (message-goto-body)
+          (not (re-search-forward "^<#part [^>]*filename=" nil t)))
+        ;; ...and that's not okay...
+        (not (y-or-n-p "Attachment mentioned, but no attachment - is that okay?")))
+    ;; ...signal an error.
+    (error "Missing attachment")))
+
 (defun notmuch-mua-get-switch-function ()
   "Get a switch function according to `notmuch-mua-compose-in'."
   (cond ((eq notmuch-mua-compose-in 'current-window)
@@ -433,8 +470,9 @@ the From: address."
   (let* ((other-headers
          (when (or prompt-for-sender notmuch-always-prompt-for-sender)
            (list (cons 'From (notmuch-mua-prompt-for-sender)))))
-        forward-subject) ;; Comes from the first message and is
+        forward-subject  ;; Comes from the first message and is
                          ;; applied later.
+        forward-references) ;; List of accumulated message-references of forwarded messages
 
     ;; Generate the template for the outgoing message.
     (notmuch-mua-mail nil "" other-headers nil (notmuch-mua-get-switch-function))
@@ -452,7 +490,8 @@ the From: address."
                  ;; Because we process the messages in reverse order,
                  ;; always generate a forwarded subject, then use the
                  ;; last (i.e. first) one.
-                 (setq forward-subject (message-make-forward-subject)))
+                 (setq forward-subject (message-make-forward-subject))
+                 (push (message-fetch-field "Message-ID") forward-references))
                ;; Make a copy ready to be forwarded in the
                ;; composition buffer.
                (message-forward-make-body temp-buffer)
@@ -466,7 +505,10 @@ the From: address."
       (save-restriction
        (message-narrow-to-headers)
        (message-remove-header "Subject")
-       (message-add-header (concat "Subject: " forward-subject)))
+       (message-add-header (concat "Subject: " forward-subject))
+       (message-remove-header "References")
+       (message-add-header (concat "References: "
+                                   (mapconcat 'identity forward-references " "))))
 
       ;; `message-forward-make-body' shows the User-agent header.  Hide
       ;; it again.