[PATCH 1/1] RFC: add attachment checks

Subject: [PATCH 1/1] RFC: add attachment checks

Date: Mon, 3 Sep 2018 13:57:13 -0400

To: notmuch@notmuchmail.org

Cc: Antoine Beaupré

From: Antoine Beaupré

This implements basic attachment checks like those present in other
MUAs (e.g. Thunderbird, IIRC). A hook watches for keywords implemented
using a customizable regex. The keywords are assume to indicate the
user forgot to add an attachment.

This currently checks for words in english and french and some care
was taken to avoid false positive, but those are bound to happen and
we embrace them with open arms: it's better to warn by mistake than
forget an attachment ever again. New languages can be added through
customization, which help string suggests contributing it back to the

 emacs/notmuch-message.el | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/emacs/notmuch-message.el b/emacs/notmuch-message.el
index 55e4cfee..ccf0906c 100644
--- a/emacs/notmuch-message.el
+++ b/emacs/notmuch-message.el
@@ -47,6 +47,43 @@ the \"inbox\" and \"todo\" tags, you would set:
 (add-hook 'message-send-hook 'notmuch-message-mark-replied)
+;; attachment checks
+;; should be sent upstream, but needs unit tests in test/T310-emacs.sh
+(defcustom notmuch-message-attach-regex
+  "\\b\\(attache\?ment\\|attached\\|attach\\|pi[èe]ce\s+jointe?\\)\\b"
+  "Pattern of text announcing there should be an attachment.
+This is used by `notmuch-message-check-attach' to check email
+bodies for words that might indicate the email should have an
+attachement. If the pattern matches and there is no attachment (a
+`<#part ...>' magic block), notmuch will show a confirmation
+prompt before sending the email.
+The default regular expression is deliberately liberal: we prefer
+false positive than forgotten attachments. This should be
+customized for non-english languages and notmuch welcomes
+additions to the pattern for your native language, unless it
+conflicts with common words in other languages."
+  :type '(regexp)
+  :group 'notmuch-send)
+(defun notmuch-message-check-attach ()
+  """Check for missing attachments.
+This is normally added to `message-send-hook' and is configured
+through `notmuch-message-attach-regex'."""
+  (save-excursion
+    (goto-char (point-min))
+    (if (re-search-forward notmuch-message-attach-regex nil t)
+        (progn
+          (goto-char (point-min))
+          (unless (re-search-forward "<#part [^>]*filename=[^>]*>" nil t)
+            (or (y-or-n-p "Email seem to refer to attachment, but nothing attached, send anyways?")
+                (error "No attachment found, aborting")))))))
+(add-hook 'message-send-hook 'notmuch-message-check-attach)
 (provide 'notmuch-message)
 ;;; notmuch-message.el ends here

notmuch mailing list