dzzr@beta.UUCP (Douglas J Roberts) (02/03/88)
A while back I snarfed something called pop-mail.el from this group. It
turned out to be fairly useful: from within an EMACS shell, a
background process would check once a minute to see if new mail had
arrived. If so, rmail would be invoked and a new rmail buffer would
pop up. I use pop-mail.el when I remote login to my office Sun from
home.
At the office, however, I felt it would be more useful to have a mail
tool that behaved more like Sun's mailtool: ie. when new mail arrived,
have the console beep and pop up an icon indicating new mail.
That's what sun-mail.el does: if new mail arrives for the logged-on
user (Suns only) , a new iconic cshell process is started. I use Sun's
"mail has arrived" icon, the one with a mail box with a letter
sticking out. After you get your mail with rmail, the iconic shell
process is killed off.
This code runs on Sun3/50s, 3/75s 3/110s, and 3/260s. I make no claim
for any other hardware.
Enjoy!
--Doug
----------------------------------------------------------------------------
;; Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
;; Read the GNU COPYING file for the full details.
;; 9/17/87 wolfgang@mgm.mit.edu (was pop-mail.el)
;; 12/8/87 dzzr@lanl.gov (now sun-mail.el)
(defvar sun-mail t "*If t pop up a mail icon when new mail arrives.
Files listed in rmail-primary-inbox-list are watched")
(defvar number-beeps 2)
(defvar beep-counter 0)
(defvar mail-process nil)
(defvar checked 'no)
;;
;; NOTE: YOU MUST CHANGE THIS PATH TO POINT TO YOUR OWN ICON!!
;;
(defvar icon-path "/u/a5/roberts/icons/mail.icon")
(defun display-time-filter (proc string)
"A filter that replaces the 'display-time-filter' filter.
This filter pops up a mail icon 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 sun-mail
(let (
(list rmail-primary-inbox-list)
file
)
(while list
(progn ;; #1 The case where there is mail
(while (and
(not (eq checked 'yes))
(check-file list))
(setq checked 'yes)
(if (or (not mail-process)
(not (eq (process-status mail-process) 'run)))
(progn ;; Fire up an icon if the background process is not already running
(message "New mail has arrived...")
(setq mail-process
(start-process "new"
nil
"shelltool"
"-WL" ""
"-Wl" "If you see this you have new mail..."
"-Wp" "500" "67"
"-Ws" "650" "824"
"-WP" "788" "0"
"-Wi" "-WI"
icon-path
))
)
);; end mail process if
(while (< beep-counter number-beeps)
(ding)
(sit-for 2)
(setq beep-counter (+ beep-counter 1))
)
(setq beep-counter 0)
);; end of while check-file
) ;; end of progn #1
(setq list (cdr list))
);; end of while list
(progn ;; #2 The case where there was no mail
;;;
;;; KILL OFF THE MAIL ICON PROCESS IF NO MORE MAIL
;;;
(cond (
(and
(not (check-file rmail-primary-inbox-list))
(not (check-file (cdr rmail-primary-inbox-list)))
mail-process
(eq (process-status mail-process) 'run))
(setq checked 'no)
(kill-process mail-process)
))
);; end progn #2
);; end of let
))
;;;
;;; CHECKS TO SEE IF A FILE IS EMPTY
;;;
(defun check-file (file-list)
"This method checks to see if the file has contents.
Returns t if the file is not empty."
(if (and (not (null file-list))
(file-exists-p
(setq file (expand-file-name
(substitute-in-file-name (car file-list)))))
(/= 0 (nth 7 (file-attributes file)))) ;size != 0
t
nil))
===============================================================
Douglas Roberts
Los Alamos National Laboratory
(505)667-4569
dzzr@lanl.gov
===============================================================
--
---------------------------------------------------------------
Doug Roberts
dzzr@lanl.gov
---------------------------------------------------------------