[comp.mail.sendmail] mail alert script

maart@cs.vu.nl (Maarten Litmaath) (05/09/89)

dhesi@bsu-cs.bsu.edu (Rahul Dhesi) writes:
\You might want to set csh's "mail" variable like this:

\     set mail=(30 /usr/spool/mail/$USER)

\which will cause csh to check for mail every 30 seconds.

... but only if it's about to print the prompt! :-(
This scheme is called `synchronous' mail checking.
There are 2 `better' ways to check for mail:

	1) `asynchronous' checking - at login time start up a daemon, which
	   periodically monitors the mailbox, to print a message to the
	   terminal as soon as it discovers a mailbox size > 0.
	   Disadvantage: one has to start an extra process, which either sits
	   idle most of the time, or is constantly busy checking an empty
	   mailbox.
	2) a mail alerter, ala MMDF's rcvalert(1) - instead of putting
	   incoming messages straight into the mailbox, they're piped into a
	   notification program, which decides what to do with the message,
	   e.g. deleting it, forwarding it, notifying the recipient or simply
	   putting it into the mailbox.
	   This scheme is obviously the best: simply let the mail delivery
	   program start up the filter mentioned in ~/.maildelivery (MMDF) or
	   ~/.mailrc (MAIL), which will terminate as soon as the message has
	   been `delivered'.
	   However, nowadays the problem is mail getting handled by another
	   machine (typically a file server) than the one onto which you're
	   logged in.
	   A solution is to let the filter find out where you really are (IF
	   you're logged in somewhere at all).

A general problem with mail notification programs is: how to alert the user?
rcvalert's method is to print a message (with a beep) to the terminal ONCE.
But what if the user was having a coffee break and some other program's output
caused the message to scroll off the screen? That's not what I call `mail
notification'. On the other hand you don't want a continuous stream of beeps
either, lest the other people in the room will perform free fall experiments
with your terminal. The solution is to re-alert the user after, say, 3 minutes
have passed without the mailbox (modification/access time) having changed.

Below is an MMDF-style mail notification executable shell script. To enable it
put something like the following into ~/.maildelivery (see maildelivery(5)):

*	-	|	R	/usr/solo/maart/etc/rcvalarm

The relevant portion of the script is carried out in the background by a
subshell, in order to let the wait(2) by the invoker return `immediately'.
To stop `rcvalarm' from nagging about unread mail, the user can create a file
`~/.ok'; this action is preferably put into an alias or a shell script. Once
spotted, the file will be removed, to re-enable notification of (future) mail.

If somebody's interested: I've got a `daemon' version as well.

Questions & remarks to:
				Maarten Litmaath @ VU Amsterdam:
				maart@cs.vu.nl, mcvax!botter!maart

----------8<----------8<----------8<----------8<----------8<----------
#! /bin/sh
# @(#)rcvalarm 3.2 89/01/10 Maarten Litmaath
#
# rcvalarm is started up at maildelivery (see maildelivery(5))
# it checks if the user is logged in on any of the machines specified in
# $HOME/.rcvalarm, or all machines if this file is empty or does not exist
# it keeps alerting the user until:
#	- the access/modify time of the mailbox has been changed
#	- the file $HOME/.ok has been created, which will be removed

(
cd
user=`whoami`
alarm=`echo aaaaaaaaaa | tr a '\07'`
message=$alarm"You have mail @ `hostname`."
tmp=/tmp/rcvalarm.$$
ok=.ok

umask 077

set - `ls -l mailbox`
mod="$5$6$7"
set - `ls -lu mailbox`
acc="$5$6$7"

[ -f .rcvalarm ] && machines=`cat .rcvalarm`

while :
do
	/bin/rm -f $tmp
	exec 3> $tmp 4< $tmp
	/bin/rm $tmp
	exec 5> $tmp 6< $tmp
	/bin/rm $tmp
	success=0

	rusers $machines | grep "\<$user\>" >&3

	# why does piping into the `while read' loops fail?

	while read session <&4
	do
		machine=`echo "$session" | sed 's/[ .].*//'`

		/usr/ucb/rsh $machine -n who | grep "^$user\>" >&5

		while read slot <&6
		do
			set - `ls -lu mailbox`
			a="$5$6$7"
			set - `ls -l mailbox`
			m="$5$6$7"

			[ "$a" != "$acc" -o "$m" != "$mod" -o -f $ok ] && {
				/bin/rm -f $ok
				exit 0
			}

			set - $slot

			error=`/usr/ucb/rsh $machine -n \
				sh -c "'echo $message 2>&1 > /dev/$2'" 2>&1`

			[ x"$error" = x ] && success=1
		done
	done

	[ $success = 1 ] || exit 0

	sleep 180
done
) &
----------8<----------8<----------8<----------8<----------8<----------
-- 
 "If it isn't aesthetically pleasing, |Maarten Litmaath @ VU Amsterdam:
  it's probably wrong." (jim@bilpin)  |maart@cs.vu.nl, mcvax!botter!maart

maart@cs.vu.nl (Maarten Litmaath) (05/09/89)

maart@cs.vu.nl (Maarten Litmaath) writes:
\...	   This scheme is obviously the best: simply let the mail delivery
\	   program start up the filter mentioned in ~/.maildelivery (MMDF) or
\	   ~/.mailrc (MAIL), [...]
           ^^^^^^^^^
Make that ~/.forward.
-- 
 "If it isn't aesthetically pleasing, |Maarten Litmaath @ VU Amsterdam:
  it's probably wrong." (jim@bilpin)  |maart@cs.vu.nl, mcvax!botter!maart

epmcmanus@csvax1.cs.tcd.ie (05/12/89)

In article <2462@solo9.cs.vu.nl>, maart@cs.vu.nl (Maarten Litmaath) writes:
> A general problem with mail notification programs is: how to alert the user?
> rcvalert's method is to print a message (with a beep) to the terminal ONCE.
> But what if the user was having a coffee break and some other program's output
> caused the message to scroll off the screen?

Actually I think that it is adequate to notify just once, provided shell
notification is also enabled.  That way there is immediate notification when
you are actually there, and a guarantee of later notification if you miss
that.

I mention this because I have a C program that performs much the same
function of remote notification as Maarten's script.  But it just grabs the
output of rwho, and if the user is not mentioned does nothing else.  This
is important in an environment where circulars sent to many users are
common.  You want as few commands as possible to be executed for such a
message; otherwise the system will be swamped with .maildelivery processes.

If anyone is interested in this program I would be happy to mail it to
them.
--
Eamonn McManus		emcmanus@cs.tcd.ie	uunet!mcvax!cs.tcd.ie!emcmanus