]> code.delx.au - gnu-emacs/blobdiff - lisp/mail/feedmail.el
Merge from emacs-24; up to 2012-04-24T08:35:02Z!lekktu@gmail.com
[gnu-emacs] / lisp / mail / feedmail.el
index 277934378d964a83230c6571be31948ed9551902..df18abbc532d7807e7ddb6250cc4d6d22f2da001 100644 (file)
 
 ;;; Commentary:
 
-;; A replacement for parts of Emacs' sendmail.el (specifically,
+;; A replacement for parts of sendmail.el (specifically,
 ;; it's what handles your outgoing mail after you hit C-c C-c in mail
 ;; mode).  See below for a list of additional features, including the
-;; ability to queue messages for later sending.  If you are using
-;; fakemail as a subprocess, you can switch to feedmail and eliminate
-;; the use of fakemail.
+;; ability to queue messages for later sending.  This replaces
+;; the standalone fakemail program that used to be distributed with Emacs.
 
 ;; feedmail works with recent versions of Emacs (20.x series) and
 ;; XEmacs (tested with 20.4 and later betas).  It probably no longer
 ;; work properly.  If you don't know what custom is all about and want
 ;; to edit your user option elisp variables the old fashioned way,
 ;; just imagine that all the "defcustom" stuff you see below is really
-;; "defvar", and ignore everthing else.  For info about custom, see
+;; "defvar", and ignore everything else.  For info about custom, see
 ;; <URL:http://www.dina.kvl.dk/~abraham/custom/>.
 ;;
 ;; This code does in elisp a superset of the stuff that used to be done
 ;; by the separate program "fakemail" for processing outbound email.
 ;; In other words, it takes over after you hit "C-c C-c" in mail mode.
-;; By appropriate setting of options, you can still use "fakemail",
-;; or you can even revert to sendmail (which is not too popular
-;; locally).  See the variables at the top of the elisp for how to
-;; achieve these effects (there are more features than in this bullet
-;; list, so trolling through the variable and function doc strings may
-;; be worth your while):
+;; By appropriate setting of options, you can even revert to sendmail
+;; (which is not too popular locally).  See the variables at the top
+;; of the elisp for how to achieve these effects (there are more
+;; features than in this bullet list, so trolling through the variable
+;; and function doc strings may be worth your while):
 ;;
 ;;    --- you can park outgoing messages into a disk-based queue and
 ;;        stimulate sending them all later (handy for laptop users);
 ;;           for FQM files if you're a VM user
 ;;         change buffer-substring calls to buffer-substring-no-properties for
 ;;           speed-up (suggested by Howard Melman <howard@silverstream.com>)
-;;         feedmail-sendmail-f-doesnt-sell-me-out to contol "-f" in call to sendmail
+;;         feedmail-sendmail-f-doesnt-sell-me-out to control "-f" in call to sendmail
 ;;           in feedmail-buffer-to-sendmail
 ;;         better trapping of odd conditions during the running of the queue;
 ;;           thanks to Yigal Hochberg for helping me test much of this by remote
 ;;           systems with non-classic /bin/[r]mail behavior
 ;;         guard against nil user-mail-address in generating MESSAGE-ID:
 ;;         feedmail-queue-slug-suspect-regexp is now a variable to
-;;           accomodate non-ASCII environments (thanks to
+;;           accommodate non-ASCII environments (thanks to
 ;;           Makoto.Nakagawa@jp.compaq.com for this suggestion)
 ;;         feedmail-buffer-to-smtp, to parallel feedmail-buffer-to-smtpmail
 ;; patchlevel 10, 22 April 2001
@@ -430,6 +428,7 @@ any other non-nil value, take the action in both cases.  Even if
 you're not confirming the sending of immediate or queued messages,
 it can still be interesting to see a lot about them as they are
 shuttled robotically onward."
+  :version "24.1"
   :group 'feedmail-misc
   :type 'boolean
   )
@@ -914,9 +913,9 @@ you are at accomplishing inherently inefficient things."
 ;; FIXME this is a macro?
 (declare-function bbdb-search "ext:bbdb-com"
                  (records &optional name company net notes phone))
-
 (declare-function bbdb-records "ext:bbdb"
                  (&optional dont-check-disk already-in-db-buffer))
+(declare-function bbdb-dwim-net-address "ext:bbdb-com" (record &optional net))
 
 (defun feedmail-spray-via-bbdb ()
   "Example function for use with feedmail spray mode.
@@ -1012,7 +1011,7 @@ If it contains a \"%s\", that will be replaced with the value of
 
 
 (defcustom feedmail-ask-before-queue-reprompt "FQM: Please type q, i, d, or e; or ? for help [%s]: "
-  "A string which will be used for repompting after invalid input.
+  "A string which will be used for reprompting after invalid input.
 If it contains a \"%s\", that will be replaced with the value of
 `feedmail-ask-before-queue-default'."
   :group 'feedmail-queue
@@ -1341,7 +1340,7 @@ Example 'defadvice' for mail-send:
 
 
 (defvar feedmail-queue-runner-is-active nil
-  "*Non-nil means we're inside the logic of the queue-running loop.
+  "Non-nil means we're inside the logic of the queue-running loop.
 That is, iterating over all messages in the queue to send them.  In
 that case, the value is the name of the queued message file currently
 being processed.  This can be used for differentiating customized code
@@ -1358,7 +1357,7 @@ for you.  Add this function to `mail-send-hook' with something like this:
        (add-hook 'mail-send-hook 'feedmail-mail-send-hook-splitter)
 
 Then add the functions you want called to either `feedmail-mail-send-hook-queued'
-or `feedmail-mail-send-hook', as apprpriate.  The distinction is that
+or `feedmail-mail-send-hook', as appropriate.  The distinction is that
 `feedmail-mail-send-hook' will be called when you send mail from a composition
 buffer (typically by typing C-c C-c), whether the message is sent immediately
 or placed in the queue or drafts directory.  `feedmail-mail-send-hook-queued' is
@@ -1367,17 +1366,19 @@ call to `feedmail-run-the-queue'."
   (feedmail-say-debug ">in-> feedmail-mail-send-hook-splitter %s" feedmail-queue-runner-is-active)
   (if feedmail-queue-runner-is-active
       (run-hooks 'feedmail-mail-send-hook-queued)
-    (run-hooks 'feedmail-mail-send-hook))
-  )
-
+    (run-hooks 'feedmail-mail-send-hook)))
 
-(defvar feedmail-mail-send-hook nil
-  "*See documentation for `feedmail-mail-send-hook-splitter'.")
-
-
-(defvar feedmail-mail-send-hook-queued nil
-  "*See documentation for `feedmail-mail-send-hook-splitter'.")
+(defcustom feedmail-mail-send-hook nil
+  "Hook run by `feedmail-mail-send-hook-splitter' for immediate mail.
+See documentation of `feedmail-mail-send-hook-splitter' for details."
+  :type 'hook
+  :group 'feedmail)
 
+(defcustom feedmail-mail-send-hook-queued nil
+  "Hook run by `feedmail-mail-send-hook-splitter' for queued mail.
+See documentation of `feedmail-mail-send-hook-splitter' for details."
+  :type 'hook
+  :group 'feedmail)
 
 (defun feedmail-confirm-addresses-hook-example ()
   "An example of a `feedmail-last-chance-hook'.
@@ -1388,9 +1389,7 @@ It shows the simple addresses and gets a confirmation.  Use as:
     (erase-buffer)
     (insert (mapconcat 'identity feedmail-address-list " "))
     (if (not (y-or-n-p "How do you like them apples? "))
-       (error "FQM: Sending...gave up in last chance hook")
-      )))
-
+       (error "FQM: Sending...gave up in last chance hook"))))
 
 (defcustom feedmail-last-chance-hook nil
   "User's last opportunity to modify the message on its way out.
@@ -1439,7 +1438,7 @@ internal buffers will be reused and things will get confused."
   )
 
 (defcustom feedmail-queue-runner-mode-setter
-  '(lambda (&optional arg) (mail-mode))
+  (lambda (&optional arg) (mail-mode))
   "A function to set the proper mode of a message file.
 Called when the message is read back out of the queue directory with a single
 argument, the optional argument used in the call to
@@ -1475,7 +1474,7 @@ set `mail-header-separator' to the value of
 
 
 (defcustom feedmail-queue-runner-message-sender
-  '(lambda (&optional arg) (mail-send))
+  (lambda (&optional arg) (mail-send))
   "Function to initiate sending a message file.
 Called for each message read back out of the queue directory with a
 single argument, the optional argument used in the call to
@@ -1493,7 +1492,7 @@ you really don't need that.  Called with funcall, not call-interactively."
 
 
 (defcustom feedmail-queue-runner-cleaner-upper
-  '(lambda (fqm-file &optional arg)
+  (lambda (fqm-file &optional arg)
      (delete-file fqm-file)
      (if arg (feedmail-say-chatter "Nuked %s" fqm-file)))
   "Function that will be called after a message has been sent.
@@ -1515,7 +1514,7 @@ function, for example, to archive all of your sent messages someplace
 
 
 (defvar feedmail-is-a-resend nil
-  "*Non-nil means the message is a Resend (in the RFC-822 sense).
+  "Non-nil means the message is a Resend (in the RFC-822 sense).
 This affects the composition of certain headers.  feedmail sets this
 variable as soon as it starts prepping the message text buffer, so any
 user-supplied functions can rely on it.  Users shouldn't set or change this
@@ -1587,7 +1586,7 @@ messages to make sure it works as expected."
 
 
 ;; feedmail-buffer-to-binmail, feedmail-buffer-to-sendmail, and
-;; feedmail-buffer-to-smptmail are the only things provided for values
+;; feedmail-buffer-to-smtpmail are the only things provided for values
 ;; for the variable feedmail-buffer-eating-function.  It's pretty easy
 ;; to write your own, though.
 (defun feedmail-buffer-to-binmail (prepped errors-to addr-listoid)
@@ -1635,22 +1634,21 @@ local gurus."
   ;; no evil.
   (feedmail-say-debug ">in-> feedmail-buffer-to-smtpmail %s" addr-listoid)
   (require 'smtpmail)
-  (if (not (smtpmail-via-smtp addr-listoid prepped))
-      (progn
-       (set-buffer errors-to)
-       (insert "Send via smtpmail failed.  Probable SMTP protocol error.\n")
-       (insert "Look for details below or in the *Messages* buffer.\n\n")
-       (let ((case-fold-search t)
-             ;; don't be overconfident about the name of the trace buffer
-             (tracer (concat "trace.*smtp.*" (regexp-quote smtpmail-smtp-server))))
-         (mapcar
-          '(lambda (buffy)
-             (if (string-match tracer (buffer-name buffy))
-                 (progn
-                   (insert "SMTP Trace from " (buffer-name buffy) "\n---------------")
-                   (insert-buffer-substring buffy)
-                   (insert "\n\n"))))
-          (buffer-list))))))
+  (let ((result (smtpmail-via-smtp addr-listoid prepped)))
+    (when result
+      (set-buffer errors-to)
+      (insert "Send via smtpmail failed: %s" result)
+      (let ((case-fold-search t)
+           ;; don't be overconfident about the name of the trace buffer
+           (tracer (concat "trace.*smtp.*" (regexp-quote smtpmail-smtp-server))))
+       (mapcar
+        (lambda (buffy)
+          (if (string-match tracer (buffer-name buffy))
+              (progn
+                (insert "SMTP Trace from " (buffer-name buffy) "\n---------------")
+                (insert-buffer-substring buffy)
+                (insert "\n\n"))))
+        (buffer-list))))))
 
 (declare-function smtp-via-smtp "ext:smtp" (sender recipients smtp-text-buffer))
 (defvar smtp-server)
@@ -1669,7 +1667,7 @@ local gurus."
                          ;; don't be overconfident about the name of the trace buffer
                          (tracer (concat "trace.*smtp.*" (regexp-quote smtp-server))))
                  (mapcar
-                  '(lambda (buffy)
+                  (lambda (buffy)
                          (if (string-match tracer (buffer-name buffy))
                                  (progn
                                        (insert "SMTP Trace from " (buffer-name buffy) "\n---------------")
@@ -1733,6 +1731,8 @@ FOLDING can be nil, in which case VALUE is used as-is.  If FOLDING is
 non-nil, feedmail \"smart filling\" is done on VALUE just before
 insertion.")
 
+(declare-function vm-mail "ext:vm" (&optional to subject))
+
 (defun feedmail-vm-mail-mode (&optional arg)
   "Make something like a buffer that has been created via `vm-mail'.
 The optional argument is ignored and is just for argument compatibility with
@@ -1996,7 +1996,7 @@ backup file names and the like)."
        (if feedmail-queue-run-orderer
            (setq list-of-possible-fqms (funcall feedmail-queue-run-orderer list-of-possible-fqms)))
        (mapc
-        '(lambda (blobby)
+        (lambda (blobby)
            (setq maybe-file (expand-file-name blobby feedmail-queue-directory))
            (cond
             ((file-directory-p maybe-file) nil) ; don't care about subdirs
@@ -2027,12 +2027,6 @@ backup file names and the like)."
              (if (looking-at ".*\r\n.*\r\n")
                  (while (search-forward "\r\n" nil t)
                    (replace-match "\n" nil t)))
-;;                ;; work around text-vs-binary wierdness
-;;                ;; if we don't find the normal M-H-S, try reading the file a different way
-;;                (if (not (feedmail-find-eoh t))
-;;                        (let ((file-name-buffer-file-type-alist nil) (default-buffer-file-type nil))
-;;                              (erase-buffer)
-;;                              (insert-file-contents maybe-file)))
              (funcall feedmail-queue-runner-mode-setter arg)
              (condition-case signal-stuff ; don't give up the loop if user skips some
                  (let ((feedmail-enable-queue nil)
@@ -2189,7 +2183,7 @@ you can set `feedmail-queue-reminder-alist' to nil."
            (if (or (eq user-sez ?\C-m) (eq user-sez ?\C-j) (eq user-sez ?y))
                (setq user-sez d-char))
            ;; these char-to-int things are because of some
-           ;; incomprensible difference between the two in
+           ;; incomprehensible difference between the two in
            ;; byte-compiled stuff between Emacs and XEmacs
            ;; (well, I'm sure someone could comprehend it,
            ;; but I say 'uncle')
@@ -2238,7 +2232,7 @@ the counts."
     ;; iterate, counting things we find along the way in the directory
     (if (file-directory-p queue-directory)
        (mapc
-        '(lambda (blobby)
+        (lambda (blobby)
            (cond
             ((file-directory-p blobby) nil) ; don't care about subdirs
             ((feedmail-fqm-p blobby)
@@ -2262,9 +2256,9 @@ the counts."
   (while (string-match feedmail-queue-slug-suspect-regexp slug) (setq slug (replace-match "-" nil nil slug)))
   ;; collapse multiple hyphens to one
   (while (string-match "--+" slug) (setq slug (replace-match "-" nil nil slug)))
-  ;; for tidyness, peel off leading hyphens
+  ;; for tidiness, peel off leading hyphens
   (if (string-match "^-*" slug) (setq slug (replace-match "" nil nil slug)))
-  ;; for tidyness, peel off trailing hyphens
+  ;; for tidiness, peel off trailing hyphens
   (if (string-match "-*$" slug) (setq slug (replace-match "" nil nil slug)))
   slug
   )
@@ -2411,7 +2405,7 @@ mapped to mostly alphanumerics for safety."
        (a-re-dtcb  "^\\(To\\|Cc\\|Bcc\\):")
        (a-re-dtc   "^\\(To\\|Cc\\):")
        (a-re-db    "^Bcc:")
-       ;; to get a temporary changable copy
+       ;; to get a temporary changeable copy
        (mail-header-separator mail-header-separator)
        )
     (unwind-protect
@@ -2665,7 +2659,7 @@ fiddle-plex, as described in the documentation for the variable
   (save-excursion
     (if feedmail-enable-spray
        (mapcar
-        '(lambda (feedmail-spray-this-address)
+        (lambda (feedmail-spray-this-address)
            (let ((spray-buffer (get-buffer-create " *FQM Outgoing Email Spray*")))
              (with-current-buffer spray-buffer
                (erase-buffer)