The sendmail program provides the ability to use
queue directories other than the one listed in the configuration
file's QueueDirectory (Q) option (see Section 34.8.48).
Other queue directories can be used to
solve an assortment of problems. One example is a site
being down for an extended period.
When a lot of mail is sent to such a site,
messages collect in the queue and eventually start
timing out.
By moving those messages to a separate
queue directory and processing it at a later time (when that site
is back up), unnecessary bouncing of mail can be prevented.
Note that the QueueDirectory (Q) option is not safe.
If its value is changed by anyone other
than root, sendmail runs as an ordinary user.
If a site is down, messages to that site can collect in the queue. If the site is expected to be down for a protracted period of time, those queued messages will begin to time out and bounce. To prevent them from bouncing, you can move them to a separate queue directory. Later, when the down site comes back up, you can process that separate queue.
To move the affected messages to a separate queue, you may use a Bourne shell script like the following:
#!/bin/sh
set -u
QUEUE=/var/spool/mqueue
NEWQ=/var/spool/newqueue
if [ ! -d $QUEUE ]
then
echo "${QUEUE}: Does not exist or is not a directory"
exit 1
fi
if [ ! -d $NEWQ ]
then
mkdir -p $NEWQ
if [ $? -ne 0 ]
then
echo "${NEWQ}: Can't create"
exit 2
fi
fi
find ${QUEUE} -type f -name qf* -print |\
while read QF
do
IDENT=`echo $QF | sed -e "s,^${QUEUE}/qf,,"`
grep "^R" ${QUEUE}/qf${IDENT}
echo -n "move ${IDENT}? (y/n) "
read answer
case $answer in
[nN]*) continue;;
*) ;;
esac
mv ${QUEUE}/*${IDENT} $NEWQ
if [ $? -ne 0 ]
then
echo "Move failed"
exit 3
else
echo "Move succeeded"
fi
done
/usr/lib/sendmail -OQueueDirectory=${NEWQ} -bpThis script creates a new queue directory, $NEWQ, if it doesn't
exist. It then prints the recipient list for each qf file
in the queue (the grep(1) in $QUEUE) and asks whether you want to
move that file. If you answer yes, all the files that compose
the queued message are moved into $NEWQ.
After all the messages have been moved, the contents of $NEWQ are
printed using the QueueDirectory (Q) option:
%/usr/lib/sendmail -OQueueDirectory=${NEWQ} -bp
When the down site comes back up at a later time, the messages that have been saved in $NEWQ can be delivered by running the following command by hand:
%/usr/lib/sendmail -OQueueDirectory=/var/spool/newqueue -OTimeout.queuereturn=99d -q
The -oTimeout.queuereturn=99d causes the time to live in
the queue to be extended to 99 days.
This prevents the held mail in ${NEWQ} from wrongly
bouncing when you try to deliver it.