IndiMail has the ability to call a custom program instead of qmail-local(8) or qmail-remote(8). This is done by defining the environment variable QMAILLOCAL or QMAILREMOTE. qmail-remote(8) can use the environment variable OUTGOINGIP to set the IP address of the local interface when making outgoing connections. By writing a simple script and setting QMAILREMOTE environment variable pointing to this script, one can randomly chose an IP address from the control file
/var/indimail/control/outgoingip
The script below also allows you to define multiple outgoing IP addresses for a single host. e.g. you can create the control file to send out mails from multiple IPs only for the domain hotmail.com
/var/indimail/control/outgoingip.hotmail.com
Let us name the below script balance_outgoing
% su
# echo "/var/indimail/bin/balance_outgoing" > /service/qmail-send.25/variables/QMAILREMOTE
# svc -d /service/qmail-send.25
# svc -u /service/qmail-send.25
# exit
%
Finally the balance_outgoing script can be placed with execute bit in /var/indimail/bin
#!/bin/sh
# This scripts expects qmail-remote arguments on command line
# argv0 - qmail-remote
# argv1 - host (host)
# argv2 - sender (sender)
# argv3 - qqeh (qmail queue extra header)
# argv4 - size
# argv5 .. argvn - recipients
#
#
host=$1
sender=$2
qqeh=$3
size=$4
shift 4
cd /var/indimail
cd /var/indimail
if [ " $CONTROLDIR" = " " ] ; then
FN=/var/indimail/control/filterargs
else
FN=$CONTROLDIR/filterargs
fi
if [ -n "$SPAMFILTER" -o -n "$FILTERARGS" -o -f $FN ] ; then
# execute spawn-filter if you have filters defined for remote/local deliveries
PROG="bin/spawn-filter"
else
PROG="bin/qmail-remote"
fi
if [ " $CONTROLDIR" = " " ] ; then
if [ -f /var/indimail/control/outgoingip.$host ] ; then
IP=(`cat /var/indimail/control/outgoingip.$host`)
elif [ -f /var/indimail/control/outgoingip ] ; then
IP=(`cat /var/indimail/control/outgoingip`)
else
exec -a qmail-remote $PROG "$host" "$sender" "$qqeh" $size $*
fi
else
if [ -f $CONTROLDIR/outgoingip.$host ] ; then
IP=(`cat $CONTROLDIR/outgoingip.$host`)
elif [ -f $CONTROLDIR/outgoingip ] ; then
IP=(`cat $CONTROLDIR/outgoingip`)
else
exec -a qmail-remote $PROG "$host" "$sender" "$qqeh" $size $*
fi
fi
IP_COUNT=${#IP[*]}
if [ $IP_COUNT -gt 1 ] ; then
i=`expr $RANDOM % $IP_COUNT`
export OUTGOINGIP=${IP[$i]}
fi
exec -a qmail-remote $PROG "$host" "$sender" "$qqeh" $size $*
No comments:
Post a Comment