Update.
[elisp/gnus.git-] / lisp / nnmail.el
index c12f099..e761868 100644 (file)
@@ -1,7 +1,7 @@
 ;;; nnmail.el --- mail support functions for the Gnus mail backends
 ;; 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.
@@ -33,7 +33,9 @@
 (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."
@@ -216,7 +218,7 @@ several files - eg. \".spool[0-9]*\"."
   :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.
@@ -341,7 +343,7 @@ messages will be shown to indicate the current status."
   "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).
@@ -405,7 +407,7 @@ Example:
   :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
@@ -539,7 +541,7 @@ parameter.  It should return nil, `warn' or `delete'."
   "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))))))
@@ -589,12 +591,12 @@ parameter.  It should return nil, `warn' or `delete'."
                      (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
@@ -634,14 +636,14 @@ parameter.  It should return nil, `warn' or `delete'."
                             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.
@@ -650,8 +652,8 @@ parameter.  It should return nil, `warn' or `delete'."
                      (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))
@@ -665,7 +667,7 @@ parameter.  It should return nil, `warn' or `delete'."
                                     (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))
@@ -715,10 +717,12 @@ return nil if FILE is a spool file or the procmail group for which it
 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)))
+                               "\\([^/]*\\)"
+                               nnmail-procmail-suffix "$")
                        (expand-file-name file))
          (let ((procmail-group (substring (expand-file-name file)
                                           (match-beginning 1)
@@ -873,7 +877,7 @@ is a spool.  If not using procmail, return GROUP."
                  (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))
@@ -960,7 +964,7 @@ is a spool.  If not using procmail, return GROUP."
                  (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))
@@ -1065,7 +1069,18 @@ FUNC will be called with the group name to determine the article number."
        (goto-char (point-min))
        (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t)
          (replace-match " " t t))
+       ;; Nuke pathologically long headers.  Since Gnus applies
+       ;; pathologically complex regexps to the buffer, lines
+       ;; that are looong will take longer than the Universe's
+       ;; existence to process.
+       (goto-char (point-min))
+       (while (not (eobp))
+         (end-of-line)
+         (if (> (current-column) 1024)
+             (gnus-delete-line)
+           (forward-line 1)))
        ;; Allow washing.
+       (goto-char (point-min))
        (run-hooks 'nnmail-split-hook)
        (if (and (symbolp nnmail-split-methods)
                 (fboundp nnmail-split-methods))
@@ -1077,11 +1092,11 @@ FUNC will be called with the group name to determine the article number."
                       (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))
+             (setq split (gnus-remove-duplicates split))
              ;; The article may be "cross-posted" to `junk'.  What
              ;; to do?  Just remove the `junk' spec.  Don't really
              ;; see anything else to do...
@@ -1743,8 +1758,8 @@ If ARGS, PROMPT is used as an argument to `format'."
   (let ((history nnmail-split-history)
        prev)
     (while history
-      (setcar history (delete-if (lambda (e) (string= (car e) group))
-                                (car history)))
+      (setcar history (gnus-delete-if (lambda (e) (string= (car e) group))
+                                     (car history)))
       (pop history))
     (setq nnmail-split-history (delq nil nnmail-split-history))))
 
@@ -1767,6 +1782,14 @@ If ARGS, PROMPT is used as an argument to `format'."
          (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)