Hi all,

I am trying to setup a simple script, which will be used to check the mail
size and count the emails per user (the script does only mail size checks
at the moment). I am currently checking the logic with a simple script and
I have followed the http://www.postfix.org/FILTER_README.html, the advanced
option to avoid loops. When putting script at pickup I had loops.

I don't understand what I am doing wrong and I get from postfix:

postfix/qmgr[2389]: 8A792402D3: from=<r...@ohub.com>, size=269, nrcpt=1
(queue active)
Mar  6 10:55:25 ohub-dev postfix/smtp[9895]: 8A792402D3: lost connection
with localhost[::1] while receiving the initial server greeting
Mar  6 10:55:25 ohub-dev postfix/smtp[9895]: 8A792402D3: to=<gu...@ohub.com>,
orig_to=<guest>, relay=localhost[127.0.0.1]:10025, delay=0.06,
delays=0.04/0.01/0.01/0, dsn=4.4.2, status=deferred (lost connection with
localhost[127.0.0.1] while receiving the initial server greeting)

The above email is sent with the command: echo "test" | mail -s "test" guest

I have postfix 2.9.6-2 and I have done the following:

/etc/postfix/main.cf:
content_filter = scan:localhost:10025
receive_override_options = no_address_mappings

/etc/postfix/master.cf
# Filter
scan    unix  -       -       n       -       10      smtp
        -o smtp_send_xforward_command=yes
        -o disable_mime_output_conversion=yes
        -o smtp_generic_maps=
#
localhost:10025 inet  n       n       n       -       10      spawn
        user=filter argv=/usr/bin/filter localhost 10026
#
localhost:10026 inet  n       -       n       -       10      smtpd
        -o content_filter=
        -o receive_override_options=no_unknown_recipient_checks,no_
header_body_checks,no_milters
        -o smtpd_helo_restrictions=
        -o smtpd_client_restrictions=
        -o smtpd_sender_restrictions=


The script I am using is working ok when invoked from sender access and
defined at master.cf as:
filter    unix  -       n       n       -       10      pipe
        flags=Rq user=filter argv=/usr/bin/mail_filter.php ${sender} --
${recipient} ${size}

I understand that now I am using spawn and seems to behave differently from
pipe mechanism but I have not been able to understand what is required in
the script so as to process email and then send it back to localhost:10026
for further delivery.

The script (further down) is using sendmail to return the mail back and the
returned email as I understand is received from pickup. It seems also that
with spawn I don't have the ${sender} -- ${recipient} ${size} macros
available even when defined at options as below:

localhost:10025 inet  n       n       n       -       10      spawn
        user=filter argv=/usr/bin/filter ${sender} -- ${recipient} ${size}
localhost 10026


I will greatly appreciate any help as I am stuck on how to proceed and did
not manage to find any pointers.

Alex


Script:
#!/bin/bash
# Simple mail size filtering script

INSPECT_DIR=/var/spool/filter
SENDMAIL="/usr/sbin/sendmail -G -i -f " # NEVER NEVER NEVER use "-t" here.

# VIP Account username and message size limit:
VIP_USER="vip"
VIP_LIMIT=5000000 # bytes

# User Message size limit
USER_LIMIT=100000 # bytes

# Return message to sender
message='Quota exceeded'

# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_NOPERM=77
EX_UNAVAILABLE=69

# Find out the ammount of arguments passed
args=("$@")
length=$#

# Find out the sender
SENDER=${args[0]}

# Extract recipients
RECIPIENTS=${args[@]:2:$(($length - 3))}

# Extract message size (last argument)
MESSAGE_SIZE=${args[@]:(-1)}

# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15

# Set time stamp
timestamp=`date +"%d-%m-%Y %H:%M"`

# Start processing.
cd $INSPECT_DIR || {
    echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }

cat >in.$$ || {
    echo Cannot save mail to file; exit $EX_TEMPFAIL; }

# Check who is the sender and apply policy accordingly
USER=`/bin/echo $SENDER | awk -F "@" '{print$1}'`
echo "USER: " $USER >> /var/log/filter

case $USER in
    $VIP_USER) # Limit VIP account
        if [ $MESSAGE_SIZE -gt $VIP_LIMIT ]; then
            echo "${message}";
            echo "$timestamp: Message size exceeded from " $SENDER  >>
/var/log/filter;
            exit $EX_NOPERM;
        else
            echo "Business Mail size OK" >> /var/log/filter;
            $SENDMAIL $SENDER $RECIPIENTS <in.$$
        fi
        ;;
    *) # Limit User Mails
        if [ $MESSAGE_SIZE -gt $USER_LIMIT ]; then
            echo "${message}";
            echo "$timestamp: Message size exceeded from " $SENDER  >>
/var/log/filter;
            exit $EX_NOPERM;
        else
            echo "User Mail size OK" >> /var/log/filter;
            $SENDMAIL $SENDER $RECIPIENTS <in.$$
        fi
        ;;
esac
exit $?

Reply via email to