;;; mail-source.el --- functions for fetching mail
-;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007, 2008 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 3, 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., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
(eval-when-compile
(require 'cl)
(require 'imap))
-(eval-and-compile
- (autoload 'pop3-movemail "pop3")
- (autoload 'pop3-get-message-count "pop3")
- (autoload 'nnheader-cancel-timer "nnheader"))
+(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"
(const :tag "never" nil)
(integer :tag "days")))
-(defcustom mail-source-delete-old-incoming-confirm t
- "*If non-nil, ask for confirmation before deleting old incoming files.
+(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.1"
+ :version "22.2" ;; No Gnus / Gnus 5.10.10 (default changed)
:group 'mail-source
:type 'boolean)
"Strip the leading colon off the KEYWORD."
(intern (substring (symbol-name keyword) 1))))
+;; generate a list of variable names paired with nil values
+;; suitable for usage in a `let' form
(eval-and-compile
(defun mail-source-bind-1 (type)
(let* ((defaults (cdr (assq type mail-source-keyword-map)))
and the variables will be set according to it. Variables not
specified will be given default values.
+The user and password will be loaded from the auth-source values
+if those are available. They override the original user and
+password in a second `let' form.
+
After this is done, BODY will be executed in the scope
-of the `let' form.
+of the second `let' form.
The variables bound and their default values are described by
the `mail-source-keyword-map' variable."
- `(let ,(mail-source-bind-1 (car type-source))
+ `(let* ,(mail-source-bind-1 (car type-source))
(mail-source-set-1 ,(cadr type-source))
,@body))
(put 'mail-source-bind 'lisp-indent-function 1)
(put 'mail-source-bind 'edebug-form-spec '(sexp body))
+;; TODO: use the list format for auth-source-user-or-password modes
(defun mail-source-set-1 (source)
(let* ((type (pop source))
(defaults (cdr (assq type mail-source-keyword-map)))
- default value keyword)
+ default value keyword auth-info user-auth pass-auth)
(while (setq default (pop defaults))
+ ;; for each default :SYMBOL, set SYMBOL to the plist value for :SYMBOL
+ ;; using `mail-source-value' to evaluate the plist value
(set (mail-source-strip-keyword (setq keyword (car default)))
- (if (setq value (plist-get source keyword))
- (mail-source-value value)
- (mail-source-value (cadr default)))))))
+ ;; note the following reasons for this structure:
+ ;; 1) the auth-sources user and password override everything
+ ;; 2) it avoids macros, so it's cleaner
+ ;; 3) it falls through to the mail-sources and then default values
+ (cond
+ ((and
+ (eq keyword :user)
+ (setq user-auth
+ (nth 0 (auth-source-user-or-password
+ '("login" "password")
+ ;; this is "host" in auth-sources
+ (if (boundp 'server) (symbol-value 'server) "")
+ type))))
+ user-auth)
+ ((and
+ (eq keyword :password)
+ (setq pass-auth
+ (nth 1
+ (auth-source-user-or-password
+ '("login" "password")
+ ;; this is "host" in auth-sources
+ (if (boundp 'server) (symbol-value 'server) "")
+ type))))
+ pass-auth)
+ (t (if (setq value (plist-get source keyword))
+ (mail-source-value value)
+ (mail-source-value (cadr default)))))))))
(eval-and-compile
(defun mail-source-bind-common-1 ()
((stringp value)
value)
;; Function
- ((and (listp value)
- (functionp (car value)))
+ ((and (listp value) (symbolp (car value)) (fboundp (car value)))
(eval value))
;; Just return the value.
(t
(error "Cannot get new mail"))
0)))))))))
+(declare-function gnus-message "gnus-util" (level &rest args))
+
(defun mail-source-delete-old-incoming (&optional age confirm)
"Remove incoming files older than AGE days.
If CONFIRM is non-nil, ask for confirmation before removing a file."
(interactive "P")
+ (require 'gnus-util)
(let* ((high2days (/ 65536.0 60 60 24));; convert high bits to days
(low2days (/ 1.0 65536.0)) ;; convert low bits to days
(diff (if (natnump age) age 30));; fallback, if no valid AGE given
currday files)
(setq files (directory-files
mail-source-directory t
- (concat mail-source-incoming-file-prefix "*"))
+ (concat "\\`"
+ (regexp-quote mail-source-incoming-file-prefix)))
currday (* (car (current-time)) high2days)
currday (+ currday (* low2days (nth 1 (current-time)))))
(while files
(fileday (+ fileday (* low2days (nth 1 filetime)))))
(setq files (cdr files))
(when (and (> (- currday fileday) diff)
- (gnus-message 8 "File `%s' is older than %s day(s)"
- bfile diff)
- (or (not confirm)
- (y-or-n-p (concat "Remove file `" bfile "'? "))))
+ (if confirm
+ (y-or-n-p
+ (format "\
+Delete old (> %s day(s)) incoming mail file `%s'? " diff bfile))
+ (gnus-message 8 "\
+Deleting old (> %s day(s)) incoming mail file `%s'." diff bfile)
+ t))
(delete-file ffile))))))
(defun mail-source-callback (callback info)
(mail-source-delete-crash-box)))))
found)))
-(eval-and-compile
- (autoload 'imap-open "imap")
- (autoload 'imap-authenticate "imap")
- (autoload 'imap-mailbox-select "imap")
- (autoload 'imap-mailbox-unselect "imap")
- (autoload 'imap-mailbox-close "imap")
- (autoload 'imap-search "imap")
- (autoload 'imap-fetch "imap")
- (autoload 'imap-close "imap")
- (autoload 'imap-error-text "imap")
- (autoload 'imap-message-flags-add "imap")
- (autoload 'imap-list-to-message-set "imap")
- (autoload 'imap-range-to-message-set "imap")
- (autoload 'nnheader-ms-strip-cr "nnheader"))
+(autoload 'imap-open "imap")
+(autoload 'imap-authenticate "imap")
+(autoload 'imap-mailbox-select "imap")
+(autoload 'imap-mailbox-unselect "imap")
+(autoload 'imap-mailbox-close "imap")
+(autoload 'imap-search "imap")
+(autoload 'imap-fetch "imap")
+(autoload 'imap-close "imap")
+(autoload 'imap-error-text "imap")
+(autoload 'imap-message-flags-add "imap")
+(autoload 'imap-list-to-message-set "imap")
+(autoload 'imap-range-to-message-set "imap")
+(autoload 'nnheader-ms-strip-cr "nnheader")
(autoload 'gnus-compress-sequence "gnus-range")
?s server ?P port ?u user))
found)))
-(eval-and-compile
- (autoload 'webmail-fetch "webmail"))
+(autoload 'webmail-fetch "webmail")
(defun mail-source-fetch-webmail (source callback)
"Fetch for webmail source."
(provide 'mail-source)
-;;; arch-tag: 72948025-1d17-4d6c-bb12-ef1aa2c490fd
+;; arch-tag: 72948025-1d17-4d6c-bb12-ef1aa2c490fd
;;; mail-source.el ends here