This script will send all system emails located in /var/spool/mail/, preventing this folder from growing, and alert the concerned team of problems, most time related to bad scripts started via crontabs.
Environment variables
[root@nim]/root/scripts/bin# cat .env
# global variables for all scripts export binpath=/root/scripts/bin export sn=`basename $0 | cut -d. -f1` export HOSTNAME=`/usr/bin/hostname -s` export logpath=/root/scripts/logs export logname=$logpath/$sn.log export configfile=$binpath/$sn.cfg
Config file, for each system user associate an email adress. The master_destination will alert if a mailbox exists on the server (in /var/spool/mail/) and is not defined in .cfg file
[root@nim]/root/scripts/bin# cat redirect_mail.cfg
# 1° colonne = user-name # 2° colonne = addresse e-mail ou "ignore" # master_destination myemail2@emailserver.lu root myemail1@emailserver.lu oracle oracle@emailserver.lu,oracle-grp@emailserver.lu test ignore
The script will forward all system mail to a destination defined in .cfg file
[root@nim]/root/scripts/bin# cat redirect_mail.sh
#!/usr/bin/ksh93
#@(#) send mail to user assigned mailbox
#############################################
# Check in /var/spool/mail and send mail to the appropriate person
# and purge the mailbox
# version 1.0 16-02-2017 manu
#############################################
dir=`dirname $0`
. $dir/.env
dest="$mail_system"
mail_addressbook=$configfile
#------------------------------------------------
send_mail ()
{
set -x
mail_address=$1
flen=$(ls -l $file | awk '{print $5}')
if [ $flen -gt 1048576 ]
then
  # this is a big mail and will be split in 1MB part
  split -b 1m $file ${file}_split_
  ctr=0
  nb=$(ls ${file}_split_* | wc -l);(( nb = $nb + 0 ))
  for pj in $(ls ${file}_split_* )
  do
    (( ctr = $ctr + 1 ))
    uuencode $pj $pj.log | mail -s "Mail from user $file on $(hostname) part ${ctr}/${nb}" ${mail_address}
    rm $pj
  done
else
  # This is a thin mail and will be directly send
  uuencode $file $file.log | mail -s "Mail from user $file on $(hostname)" ${mail_address}
fi
shift 1
mail_list=$*
}
#############################################
# main
#############################################
main()
{
set -x
cd /var/spool/mail
ls -l
for file in $(ls)
do
  mail_list=$(cat $mail_addressbook | grep -v "^#" | grep "^$file " | grep -v ignore | cut -f2- -d" ")
  if [ ! -s $file ]
  then
    # file has a size 0 and will be deleted
    rm $file
    continue
  fi
  if [ "$mail_list" ]
  then
    echo $mail_list | while [ "$mail_list" ]
    do
      send_mail $mail_list
    done
    [ "$1" = "PURGE" ] && rm $file
  else
    # address not found: send request to deal with the user
    ignore_me=$(cat $mail_addressbook | grep -v "^#" |  grep "^$file " | grep ignore)
    if [ ! "$ignore_me" ]
    then
      # Address not found, send mail to configure or ignore user
      mail_list=$(cat $mail_addressbook | grep "master_destination" | tail -1 | sed 's/#//g' | awk '{print $2}')
      echo "Please configure user $file on $(hostname) in $mail_addressbook" | mail -s "Unknown mail address $file on $(hostname)" ${mail_list}
    fi
  fi
done
# transfert queued mail stored in /var/spool/mqueue try : mailq
# sendmail -q
}
main "PURGE" > $logname 2>&1
Now you can add this script in the root crontab using crontab -e:
[root@nim]/root/scripts/bin# crontab -l 5 10 * * * /root/scripts/redirect_mail.sh >/dev/null 2>&1