;;; mail-source.el --- functions for fetching mail
-;; Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+;; 2008, 2009, 2010 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:
-(eval-when-compile
- (require 'cl)
- (require 'imap)
- (eval-when-compile (defvar display-time-mail-function)))
+;; For Emacs < 22.2.
(eval-and-compile
- (autoload 'pop3-movemail "pop3")
- (autoload 'pop3-get-message-count "pop3")
- (autoload 'nnheader-cancel-timer "nnheader")
- (autoload 'nnheader-run-at-time "nnheader"))
+ (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
+
(require 'format-spec)
+(eval-when-compile
+ (require 'cl)
+ (require 'imap))
+(autoload 'auth-source-user-or-password "auth-source")
+(autoload 'pop3-movemail "pop3")
+(autoload 'pop3-get-message-count "pop3")
+(autoload 'nnheader-cancel-timer "nnheader")
(require 'mm-util)
(require 'message) ;; for `message-directory'
+(defvar display-time-mail-function)
+
(defgroup mail-source nil
"The mail-fetching library."
:version "21.1"
(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
+ :version "23.1" ;; No Gnus
:link '(custom-manual "(gnus)Mail Source Specifiers")
- :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)
- (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"
- (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)
- (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 :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 :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")))))))
+ :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"))))))))
+
+(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.
:type 'file)
(defcustom mail-source-directory message-directory
- "Directory where files (if any) will be stored."
+ "Directory where incoming mail source files (if any) will be stored."
:group 'mail-source
:type 'directory)
: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