A way to avoid sending a message that mentions an attachment but does not have 
one. It is based on VM 8.2.0b and Emacs 23 (yes, really). I offer it to the 
community hoping that others will find it useful, and for feedback.

;; Require confirmation to send message that mentions attachment
;; without attachment

(defun my-vm-get-current-body-text ()
  "Return the body text of the mail message in the current
buffer. Based on `vmpc-get-current-body-text'."
  (save-excursion
    (goto-char (point-min))
    (let ((start (re-search-forward
                  (concat "^" (regexp-quote mail-header-separator) "$")))
          (end (point-max)))
      (buffer-substring start end))))

(defcustom my-vm-check-for-attachment-regexp "attach"
  "In VM, ask to confirm sending message if it mentions
  attachment without having one. Non-nil (default is 'attach') is
  what `my-vm-check-for-attachment' looks for when scanning the
  message. Set to nil to never ask.")

(defun my-vm-check-for-attachment ()
  "In VM, ask to confirm sending message if it mentions
  attachment without having one. Set
  `my-vm-check-for-attachment-regexp' to modify how VM checks for
  the mention, or to nil to never ask."

                                        
  (when my-vm-check-for-attachment-regexp ; Is function enabled? Put
                                          ; another way, is there
                                          ; something to look for?

                                        ; Get content of Subject:
                                        ; header. Does using
                                        ; `vm-get-header-contents'
                                        ; make a difference here?
    (let ((subject (vm-mail-get-header-contents "Subject:"))

                                        ; Get content of message
                                        ; body. We could use
                                        ; `vmpc-get-current-body-text',
                                        ; but can't be sure
                                        ; Personality Crisis is
                                        ; enabled.
          (body (my-vm-get-current-body-text))

                                        ; VM's atachment tag, evidence
                                        ; that message has
                                        ; attachment. Taken from
                                        ; `vm-attach-file'.
          (attachment-regexp (regexp-quote "[ATTACHMENT ")))

      (when
          (or ; Does subject line or body mention attachment?
           (string-match-p my-vm-check-for-attachment-regexp subject)
           (string-match-p my-vm-check-for-attachment-regexp body))

                                        ; Yes, message mentions
                                        ; attachment. Does message
                                        ; actually have attachment?
        (unless (string-match-p attachment-regexp body)

                                        ; No attachment found. Confirm
                                        ; before sending
                                        ; message. Prompting with
                                        ; `my-vm-check-for-attachment-regexp'
                                        ; helps identify false
                                        ; positive.
          (when (not (y-or-n-p
                      (concat "Message mentions '"
                              my-vm-check-for-attachment-regexp
                              "' but has no attachment. Send? ")))
            (error "Message not sent")))))))

(add-hook 'vm-mail-send-hook 'my-vm-check-for-attachment)

Reply via email to