;;; 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>
;; Keywords: news, mail
(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
;; Suggested by Erik Selberg <speed@cs.washington.edu>.
(defcustom nnmail-crosspost t
- "If non-nil, do crossposting if several split methods match the mail.
+ "*If non-nil, do crossposting if several split methods match the mail.
If nil, the first match found will be used."
:group 'nnmail-split
:type 'boolean)
;; Added by gord@enci.ucalgary.ca (Gordon Matzigkeit).
(defcustom nnmail-keep-last-article nil
- "If non-nil, nnmail will never delete/move a group's last article.
+ "*If non-nil, nnmail will never delete/move a group's last article.
It can be marked expirable, so it will be deleted when it is no longer last.
You may need to set this variable if other programs are putting
:type 'boolean)
(defcustom nnmail-use-long-file-names nil
- "If non-nil the mail backends will use long file and directory names.
+ "*If non-nil the mail backends will use long file and directory names.
If nil, groups like \"mail.misc\" will end up in directories like
\"mail/misc/\"."
:group 'nnmail-files
:type 'boolean)
(defcustom nnmail-default-file-modes 384
- "Set the mode bits of all new mail files to this integer."
+ "*Set the mode bits of all new mail files to this integer."
:group 'nnmail-files
:type 'integer)
(const never)))
(defcustom nnmail-expiry-wait-function nil
- "Variable that holds function to specify how old articles should be before they are expired.
+ "*Variable that holds function to specify how old articles should be before they are expired.
The function will be called with the name of the group that the
expiry is to be performed in, and it should return an integer that
says how many days an article can be stored before it is considered
(function :format "%v" nnmail-)))
(defcustom nnmail-cache-accepted-message-ids nil
- "If non-nil, put Message-IDs of Gcc'd articles into the duplicate cache."
+ "*If non-nil, put Message-IDs of Gcc'd articles into the duplicate cache."
:group 'nnmail
:type 'boolean)
(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 'file)
(defcustom nnmail-crash-box "~/.gnus-crash-box"
- "File where Gnus will store mail while processing it."
+ "*File where Gnus will store mail while processing it."
:group 'nnmail-files
:type 'file)
:type 'boolean)
(defcustom nnmail-delete-file-function 'delete-file
- "Function called to delete files in some mail backends."
+ "*Function called to delete files in some mail backends."
:group 'nnmail-files
:type 'function)
(if (string-match "windows-nt\\|emx" (format "%s" 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
;; Suggested by Erik Selberg <speed@cs.washington.edu>.
(defcustom nnmail-prepare-incoming-hook nil
- "Hook called before treating incoming mail.
+ "*Hook called before treating incoming mail.
The hook is run in a buffer with all the new, incoming mail."
:group 'nnmail-prepare
:type 'hook)
(defcustom nnmail-prepare-incoming-header-hook nil
- "Hook called narrowed to the headers of each message.
+ "*Hook called narrowed to the headers of each message.
This can be used to remove excessive spaces (and stuff like
that) from the headers before splitting and saving the messages."
:group 'nnmail-prepare
:type 'hook)
(defcustom nnmail-prepare-incoming-message-hook nil
- "Hook called narrowed to each message."
+ "*Hook called narrowed to each message."
:group 'nnmail-prepare
:type 'hook)
(defcustom nnmail-list-identifiers nil
- "Regexp that matches list identifiers to be removed.
+ "*Regexp that matches list identifiers to be removed.
This can also be a list of regexps."
:group 'nnmail-prepare
:type '(choice (const :tag "none" nil)
(repeat :value (".*") regexp)))
(defcustom nnmail-pre-get-new-mail-hook nil
- "Hook called just before starting to handle new incoming mail."
+ "*Hook called just before starting to handle new incoming mail."
:group 'nnmail-retrieve
:type 'hook)
(defcustom nnmail-post-get-new-mail-hook nil
- "Hook called just after finishing handling new incoming mail."
+ "*Hook called just after finishing handling new incoming mail."
:group 'nnmail-retrieve
:type 'hook)
(defcustom nnmail-split-hook nil
- "Hook called before deciding where to split an article.
+ "*Hook called before deciding where to split an article.
The functions in this hook are free to modify the buffer
contents in any way they choose -- the buffer contents are
discarded after running the split process."
:type 'integer)
(defcustom nnmail-split-fancy "mail.misc"
- "Incoming mail can be split according to this fancy variable.
+ "*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
(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)))
(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.")
group-assoc)))
group-assoc))
-;; 1997/8/12 by MORIOKA Tomohiko
(defvar nnmail-active-file-coding-system
'iso-8859-1
"*Coding system for active file.")
(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 (point-min))
(when (looking-at ">From ")
(replace-match "X-From-Line: ") )
- (run-hooks 'nnmail-prepare-incoming-header-hook)
+ (gnus-run-hooks 'nnmail-prepare-incoming-header-hook)
(goto-char (point-max))
;; Find the Message-ID header.
(save-excursion
;; having a (possibly) faulty header.
(beginning-of-line)
(insert "X-"))
- (run-hooks 'nnmail-prepare-incoming-header-hook)
+ (gnus-run-hooks 'nnmail-prepare-incoming-header-hook)
;; Find the end of this article.
(goto-char (point-max))
(widen)
(insert "Original-")))
(forward-line 1)
(insert "Message-ID: " (setq message-id (nnmail-message-id)) "\n"))
- (run-hooks 'nnmail-prepare-incoming-header-hook)
+ (gnus-run-hooks 'nnmail-prepare-incoming-header-hook)
;; Find the end of this article.
(goto-char (point-max))
(widen)
(nnheader-insert-file-contents incoming)
(unless (zerop (buffer-size))
(goto-char (point-min))
- (save-excursion (run-hooks 'nnmail-prepare-incoming-hook))
+ (save-excursion (gnus-run-hooks 'nnmail-prepare-incoming-hook))
;; Handle both babyl, MMDF and unix mail formats, since movemail will
;; use the former when fetching from a mailbox, the latter when
;; fetching from a file.
(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
(while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t)
(replace-match " " t t))
;; Allow washing.
- (run-hooks 'nnmail-split-hook)
+ (gnus-run-hooks 'nnmail-split-hook)
(if (and (symbolp nnmail-split-methods)
(fboundp nnmail-split-methods))
(let ((split
"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...
(message-fetch-field header))))
(defun nnmail-check-duplication (message-id func artnum-func)
- (run-hooks 'nnmail-prepare-incoming-message-hook)
+ (gnus-run-hooks 'nnmail-prepare-incoming-message-hook)
;; If this is a duplicate message, then we do not save it.
(let* ((duplication (nnmail-cache-id-exists-p message-id))
(case-fold-search t)
;; We first activate all the groups.
(nnmail-activate method)
;; Allow the user to hook.
- (run-hooks 'nnmail-pre-get-new-mail-hook)
+ (gnus-run-hooks 'nnmail-pre-get-new-mail-hook)
;; Open the message-id cache.
(nnmail-cache-open)
;; The we go through all the existing spool files and split the
(nnmail-get-value "%s-active-file" method))
(when exit-func
(funcall exit-func))
- (run-hooks 'nnmail-read-incoming-hook)
+ (gnus-run-hooks 'nnmail-read-incoming-hook)
(nnheader-message 3 "%s: Reading incoming mail...done" method))
;; Close the message-id cache.
(nnmail-cache-close)
;; Allow the user to hook.
- (run-hooks 'nnmail-post-get-new-mail-hook)
+ (gnus-run-hooks 'nnmail-post-get-new-mail-hook)
;; Delete all the temporary files.
(while incomings
(setq incoming (pop incomings))
(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)))