[comp.emacs] popmail 18.52

grunwald@m.cs.uiuc.edu (10/04/88)

Here's a version of popmail.el that works with 18.52. Rmail changed slightly
in that version. Also, this works even if you don't call your rmail buffer
``RMAIL''.


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;									     ;;
;;	File:     popmail.el						     ;;
;;	Author:   Wolfgang Rupprecht					     ;;
;;	Created:  Thu Sep 17 14:55:45 EDT 1987				     ;;
;;	Contents: pop up a mail buffer whenever new mail arrives  	     ;;
;;									     ;;
;;	Copyright (c) 1987 Wolfgang Rupprecht.				     ;;
;; 	Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.        ;;
;;									     ;;
;;	$Log$								     ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; GNU Emacs and this file popmail.el, are distributed in the hope
;; that they will be useful, but WITHOUT ANY WARRANTY.  No author or
;; distributor accepts responsibility to anyone for the consequences of
;; using them or for whether they serve any particular purpose or work at
;; all, unless he says so in writing.  Refer to the GNU Emacs General
;; Public License for full details.

;; Everyone is granted permission to copy, modify and redistribute GNU
;; Emacs and popmail.el, but only under the conditions described in the
;; GNU Emacs General Public License.  A copy of this license is supposed
;; to have been given to you along with GNU Emacs so you can know your
;; rights and responsibilities.  It should be in a file named COPYING.
;; Among other things, the copyright notice and this notice must be
;; preserved on all copies.

;; Instructions:
;; Insert the following (minus the leading ';; ') into your .emacs file:
;;
;; (let ((process-connection-type nil))	; try not to hog a pty for this.
;;    (display-time))
;; 
;; ;; don't let two pop-mails be active at once.
;; (if (file-locked-p (expand-file-name "~/RMAIL"))
;;      nil
;;    (load-library "popmail")		; patches time filter
;;    (setq pop-mail t))
(provide 'pop-mail)

(defvar pop-mail nil "*If t display new mail in a pop up mail buffer.
	files listed in rmail-primary-inbox-list are watched")
(defvar pop-mail-ding t "*If non-nil ding bell, when new mail pops up.")

(defun display-time-filter (proc string)
  "A filter that replaces the 'display-time-filter' filter.
This filter pops up a mail window whenever new mail arrives "
  ;; Desired data can't need more than the last 30 chars,
  ;; so save time by flushing the rest.
  ;; This way, if we have many different times all collected at once,
  ;; we can discard all but the last few very fast.
  (if (> (length string) 30)
      (setq string (substring string -30)))
  ;; Now discard all but the very last one.
  (while (and (> (length string) 4)
	      (string-match "[0-9]+:[0-9][0-9].." string 4))
    (setq string (substring string (match-beginning 0))))
  (if (string-match "[^0-9][0-9]+:" string)
      (setq string (substring string 0 (1+ (match-beginning 0)))))
  ;; Append the date if desired.
  (if display-time-day-and-date
      (setq string (concat (substring (current-time-string) 0 11) string)))
  ;; Install the new time for display.
  (setq display-time-string string)
  ;; Force redisplay of all buffers' mode lines to be considered.
  (save-excursion (set-buffer (other-buffer)))
  (set-buffer-modified-p (buffer-modified-p))
  ;; Do redisplay right now, if no input pending.
  (sit-for 0)
  (if pop-mail
      (let ((mail-inbox-list
	     (list
		   rmail-primary-inbox-list
		   "~/mbox"
		   (concat rmail-spool-directory
			   (if (getenv "LOGNAME")
			       "$LOGNAME" "$USER"))))
	    file)
	(while mail-inbox-list
	  (if 
	      (and (stringp (car mail-inbox-list))
		   (file-exists-p
		     (setq file (expand-file-name
				  (substitute-in-file-name (car mail-inbox-list)))))
		   (/= 0 (nth 7 (file-attributes file)))) ;size != 0
	      (progn
		(save-excursion (rmail))
		(find-file rmail-file-name)
		(setq mail-inbox-list nil)	; once only
		(if pop-mail-ding
		    (ding)))
	    (setq mail-inbox-list (cdr mail-inbox-list)))))))