;;; nnmail.el --- mail support functions for the Gnus mail backends
-;; Copyright (C) 1995,96,97 Free Software Foundation, Inc.
+;; Copyright (C) 1995,96,97,98 Free Software Foundation, Inc.
-;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news, mail
;; This file is part of GNU Emacs.
(require 'custom)
(eval-and-compile
- (autoload 'gnus-error "gnus-util"))
+ (autoload 'gnus-error "gnus-util")
+ (autoload 'gnus-buffer-live-p "gnus-util")
+ (autoload 'gnus-encode-coding-string "gnus-ems"))
(defgroup nnmail nil
"Reading mail with Gnus."
(defcustom nnmail-split-methods
'(("mail.misc" ""))
- "Incoming mail will be split according to this variable.
+ "*Incoming mail will be split according to this variable.
If you'd like, for instance, one mail group for mail from the
\"4ad-l\" mailing list, one group for junk mail and one for everything
(defcustom nnmail-spool-file
(or (getenv "MAIL")
(concat "/usr/spool/mail/" (user-login-name)))
- "Where the mail backends will look for incoming mail.
+ "*Where the mail backends will look for incoming mail.
This variable is \"/usr/spool/mail/$user\" by default.
If this variable is nil, no mail backends will read incoming mail.
If this variable is a list, all files mentioned in this list will be
:type 'function)
(defcustom nnmail-crosspost-link-function
- (if (string-match "windows-nt\\|emx" (format "%s" system-type))
+ (if (string-match "windows-nt\\|emx" (symbol-name system-type))
'copy-file
'add-name-to-file)
- "Function called to create a copy of a file.
+ "*Function called to create a copy of a file.
This is `add-name-to-file' by default, which means that crossposts
will use hard links. If your file system doesn't allow hard
links, you could set this variable to `copy-file' instead."
(if (eq system-type 'windows-nt)
'(nnheader-ms-strip-cr)
nil)
- "Hook that will be run after the incoming mail has been transferred.
+ "*Hook that will be run after the incoming mail has been transferred.
The incoming mail is moved from `nnmail-spool-file' (which normally is
something like \"/usr/spool/mail/$user\") to the user's home
directory. This hook is called after the incoming mail box has been
"Incoming mail can be split according to this fancy variable.
To enable this, set `nnmail-split-methods' to `nnmail-split-fancy'.
-The format is this variable is SPLIT, where SPLIT can be one of
+The format of this variable is SPLIT, where SPLIT can be one of
the following:
GROUP: Mail will be stored in GROUP (a string).
(from . "from\\|sender\\|resent-from")
(nato . "to\\|cc\\|resent-to\\|resent-cc")
(naany . "from\\|to\\|cc\\|sender\\|resent-from\\|resent-to\\|resent-cc"))
- "Alist of abbreviations allowed in `nnmail-split-fancy'."
+ "*Alist of abbreviations allowed in `nnmail-split-fancy'."
:group 'nnmail-split
:type '(repeat (cons :format "%v" symbol regexp)))
-(defcustom nnmail-delete-incoming nil
+(defcustom nnmail-delete-incoming t
"*If non-nil, the mail backends will delete incoming files after
splitting."
:group 'nnmail-retrieve
(defun nnmail-request-post (&optional server)
(mail-send-and-exit nil))
-;; 1997/5/4 by MORIOKA Tomohiko <morioka@jaist.ac.jp>
(defvar nnmail-file-coding-system 'raw-text
"Coding system used in nnmail.")
(let ((format-alist nil)
(after-insert-file-functions nil))
(condition-case ()
- ;; 1997/5/4 by MORIOKA Tomohiko <morioka@jaist.ac.jp>
(let ((coding-system-for-read nnmail-file-coding-system)
- ;; 1997/8/12 by MORIOKA Tomohiko
- ;; for XEmacs/mule.
(pathname-coding-system 'binary))
(insert-file-contents file)
t)
(file-error nil))))
-;; 1997/8/10 by MORIOKA Tomohiko
(defvar nnmail-pathname-coding-system
'iso-8859-1
"*Coding system for pathname.")
"Convert DAYS into time."
(let* ((seconds (* 1.0 days 60 60 24))
(rest (expt 2 16))
- (ms (condition-case nil (round (/ seconds rest))
+ (ms (condition-case nil (floor (/ seconds rest))
(range-error (expt 2 16)))))
(list ms (condition-case nil (round (- seconds (* ms rest)))
(range-error (expt 2 16))))))
(nnmail-read-passwd
(format "Password for %s: "
(substring inbox (+ popmail 3))))))
- (message "Getting mail from the post office..."))
+ (nnheader-message 5 "Getting mail from the post office..."))
(when (or (and (file-exists-p tofile)
(/= 0 (nnheader-file-size tofile)))
(and (file-exists-p inbox)
(/= 0 (nnheader-file-size inbox))))
- (message "Getting mail from %s..." inbox)))
+ (nnheader-message 5 "Getting mail from %s..." inbox)))
;; Set TOFILE if have not already done so, and
;; rename or copy the file INBOX to TOFILE if and as appropriate.
(cond
nil errors nil inbox tofile)
(when nnmail-internal-password
(list nnmail-internal-password)))))))
+ (push inbox nnmail-moved-inboxes)
(if (and (not (buffer-modified-p errors))
(zerop result))
;; No output => movemail won
(progn
(unless popmail
(when (file-exists-p tofile)
- (set-file-modes tofile nnmail-default-file-modes)))
- (push inbox nnmail-moved-inboxes))
+ (set-file-modes tofile nnmail-default-file-modes))))
(set-buffer errors)
;; There may be a warning about older revisions. We
;; ignore those.
(progn
(unless popmail
(when (file-exists-p tofile)
- (set-file-modes tofile nnmail-default-file-modes)))
- (push inbox nnmail-moved-inboxes))
+ (set-file-modes
+ tofile nnmail-default-file-modes))))
;; Probably a real error.
(subst-char-in-region (point-min) (point-max) ?\n ?\ )
(goto-char (point-max))
(buffer-string) result))
(error "%s" (buffer-string)))
(setq tofile nil)))))))
- (message "Getting mail from %s...done" inbox)
+ (nnheader-message 5 "Getting mail from %s...done" inbox)
(and errors
(buffer-name errors)
(kill-buffer errors))
group-assoc)))
group-assoc))
-;; 1997/8/12 by MORIOKA Tomohiko
(defvar nnmail-active-file-coding-system
'iso-8859-1
"*Coding system for active file.")
is a spool. If not using procmail, return GROUP."
(if (or (eq nnmail-spool-file 'procmail)
nnmail-use-procmail)
- (if (string-match (concat "^" (expand-file-name
- (file-name-as-directory
- nnmail-procmail-directory))
- "\\([^/]*\\)" nnmail-procmail-suffix "$")
+ (if (string-match (concat "^" (regexp-quote
+ (expand-file-name
+ (file-name-as-directory
+ nnmail-procmail-directory)))
+ "\\([^/]*\\)"
+ (regexp-quote nnmail-procmail-suffix) "$")
(expand-file-name file))
(let ((procmail-group (substring (expand-file-name file)
(match-beginning 1)
(defun nnmail-process-babyl-mail-format (func artnum-func)
(let ((case-fold-search t)
start message-id content-length do-search end)
- (goto-char (point-min))
(while (not (eobp))
+ (goto-char (point-min))
(re-search-forward
"\f\n0, *unseen,+\n\\(\\*\\*\\* EOOH \\*\\*\\*\n\\)?" nil t)
(goto-char (match-end 0))
(goto-char (match-beginning 0))))
;; Possibly wrong format?
(progn
- (pop-to-buffer (find-file-noselect nnmail-current-spool))
+ (pop-to-buffer (nnheader-find-file-noselect nnmail-current-spool))
(error "Error, unknown mail format! (Possibly corrupted.)"))
;; Carry on until the bitter end.
(while (not (eobp))
(forward-line 1)))
;; Possibly wrong format?
(progn
- (pop-to-buffer (find-file-noselect nnmail-current-spool))
+ (pop-to-buffer (nnheader-find-file-noselect nnmail-current-spool))
(error "Error, unknown mail format! (Possibly corrupted.)"))
;; Carry on until the bitter end.
(while (not (eobp))
(obuf (current-buffer))
(beg (point-min))
end group-art method regrepp)
- (if (and (sequencep methods) (= (length methods) 1))
+ (if (and (sequencep methods)
+ (= (length methods) 1))
;; If there is only just one group to put everything in, we
;; just return a list with just this one method in.
(setq group-art
(or (funcall nnmail-split-methods)
'("bogus"))
(error
- (message
+ (nnheader-message 5
"Error in `nnmail-split-methods'; using `bogus' mail group")
(sit-for 1)
'("bogus")))))
+ (setq split (remove-duplicates split :test 'equal))
;; The article may be "cross-posted" to `junk'. What
;; to do? Just remove the `junk' spec. Don't really
;; see anything else to do...
(defun nnmail-get-new-mail (method exit-func temp
&optional group spool-func)
"Read new incoming mail."
- ;; Nix out the previous split history.
- (unless group
- (setq nnmail-split-history nil))
(let* ((spools (nnmail-get-spool-files group))
(group-in group)
nnmail-current-spool incoming incomings spool)
(defun nnmail-write-region (start end filename &optional append visit lockname)
"Do a `write-region', and then set the file modes."
- ;; 1997/5/4 by MORIOKA Tomohiko <morioka@jaist.ac.jp>
(let ((coding-system-for-write nnmail-file-coding-system)
- ;; 1997/8/12 by MORIOKA Tomohiko
- ;; for XEmacs/mule.
(pathname-coding-system 'binary))
(write-region start end filename append visit lockname)
(set-file-modes filename nnmail-default-file-modes)))
", "))
(princ "\n")))))
+(defun nnmail-purge-split-history (group)
+ "Remove all instances of GROUP from `nnmail-split-history'."
+ (let ((history nnmail-split-history)
+ prev)
+ (while history
+ (setcar history (delete-if (lambda (e) (string= (car e) group))
+ (car history)))
+ (pop history))
+ (setq nnmail-split-history (delq nil nnmail-split-history))))
+
(defun nnmail-new-mail-p (group)
"Say whether GROUP has new mail."
(let ((his nnmail-split-history)
(substring inbox (match-end (string-match "^po:" inbox)))))
(pop3-movemail crashbox)))
+(defun nnmail-within-headers-p ()
+ "Check to see if point is within the headers of a unix mail message.
+Doesn't change point."
+ (let ((pos (point)))
+ (save-excursion
+ (and (nnmail-search-unix-mail-delim-backward)
+ (not (search-forward "\n\n" pos t))))))
+
(run-hooks 'nnmail-load-hook)
(provide 'nnmail)