Merge from emacs--devo--0
[gnus] / lisp / mail-source.el
index 721c5fc..3ff8351 100644 (file)
@@ -1,15 +1,17 @@
 ;;; mail-source.el --- functions for fetching mail
-;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
+;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news, mail
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 ;;; Code:
 
+;; For Emacs < 22.2.
+(eval-and-compile
+  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
+
+(require 'format-spec)
 (eval-when-compile
   (require 'cl)
-  (require 'imap)
-  (eval-when-compile (defvar display-time-mail-function)))
+  (require 'imap))
 (eval-and-compile
+  (autoload 'auth-source-user-or-password "auth-source")
   (autoload 'pop3-movemail "pop3")
   (autoload 'pop3-get-message-count "pop3")
   (autoload 'nnheader-cancel-timer "nnheader"))
-(require 'format-spec)
 (require 'mm-util)
+(require 'message) ;; for `message-directory'
+
+(defvar display-time-mail-function)
 
 (defgroup mail-source nil
   "The mail-fetching library."
+  :version "21.1"
   :group 'gnus)
 
 ;; Define these at compile time to avoid dragging in imap always.
              (list 'const (car a)))
      imap-stream-alist)))
 
-(defcustom mail-sources nil
-  "*Where the mail backends will look for incoming mail.
+(defcustom mail-sources '((file))
+  "Where the mail backends will look for incoming mail.
 This variable is a list of mail source specifiers.
 See Info node `(gnus)Mail Source Specifiers'."
   :group 'mail-source
-  :type `(repeat
-         (choice :format "%[Value Menu%] %v"
-                 :value (file)
-                 (cons :tag "Spool file"
-                       (const :format "" file)
-                       (checklist :tag "Options" :greedy t
-                                  (group :inline t
-                                         (const :format "" :value :path)
-                                         file)))
-                 (cons :tag "Several files in a directory"
-                       (const :format "" directory)
-                       (checklist :tag "Options" :greedy t
-                                  (group :inline t
-                                         (const :format "" :value :path)
-                                         (directory :tag "Path"))
-                                  (group :inline t
-                                         (const :format "" :value :suffix)
-                                         (string :tag "Suffix"))
-                                  (group :inline t
-                                         (const :format "" :value :predicate)
-                                         (function :tag "Predicate"))
-                                  (group :inline t
-                                         (const :format "" :value :prescript)
-                                         (string :tag "Prescript"))
-                                  (group :inline t
-                                         (const :format "" :value :postscript)
-                                         (string :tag "Postscript"))
-                                  (group :inline t
-                                         (const :format "" :value :plugged)
-                                         (boolean :tag "Plugged"))))
-                 (cons :tag "POP3 server"
-                       (const :format "" pop)
-                       (checklist :tag "Options" :greedy t
-                                  (group :inline t
-                                         (const :format "" :value :server) 
-                                         (string :tag "Server"))
-                                  (group :inline t
-                                         (const :format "" :value :port) 
-                                         (choice :tag "Port"
-                                                 :value "pop3" 
-                                                 (number :format "%v")
-                                                 (string :format "%v")))
-                                  (group :inline t
-                                         (const :format "" :value :user)
-                                         (string :tag "User"))
-                                  (group :inline t
-                                         (const :format "" :value :password)
-                                         (string :tag "Password"))
-                                  (group :inline t
-                                         (const :format "" :value :program)
-                                         (string :tag "Program"))
-                                  (group :inline t
-                                         (const :format "" :value :prescript)
-                                         (string :tag "Prescript"))
-                                  (group :inline t
-                                         (const :format "" :value :postscript)
-                                         (string :tag "Postscript"))
-                                  (group :inline t
-                                         (const :format "" :value :function)
-                                         (function :tag "Function"))
-                                  (group :inline t
-                                         (const :format "" 
-                                                :value :authentication)
-                                         (choice :tag "Authentication"
-                                                 :value apop
-                                                 (const password)
-                                                 (const apop)))
-                                  (group :inline t
-                                         (const :format "" :value :plugged)
-                                         (boolean :tag "Plugged"))))
-                 (cons :tag "Maildir (qmail, postfix...)"
-                       (const :format "" maildir)
-                       (checklist :tag "Options" :greedy t
-                                  (group :inline t
-                                         (const :format "" :value :path)
-                                         (directory :tag "Path"))
-                                  (group :inline t
-                                         (const :format "" :value :plugged)
-                                         (boolean :tag "Plugged"))))
-                 (cons :tag "IMAP server"
-                       (const :format "" imap)
-                       (checklist :tag "Options" :greedy t
-                                  (group :inline t
-                                         (const :format "" :value :server)
-                                         (string :tag "Server"))
-                                  (group :inline t
-                                         (const :format "" :value :port)
-                                         (choice :tag "Port" 
-                                                 :value 143 
-                                                 number string))
-                                  (group :inline t
-                                         (const :format "" :value :user)
-                                         (string :tag "User"))
-                                  (group :inline t
-                                         (const :format "" :value :password)
-                                         (string :tag "Password"))
-                                  (group :inline t
-                                         (const :format "" :value :stream)
-                                         (choice :tag "Stream"
-                                                 :value network
-                                                 ,@mail-source-imap-streams))
-                                  (group :inline t
-                                         (const :format ""
-                                                :value :authenticator)
-                                         (choice :tag "Authenticator"
-                                                 :value login
-                                                 ,@mail-source-imap-authenticators))
-                                  (group :inline t
-                                         (const :format "" :value :mailbox)
-                                         (string :tag "Mailbox"))
-                                  (group :inline t
-                                         (const :format "" :value :predicate)
-                                         (function :tag "Predicate"))
-                                  (group :inline t
-                                         (const :format "" :value :fetchflag)
-                                         (string :tag "Fetchflag"))
-                                  (group :inline t
-                                         (const :format ""
-                                                :value :dontexpunge)
-                                         (boolean :tag "Dontexpunge"))
-                                  (group :inline t
-                                         (const :format "" :value :plugged)
-                                         (boolean :tag "Plugged"))))
-                 (cons :tag "Webmail server"
-                       (const :format "" webmail)
-                       (checklist :tag "Options" :greedy t
-                                  (group :inline t 
-                                        (const :format "" :value :subtype)
-                                        ;; Should be generated from
-                                        ;; `webmail-type-definition', but we
-                                        ;; can't require webmail without W3.
-                                        (choice :tag "Subtype"
-                                                :value hotmail
-                                                (const hotmail)
-                                                (const yahoo)
-                                                (const netaddress)
-                                                (const netscape)
-                                                (const my-deja)))
-                                  (group :inline t
-                                         (const :format "" :value :user)
-                                         (string :tag "User"))
-                                  (group :inline t
-                                         (const :format "" :value :password)
-                                         (string :tag "Password"))
-                                  (group :inline t
-                                         (const :format ""
-                                                :value :dontexpunge)
-                                         (boolean :tag "Dontexpunge"))
-                                  (group :inline t
-                                         (const :format "" :value :plugged)
-                                         (boolean :tag "Plugged")))))))
+  :version "23.1" ;; No Gnus
+  :link '(custom-manual "(gnus)Mail Source Specifiers")
+  :type `(choice
+         (const :tag "None" nil)
+         (repeat :tag "List"
+          (choice :format "%[Value Menu%] %v"
+                  :value (file)
+                  (cons :tag "Group parameter `mail-source'"
+                        (const :format "" group))
+                  (cons :tag "Spool file"
+                        (const :format "" file)
+                        (checklist :tag "Options" :greedy t
+                                   (group :inline t
+                                          (const :format "" :value :path)
+                                          file)))
+                  (cons :tag "Several files in a directory"
+                        (const :format "" directory)
+                        (checklist :tag "Options" :greedy t
+                                   (group :inline t
+                                          (const :format "" :value :path)
+                                          (directory :tag "Path"))
+                                   (group :inline t
+                                          (const :format "" :value :suffix)
+                                          (string :tag "Suffix"))
+                                   (group :inline t
+                                          (const :format "" :value :predicate)
+                                          (function :tag "Predicate"))
+                                   (group :inline t
+                                          (const :format "" :value :prescript)
+                                          (choice :tag "Prescript"
+                                                  :value nil
+                                                  (string :format "%v")
+                                                  (function :format "%v")))
+                                   (group :inline t
+                                          (const :format "" :value :postscript)
+                                          (choice :tag "Postscript"
+                                                  :value nil
+                                                  (string :format "%v")
+                                                  (function :format "%v")))
+                                   (group :inline t
+                                          (const :format "" :value :plugged)
+                                          (boolean :tag "Plugged"))))
+                  (cons :tag "POP3 server"
+                        (const :format "" pop)
+                        (checklist :tag "Options" :greedy t
+                                   (group :inline t
+                                          (const :format "" :value :server)
+                                          (string :tag "Server"))
+                                   (group :inline t
+                                          (const :format "" :value :port)
+                                          (choice :tag "Port"
+                                                  :value "pop3"
+                                                  (integer :format "%v")
+                                                  (string :format "%v")))
+                                   (group :inline t
+                                          (const :format "" :value :user)
+                                          (string :tag "User"))
+                                   (group :inline t
+                                          (const :format "" :value :password)
+                                          (string :tag "Password"))
+                                   (group :inline t
+                                          (const :format "" :value :program)
+                                          (string :tag "Program"))
+                                   (group :inline t
+                                          (const :format "" :value :prescript)
+                                          (choice :tag "Prescript"
+                                                  :value nil
+                                                  (string :format "%v")
+                                                  (function :format "%v")
+                                                  (const :tag "None" nil)))
+                                   (group :inline t
+                                          (const :format "" :value :postscript)
+                                          (choice :tag "Postscript"
+                                                  :value nil
+                                                  (string :format "%v")
+                                                  (function :format "%v")
+                                                  (const :tag "None" nil)))
+                                   (group :inline t
+                                          (const :format "" :value :function)
+                                          (function :tag "Function"))
+                                   (group :inline t
+                                          (const :format ""
+                                                 :value :authentication)
+                                          (choice :tag "Authentication"
+                                                  :value apop
+                                                  (const password)
+                                                  (const apop)))
+                                   (group :inline t
+                                          (const :format "" :value :plugged)
+                                          (boolean :tag "Plugged"))
+                                   (group :inline t
+                                          (const :format "" :value :stream)
+                                          (choice :tag "Stream"
+                                                  :value nil
+                                                  (const :tag "Clear" nil)
+                                                  (const starttls)
+                                                  (const :tag "SSL/TLS" ssl)))))
+                  (cons :tag "Maildir (qmail, postfix...)"
+                        (const :format "" maildir)
+                        (checklist :tag "Options" :greedy t
+                                   (group :inline t
+                                          (const :format "" :value :path)
+                                          (directory :tag "Path"))
+                                   (group :inline t
+                                          (const :format "" :value :plugged)
+                                          (boolean :tag "Plugged"))))
+                  (cons :tag "IMAP server"
+                        (const :format "" imap)
+                        (checklist :tag "Options" :greedy t
+                                   (group :inline t
+                                          (const :format "" :value :server)
+                                          (string :tag "Server"))
+                                   (group :inline t
+                                          (const :format "" :value :port)
+                                          (choice :tag "Port"
+                                                  :value 143
+                                                  integer string))
+                                   (group :inline t
+                                          (const :format "" :value :user)
+                                          (string :tag "User"))
+                                   (group :inline t
+                                          (const :format "" :value :password)
+                                          (string :tag "Password"))
+                                   (group :inline t
+                                          (const :format "" :value :stream)
+                                          (choice :tag "Stream"
+                                                  :value network
+                                                  ,@mail-source-imap-streams))
+                                   (group :inline t
+                                          (const :format "" :value :program)
+                                          (string :tag "Program"))
+                                   (group :inline t
+                                          (const :format ""
+                                                 :value :authenticator)
+                                          (choice :tag "Authenticator"
+                                                  :value login
+                                                  ,@mail-source-imap-authenticators))
+                                   (group :inline t
+                                          (const :format "" :value :mailbox)
+                                          (string :tag "Mailbox"
+                                                  :value "INBOX"))
+                                   (group :inline t
+                                          (const :format "" :value :predicate)
+                                          (string :tag "Predicate"
+                                                  :value "UNSEEN UNDELETED"))
+                                   (group :inline t
+                                          (const :format "" :value :fetchflag)
+                                          (string :tag "Fetchflag"
+                                                  :value  "\\Deleted"))
+                                   (group :inline t
+                                          (const :format ""
+                                                 :value :dontexpunge)
+                                          (boolean :tag "Dontexpunge"))
+                                   (group :inline t
+                                          (const :format "" :value :plugged)
+                                          (boolean :tag "Plugged"))))
+                  (cons :tag "Webmail server"
+                        (const :format "" webmail)
+                        (checklist :tag "Options" :greedy t
+                                   (group :inline t
+                                         (const :format "" :value :subtype)
+                                         ;; Should be generated from
+                                         ;; `webmail-type-definition', but we
+                                         ;; can't require webmail without W3.
+                                         (choice :tag "Subtype"
+                                                 :value hotmail
+                                                 (const hotmail)
+                                                 (const yahoo)
+                                                 (const netaddress)
+                                                 (const netscape)
+                                                 (const my-deja)))
+                                   (group :inline t
+                                          (const :format "" :value :user)
+                                          (string :tag "User"))
+                                   (group :inline t
+                                          (const :format "" :value :password)
+                                          (string :tag "Password"))
+                                   (group :inline t
+                                          (const :format ""
+                                                 :value :dontexpunge)
+                                          (boolean :tag "Dontexpunge"))
+                                   (group :inline t
+                                          (const :format "" :value :plugged)
+                                          (boolean :tag "Plugged"))))))))
+
+(defcustom mail-source-ignore-errors nil
+  "*Ignore errors when querying mail sources.
+If nil, the user will be prompted when an error occurs.  If non-nil,
+the error will be ignored."
+  :version "22.1"
+  :group 'mail-source
+  :type 'boolean)
 
 (defcustom mail-source-primary-source nil
   "*Primary source for incoming mail.
@@ -215,13 +264,18 @@ If non-nil, this maildrop will be checked periodically for new mail."
   :group 'mail-source
   :type 'sexp)
 
+(defcustom mail-source-flash t
+  "*If non-nil, flash periodically when mail is available."
+  :group 'mail-source
+  :type 'boolean)
+
 (defcustom mail-source-crash-box "~/.emacs-mail-crash-box"
   "File where mail will be stored while processing it."
   :group 'mail-source
   :type 'file)
 
-(defcustom mail-source-directory "~/Mail/"
-  "Directory where files (if any) will be stored."
+(defcustom mail-source-directory message-directory
+  "Directory where incoming mail source files (if any) will be stored."
   :group 'mail-source
   :type 'directory)
 
@@ -230,8 +284,28 @@ If non-nil, this maildrop will be checked periodically for new mail."
   :group 'mail-source
   :type 'integer)
 
-(defcustom mail-source-delete-incoming nil
-  "*If non-nil, delete incoming files after handling."
+(defcustom mail-source-delete-incoming
+  10 ;; development versions
+  ;; 2 ;; released versions
+  "If non-nil, delete incoming files after handling.
+If t, delete immediately, if nil, never delete.  If a positive number, delete
+files older than number of days.
+
+Removing of old files happens in `mail-source-callback', i.e. no
+old incoming files will be deleted unless you receive new mail.
+You may also set this variable to nil and call
+`mail-source-delete-old-incoming' interactively."
+  :group 'mail-source
+  :version "22.2" ;; No Gnus / Gnus 5.10.10 (default changed)
+  :type '(choice (const :tag "immediately" t)
+                (const :tag "never" nil)
+                (integer :tag "days")))
+
+(defcustom mail-source-delete-old-incoming-confirm nil
+  "If non-nil, ask for confirmation before deleting old incoming files.
+This variable only applies when `mail-source-delete-incoming' is a positive
+number."
+  :version "22.2" ;; No Gnus / Gnus 5.10.10 (default changed)
   :group 'mail-source
   :type 'boolean)
 
@@ -250,6 +324,12 @@ If non-nil, this maildrop will be checked periodically for new mail."
   :group 'mail-source
   :type 'number)
 
+(defcustom mail-source-movemail-program nil
+  "If non-nil, name of program for fetching new mail."
+  :version "22.1"
+  :group 'mail-source
+  :type '(choice (const nil) string))
+
 ;;; Internal variables.
 
 (defvar mail-source-string ""
@@ -272,6 +352,9 @@ Common keywords should be listed here.")
        (:path (or (getenv "MAIL")
                  (expand-file-name (user-login-name) rmail-spool-directory))))
       (directory
+       (:prescript)
+       (:prescript-delay)
+       (:postscript)
        (:path)
        (:suffix ".spool")
        (:predicate identity))
@@ -285,21 +368,26 @@ Common keywords should be listed here.")
        (:program)
        (:function)
        (:password)
-       (:authentication password))
+       (:authentication password)
+       (:stream nil))
       (maildir
        (:path (or (getenv "MAILDIR") "~/Maildir/"))</