Mercurial > emacs
changeset 100342:160964e45356
(pmail-perm-variables): Don't call pmail-parse-file-inboxes.
(pmail-parse-file-inboxes): Function deleted.
(pmail-get-new-mail-1): Function merged into pmail-get-new-mail.
(pmail-get-new-mail-2): Renamed to pmail-get-new-mail-1.
(pmail-get-new-mail-filter-spam): Call rmail-spam-filter, not
pmail-spam-filter.
(pmail-convert-to-babyl-format): Function deleted.
(pmail-nuke-pinhead-header): Function deleted.
(pmail-reply): Parsing headers in mbox format. Call
rmail-dont-reply-to instead of pmail-dont-reply-to.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Wed, 10 Dec 2008 21:50:23 +0000 |
parents | 8b18fa1b635f |
children | 4c206e002e5f |
files | lisp/mail/pmail.el |
diffstat | 1 files changed, 51 insertions(+), 437 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/mail/pmail.el Wed Dec 10 21:48:55 2008 +0000 +++ b/lisp/mail/pmail.el Wed Dec 10 21:50:23 2008 +0000 @@ -240,7 +240,7 @@ (declare-function mail-position-on-field "sendmail" (field &optional soft)) (declare-function mail-text-start "sendmail" ()) -(declare-function pmail-dont-reply-to "mail-utils" (destinations)) +(declare-function rmail-dont-reply-to "mail-utils" (destinations)) (declare-function pmail-update-summary "pmailsum" (&rest ignore)) (defun pmail-probe (prog) @@ -1331,7 +1331,6 @@ (make-local-variable 'pmail-message-vector) (make-local-variable 'pmail-msgref-vector) (make-local-variable 'pmail-inbox-list) - (setq pmail-inbox-list (pmail-parse-file-inboxes)) ;; Provide default set of inboxes for primary mail file ~/PMAIL. (and (null pmail-inbox-list) (or (equal buffer-file-name (expand-file-name pmail-file-name)) @@ -1406,23 +1405,6 @@ (pmail-show-message-maybe pmail-total-messages) (run-hooks 'pmail-mode-hook)))) -;; Return a list of files from this buffer's Mail: option. -;; Does not assume that messages have been parsed. -;; Just returns nil if buffer does not look like Babyl format. -(defun pmail-parse-file-inboxes () - (save-excursion - (save-restriction - (widen) - (goto-char 1) - (cond ((looking-at "BABYL OPTIONS:") - (search-forward "\n\^_" nil 'move) - (narrow-to-region 1 (point)) - (goto-char 1) - (when (search-forward "\nMail:" nil t) - (narrow-to-region (point) (progn (end-of-line) (point))) - (goto-char (point-min)) - (mail-parse-comma-list))))))) - (defun pmail-expunge-and-save () "Expunge and save PMAIL file." (interactive) @@ -1492,7 +1474,6 @@ (interactive "FRun pmail on PMAIL file: ") (pmail filename)) - ;; This used to scan subdirectories recursively, but someone pointed out ;; that if the user wants that, person can put all the files in one dir. ;; And the recursive scan was slow. So I took it out. @@ -1510,30 +1491,28 @@ (defun pmail-list-to-menu (menu-name l action &optional full-name) (let ((menu (make-sparse-keymap menu-name))) (mapc - (function (lambda (item) - (let (command) - (if (consp item) - (progn - (setq command - (pmail-list-to-menu (car item) (cdr item) - action - (if full-name - (concat full-name "/" - (car item)) - (car item)))) - (setq name (car item))) - (progn - (setq name item) - (setq command - (list 'lambda () '(interactive) - (list action - (expand-file-name - (if full-name - (concat full-name "/" item) - item) - pmail-secondary-file-directory)))))) - (define-key menu (vector (intern name)) - (cons name command))))) + (lambda (item) + (let (command) + (if (consp item) + (setq command + (pmail-list-to-menu + (car item) (cdr item) action + (if full-name + (concat full-name "/" + (car item)) + (car item))) + name (car item)) + (setq name item) + (setq command + (list 'lambda () '(interactive) + (list action + (expand-file-name + (if full-name + (concat full-name "/" item) + item) + pmail-secondary-file-directory))))) + (define-key menu (vector (intern name)) + (cons name command)))) (reverse l)) menu)) @@ -1563,7 +1542,7 @@ ;;;; *** Pmail input *** -(declare-function pmail-spam-filter "pmail-spam-filter" (msg)) +(declare-function rmail-spam-filter "rmail-spam-filter" (msg)) (declare-function pmail-summary-goto-msg "pmailsum" (&optional n nowarn skip-pmail)) (declare-function pmail-summary-mark-undeleted "pmailsum" (n)) (declare-function pmail-summary-mark-deleted "pmailsum" (&optional n undel)) @@ -1606,28 +1585,19 @@ ;; Get rid of all undo records for this buffer. (or (eq buffer-undo-list t) (setq buffer-undo-list nil)) - (pmail-get-new-mail-1 file-name)) - -(defun pmail-get-new-mail-1 (file-name) - "Continuation of 'pmail-get-new-mail. Sort of a procedural -abstraction kind of thing to manage the code size. Return t if -new messages are found, nil otherwise." - (let ((all-files (if file-name (list file-name) - pmail-inbox-list)) + (let ((all-files (if file-name (list file-name) pmail-inbox-list)) (pmail-enable-multibyte (default-value 'enable-multibyte-characters)) found) (unwind-protect (when all-files (let ((opoint (point)) - (delete-files ()) ;; If buffer has not changed yet, and has not been ;; saved yet, don't replace the old backup file now. (make-backup-files (and make-backup-files (buffer-modified-p))) (buffer-read-only nil) - ;; Don't make undo records for what we do in getting - ;; mail. + ;; Don't make undo records while getting mail. (buffer-undo-list t) - success files file-last-names) + delete-files success files file-last-names) ;; Pull files off all-files onto files as long as there is ;; no name conflict. A conflict happens when two inbox ;; file names have the same last component. @@ -1643,17 +1613,18 @@ (goto-char (point-max)) (skip-chars-backward " \t\n") ; just in case of brain damage (delete-region (point) (point-max)) ; caused by require-final-newline - (setq found (pmail-get-new-mail-2 file-name files delete-files)))) + (setq found (pmail-get-new-mail-1 file-name files delete-files)))) found) ;; Don't leave the buffer screwed up if we get a disk-full error. (or found (pmail-show-message-maybe)))) -(defun pmail-get-new-mail-2 (file-name files delete-files) +(defun pmail-get-new-mail-1 (file-name files delete-files) "Return t if new messages are detected without error, nil otherwise." (save-excursion (save-restriction (let ((new-messages 0) - (spam-filter-p (and (featurep 'pmail-spam-filter) pmail-use-spam-filter)) + (spam-filter-p (and (featurep 'rmail-spam-filter) + pmail-use-spam-filter)) blurb result success suffix) (narrow-to-region (point) (point)) ;; Read in the contents of the inbox files, renaming them as @@ -1735,7 +1706,7 @@ (setq pmail-deleted-vector (make-string (1+ pmail-total-messages) ?\ )) (while (<= rsf-scanned-message-number pmail-total-messages) (progn - (if (not (pmail-spam-filter rsf-scanned-message-number)) + (if (not (rmail-spam-filter rsf-scanned-message-number)) (progn (setq rsf-number-of-spam (1+ rsf-number-of-spam)))) (setq rsf-scanned-message-number (1+ rsf-scanned-message-number)))) (if (> rsf-number-of-spam 0) @@ -1974,11 +1945,12 @@ (insert name ": " value "\n")) (defun pmail-add-mbox-headers () - "Validate the RFC2822 format for the new messages. Point, at -entry should be looking at the first new message. An error will -be thrown if the new messages are not RCC2822 compliant. Lastly, -unless one already exists, add an Rmail attribute header to the -new messages in the region. Return the number of new messages." + "Validate the RFC2822 format for the new messages. +Point should be at the first new message. +An error is signalled if the new messages are not RFC2822 +compliant. +Unless an Rmail attribute header already exists, add it to the +new messages. Return the number of new messages." (save-excursion (let ((count 0) (start (point)) @@ -2004,356 +1976,6 @@ (forward-char -5)) (setq start (point)))) count))) - -;; the pmail-break-forwarded-messages feature is not implemented -(defun pmail-convert-to-babyl-format () - (let ((count 0) start - (case-fold-search nil) - (buffer-undo-list t) - (invalid-input-resync - (function (lambda () - (message "Invalid Babyl format in inbox!") - (sit-for 3) - ;; Try to get back in sync with a real message. - (if (re-search-forward - (concat pmail-mmdf-delim1 "\\|^From") nil t) - (beginning-of-line) - (goto-char (point-max))))))) - (goto-char (point-min)) - (save-restriction - (while (not (eobp)) - (setq start (point)) - (cond ((looking-at "BABYL OPTIONS:") ;Babyl header - (if (search-forward "\n\^_" nil t) - ;; If we find the proper terminator, delete through there. - (delete-region (point-min) (point)) - (funcall invalid-input-resync) - (delete-region (point-min) (point)))) - ;; Babyl format message - ((looking-at "\^L") - (or (search-forward "\n\^_" nil t) - (funcall invalid-input-resync)) - (setq count (1+ count)) - ;; Make sure there is no extra white space after the ^_ - ;; at the end of the message. - ;; Narrowing will make sure that whatever follows the junk - ;; will be treated properly. - (delete-region (point) - (save-excursion - (skip-chars-forward " \t\n") - (point))) - ;; The following let* form was wrapped in a `save-excursion' - ;; which in one case caused infinite looping, see: - ;; http://lists.gnu.org/archive/html/emacs-devel/2008-01/msg00968.html - ;; Removing that form leaves `point' at the end of the - ;; region decoded by `pmail-decode-region' which should - ;; be correct. - (let* ((header-end - (progn - (save-excursion - (goto-char start) - (forward-line 1) - (if (looking-at "0") - (forward-line 1) - (forward-line 2)) - (save-restriction - (narrow-to-region (point) (point-max)) - (rfc822-goto-eoh) - (point))))) - (case-fold-search t) - (quoted-printable-header-field-end - (save-excursion - (goto-char start) - (re-search-forward - "^content-transfer-encoding:\\(\n?[\t ]\\)*quoted-printable\\(\n?[\t ]\\)*" - header-end t))) - (base64-header-field-end - (save-excursion - (goto-char start) - ;; Don't try to decode non-text data. - (and (re-search-forward - "^content-type:\\(\n?[\t ]\\)\\(text\\|message\\)/" - header-end t) - (goto-char start) - (re-search-forward - "^content-transfer-encoding:\\(\n?[\t ]\\)*base64\\(\n?[\t ]\\)*" - header-end t))))) - (if quoted-printable-header-field-end - (save-excursion - (unless - (mail-unquote-printable-region header-end (point) nil t t) - (message "Malformed MIME quoted-printable message")) - ;; Change "quoted-printable" to "8bit", - ;; to reflect the decoding we just did. - (goto-char quoted-printable-header-field-end) - (delete-region (point) (search-backward ":")) - (insert ": 8bit"))) - (if base64-header-field-end - (save-excursion - (when - (condition-case nil - (progn - (base64-decode-region (1+ header-end) - (- (point) 2)) - t) - (error nil)) - ;; Change "base64" to "8bit", to reflect the - ;; decoding we just did. - (goto-char base64-header-field-end) - (delete-region (point) (search-backward ":")) - (insert ": 8bit")))) - (setq last-coding-system-used nil) - (or pmail-enable-mime - (not pmail-enable-multibyte) - (let ((mime-charset - (if (and pmail-decode-mime-charset - (save-excursion - (goto-char start) - (search-forward "\n\n" nil t) - (let ((case-fold-search t)) - (re-search-backward - pmail-mime-charset-pattern - start t)))) - (intern (downcase (match-string 1)))))) - (pmail-decode-region start (point) mime-charset)))) - ;; Add an X-Coding-System: header if we don't have one. - (save-excursion - (goto-char start) - (forward-line 1) - (if (looking-at "0") - (forward-line 1) - (forward-line 2)) - (or (save-restriction - (narrow-to-region (point) (point-max)) - (rfc822-goto-eoh) - (goto-char (point-min)) - (re-search-forward "^X-Coding-System:" nil t)) - (insert "X-Coding-System: " - (symbol-name last-coding-system-used) - "\n"))) - (narrow-to-region (point) (point-max)) - (and (= 0 (% count 10)) - (message "Converting to Babyl format...%d" count))) - ;;*** MMDF format - ((let ((case-fold-search t)) - (looking-at pmail-mmdf-delim1)) - (let ((case-fold-search t)) - (replace-match "\^L\n0, unseen,,\n*** EOOH ***\n") - (re-search-forward pmail-mmdf-delim2 nil t) - (replace-match "\^_")) - (save-excursion - (save-restriction - (narrow-to-region start (1- (point))) - (goto-char (point-min)) - (while (search-forward "\n\^_" nil t) ; single char "\^_" - (replace-match "\n^_")))) ; 2 chars: "^" and "_" - (setq last-coding-system-used nil) - (or pmail-enable-mime - (not pmail-enable-multibyte) - (decode-coding-region start (point) 'undecided)) - (save-excursion - (goto-char start) - (forward-line 3) - (insert "X-Coding-System: " - (symbol-name last-coding-system-used) - "\n")) - (narrow-to-region (point) (point-max)) - (setq count (1+ count)) - (and (= 0 (% count 10)) - (message "Converting to Babyl format...%d" count))) - ;;*** Mail format - ((looking-at "^From ") - (insert "\^L\n0, unseen,,\n*** EOOH ***\n") - (pmail-nuke-pinhead-header) - ;; If this message has a Content-Length field, - ;; skip to the end of the contents. - (let* ((header-end (save-excursion - (and (re-search-forward "\n\n" nil t) - (1- (point))))) - (case-fold-search t) - (quoted-printable-header-field-end - (save-excursion - (re-search-forward - "^content-transfer-encoding:\\(\n?[\t ]\\)*quoted-printable\\(\n?[\t ]\\)*" - header-end t))) - (base64-header-field-end - (and - ;; Don't decode non-text data. - (save-excursion - (re-search-forward - "^content-type:\\(\n?[\t ]\\)\\(text\\|message\\)/" - header-end t)) - (save-excursion - (re-search-forward - "^content-transfer-encoding:\\(\n?[\t ]\\)*base64\\(\n?[\t ]\\)*" - header-end t)))) - (size - ;; Get the numeric value from the Content-Length field. - (save-excursion - ;; Back up to end of prev line, - ;; in case the Content-Length field comes first. - (forward-char -1) - (and (search-forward "\ncontent-length: " - header-end t) - (let ((beg (point)) - (eol (progn (end-of-line) (point)))) - (string-to-number (buffer-substring beg eol))))))) - (and size - (if (and (natnump size) - (<= (+ header-end size) (point-max)) - ;; Make sure this would put us at a position - ;; that we could continue from. - (save-excursion - (goto-char (+ header-end size)) - (skip-chars-forward "\n") - (or (eobp) - (and (looking-at "BABYL OPTIONS:") - (search-forward "\n\^_" nil t)) - (and (looking-at "\^L") - (search-forward "\n\^_" nil t)) - (let ((case-fold-search t)) - (looking-at pmail-mmdf-delim1)) - (looking-at "From ")))) - (goto-char (+ header-end size)) - (message "Ignoring invalid Content-Length field") - (sit-for 1 0 t))) - (if (let ((case-fold-search nil)) - (re-search-forward - (concat "^[\^_]?\\(" - pmail-unix-mail-delimiter - "\\|" - pmail-mmdf-delim1 "\\|" - "^BABYL OPTIONS:\\|" - "\^L\n[01],\\)") nil t)) - (goto-char (match-beginning 1)) - (goto-char (point-max))) - (setq count (1+ count)) - (if quoted-printable-header-field-end - (save-excursion - (unless - (mail-unquote-printable-region header-end (point) nil t t) - (message "Malformed MIME quoted-printable message")) - ;; Change "quoted-printable" to "8bit", - ;; to reflect the decoding we just did. - (goto-char quoted-printable-header-field-end) - (delete-region (point) (search-backward ":")) - (insert ": 8bit"))) - (if base64-header-field-end - (save-excursion - (when - (condition-case nil - (progn - (base64-decode-region - (1+ header-end) - (save-excursion - ;; Prevent base64-decode-region - ;; from removing newline characters. - (skip-chars-backward "\n\t ") - (point))) - t) - (error nil)) - ;; Change "base64" to "8bit", to reflect the - ;; decoding we just did. - (goto-char base64-header-field-end) - (delete-region (point) (search-backward ":")) - (insert ": 8bit"))))) - - (save-excursion - (save-restriction - (narrow-to-region start (point)) - (goto-char (point-min)) - (while (search-forward "\n\^_" nil t) ; single char - (replace-match "\n^_")))) ; 2 chars: "^" and "_" - ;; This is for malformed messages that don't end in newline. - ;; There shouldn't be any, but some users say occasionally - ;; there are some. - (or (bolp) (newline)) - (insert ?\^_) - (setq last-coding-system-used nil) - (or pmail-enable-mime - (not pmail-enable-multibyte) - (let ((mime-charset - (if (and pmail-decode-mime-charset - (save-excursion - (goto-char start) - (search-forward "\n\n" nil t) - (let ((case-fold-search t)) - (re-search-backward - pmail-mime-charset-pattern - start t)))) - (intern (downcase (match-string 1)))))) - (pmail-decode-region start (point) mime-charset))) - (save-excursion - (goto-char start) - (forward-line 3) - (insert "X-Coding-System: " - (symbol-name last-coding-system-used) - "\n")) - (narrow-to-region (point) (point-max)) - (and (= 0 (% count 10)) - (message "Converting to Babyl format...%d" count))) - ;; - ;; This kludge is because some versions of sendmail.el - ;; insert an extra newline at the beginning that shouldn't - ;; be there. sendmail.el has been fixed, but old versions - ;; may still be in use. -- rms, 7 May 1993. - ((eolp) (delete-char 1)) - (t (error "Cannot convert to babyl format"))))) - (setq buffer-undo-list nil) - count)) - -;; Delete the "From ..." line, creating various other headers with -;; information from it if they don't already exist. Now puts the -;; original line into a mail-from: header line for debugging and for -;; use by the pmail-output function. -(defun pmail-nuke-pinhead-header () - (save-excursion - (save-restriction - (let ((start (point)) - (end (progn - (condition-case () - (search-forward "\n\n") - (error - (goto-char (point-max)) - (insert "\n\n"))) - (point))) - has-from has-date) - (narrow-to-region start end) - (let ((case-fold-search t)) - (goto-char start) - (setq has-from (search-forward "\nFrom:" nil t)) - (goto-char start) - (setq has-date (and (search-forward "\nDate:" nil t) (point))) - (goto-char start)) - (let ((case-fold-search nil)) - (if (re-search-forward (concat "^" pmail-unix-mail-delimiter) nil t) - (replace-match - (concat - "Mail-from: \\&" - ;; Keep and reformat the date if we don't - ;; have a Date: field. - (if has-date - "" - (concat - "Date: \\2, \\4 \\3 \\9 \\5 " - - ;; The timezone could be matched by group 7 or group 10. - ;; If neither of them matched, assume EST, since only - ;; Easterners would be so sloppy. - ;; It's a shame the substitution can't use "\\10". - (cond - ((/= (match-beginning 7) (match-end 7)) "\\7") - ((/= (match-beginning 10) (match-end 10)) - (buffer-substring (match-beginning 10) - (match-end 10))) - (t "EST")) - "\n")) - ;; Keep and reformat the sender if we don't - ;; have a From: field. - (if has-from - "" - "From: \\1\n")) - t))))))) ;;;; *** Pmail Message Formatting and Header Manipulation *** @@ -3560,25 +3182,18 @@ (msgnum pmail-current-message)) (save-excursion (save-restriction - (if pmail-enable-mime + (widen) + (if pmail-buffers-swapped-p (narrow-to-region (goto-char (point-min)) - (if (search-forward "\n\n" nil 'move) - (1+ (match-beginning 0)) - (point))) - (widen) + (search-forward "\n\n" nil 'move)) (goto-char (pmail-msgbeg pmail-current-message)) (forward-line 1) - (if (= (following-char) ?0) - (narrow-to-region - (progn (forward-line 2) - (point)) - (progn (search-forward "\n\n" (pmail-msgend pmail-current-message) - 'move) - (point))) - (narrow-to-region (point) - (progn (search-forward "\n*** EOOH ***\n") - (beginning-of-line) (point))))) + (narrow-to-region + (point) + (search-forward "\n\n" + (pmail-msgend pmail-current-message) + 'move))) (setq from (mail-fetch-field "from") reply-to (or (mail-fetch-field "mail-reply-to" nil t) (mail-fetch-field "reply-to" nil t) @@ -3597,12 +3212,11 @@ ) (unless just-sender (if (mail-fetch-field "mail-followup-to" nil t) - ;; If this header field is present, use it instead of the To and CC fields. + ;; If this header field is present, use it instead of + ;; the To and CC fields. (setq to (mail-fetch-field "mail-followup-to" nil t)) (setq cc (or (mail-fetch-field "cc" nil t) "") - to (or (mail-fetch-field "to" nil t) "")))) - - )) + to (or (mail-fetch-field "to" nil t) "")))))) ;; Merge the resent-to and resent-cc into the to and cc. (if (and resent-to (not (equal resent-to ""))) @@ -3631,7 +3245,7 @@ ;; Remove unwanted names from reply-to, since Mail-Followup-To ;; header causes all the names in it to wind up in reply-to, not ;; in cc. But if what's left is an empty list, use the original. - (let* ((reply-to-list (pmail-dont-reply-to reply-to))) + (let* ((reply-to-list (rmail-dont-reply-to reply-to))) (if (string= reply-to-list "") reply-to reply-to-list)) subject (pmail-make-in-reply-to-field from date message-id) @@ -3639,7 +3253,7 @@ nil ;; mail-strip-quoted-names is NOT necessary for pmail-dont-reply-to ;; to do its job. - (let* ((cc-list (pmail-dont-reply-to + (let* ((cc-list (rmail-dont-reply-to (mail-strip-quoted-names (if (null cc) to (concat to ", " cc)))))) (if (string= cc-list "") nil cc-list)))