"The mail-fetching library."
:group 'gnus)
+(defcustom mail-sources nil
+ "*Where the mail backends will look for incoming mail.
+This variable is a list of mail source specifiers."
+ :group 'mail-source
+ :type 'sexp)
+
(defcustom mail-source-crash-box "~/.emacs-mail-crash-box"
"File where mail will be stored while processing it."
:group 'mail-source
(eval-and-compile
(defvar mail-source-keyword-map
'((file
+ (:prescript)
+ (:postscript)
(:path (or (getenv "MAIL")
(concat "/usr/spool/mail/" (user-login-name)))))
(directory
(when (file-exists-p mail-source-crash-box)
(message "Processing mail from %s..." mail-source-crash-box)
(setq found (mail-source-callback
- callback mail-source-crash-box)))
- (+ found (funcall function source callback)))))
+ callback mail-source-crash-box)))
+ (+ found
+ (condition-case err
+ (funcall function source callback)
+ (error
+ (unless (yes-or-no-p
+ (format "Mail source error (%s). Continue? " err))
+ (error "Cannot get new mail."))
+ 0))))))
(defun mail-source-make-complex-temp-name (prefix)
(let ((newname (make-temp-name prefix))
(when (file-exists-p mail-source-crash-box)
(delete-file mail-source-crash-box))
0)
- (funcall callback mail-source-crash-box info)
- (when (file-exists-p mail-source-crash-box)
- ;; Delete or move the incoming mail out of the way.
- (if mail-source-delete-incoming
- (delete-file mail-source-crash-box)
- (let ((incoming
- (mail-source-make-complex-temp-name
- (expand-file-name
- "Incoming" mail-source-directory))))
- (unless (file-exists-p (file-name-directory incoming))
- (make-directory (file-name-directory incoming) t))
- (rename-file mail-source-crash-box incoming t))))
- 1))
+ (prog1
+ (funcall callback mail-source-crash-box info)
+ (when (file-exists-p mail-source-crash-box)
+ ;; Delete or move the incoming mail out of the way.
+ (if mail-source-delete-incoming
+ (delete-file mail-source-crash-box)
+ (let ((incoming
+ (mail-source-make-complex-temp-name
+ (expand-file-name
+ "Incoming" mail-source-directory))))
+ (unless (file-exists-p (file-name-directory incoming))
+ (make-directory (file-name-directory incoming) t))
+ (rename-file mail-source-crash-box incoming t)))))))
(defun mail-source-movemail (from to)
"Move FROM to TO using movemail."
(zerop (call-process shell-file-name nil nil nil
shell-command-switch program)))
+(defun mail-source-call-script (script)
+ (let ((background nil))
+ (when (string-match "& *$" script)
+ (setq script (substring script 0 (match-beginning 0))
+ background 0))
+ (call-process shell-file-name nil background nil
+ shell-command-switch script)))
+
;;;
;;; Different fetchers
;;;
(defun mail-source-fetch-file (source callback)
"Fetcher for single-file sources."
(mail-source-bind (file source)
+ (when prescript
+ (if (and (symbolp prescript) (fboundp prescript))
+ (funcall prescript)
+ (mail-source-call-script
+ (format-spec
+ prescript (format-spec-make ?t mail-source-crash-box)))))
(let ((mail-source-string (format "file:%s" path)))
(if (mail-source-movemail path mail-source-crash-box)
- (mail-source-callback callback path)
+ (prog1
+ (mail-source-callback callback path)
+ (when prescript
+ (if (and (symbolp prescript) (fboundp prescript))
+ (funcall prescript)
+ (mail-source-call-script
+ (format-spec
+ postscript (format-spec-make ?t mail-source-crash-box))))))
0))))
(defun mail-source-fetch-directory (source callback)
"Fetcher for single-file sources."
(mail-source-bind (pop source)
(when prescript
- (if (fboundp prescript)
+ (if (and (symbolp prescript)
+ (fboundp prescript))
(funcall prescript)
- (call-process shell-file-name nil nil nil
- shell-command-switch
- (format-spec
- prescript
- (format-spec-make ?p password ?t mail-source-crash-box
- ?s server ?P port ?u user)))))
+ (mail-source-call-script
+ (format-spec
+ prescript (format-spec-make ?p password ?t mail-source-crash-box
+ ?s server ?P port ?u user)))))
(let ((from (format "%s:%s:%s" server user port))
(mail-source-string (format "pop:%s@%s" user server))
result)
- (when (not (eq authentication 'apop))
+ (when (eq authentication 'password)
(setq password
(or password
(cdr (assoc from mail-source-password-cache))
(if result
(prog1
(mail-source-callback callback server)
- (when prescript
- (if (fboundp prescript)
- (funcall prescript)
- (call-process shell-file-name nil nil nil
- shell-command-switch
- (format-spec
- postscript
- (format-spec-make
- ?p password ?t mail-source-crash-box
- ?s server ?P port ?u user))))))
+ (when postscript
+ (if (and (symbolp postscript)
+ (fboundp postscript))
+ (funcall postscript)
+ (mail-source-call-script
+ (format-spec
+ postscript (format-spec-make
+ ?p password ?t mail-source-crash-box
+ ?s server ?P port ?u user))))))
;; We nix out the password in case the error
;; was because of a wrong password being given.
(setq mail-source-password-cache