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[]:10025, delay=0.06,
delays=0.04/0.01/0.01/0, dsn=4.4.2, status=deferred (lost connection with
localhost[] 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:

content_filter = scan:localhost:10025
receive_override_options = no_address_mappings

# 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_
        -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.


# Simple mail size filtering script

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

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

# User Message size limit
USER_LIMIT=100000 # bytes

# Return message to sender
message='Quota exceeded'

# Exit codes from <sysexits.h>

# Find out the ammount of arguments passed

# Find out the sender

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

# Extract message size (last argument)

# 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  >>
            exit $EX_NOPERM;
            echo "Business Mail size OK" >> /var/log/filter;
            $SENDMAIL $SENDER $RECIPIENTS <in.$$
    *) # Limit User Mails
        if [ $MESSAGE_SIZE -gt $USER_LIMIT ]; then
            echo "${message}";
            echo "$timestamp: Message size exceeded from " $SENDER  >>
            exit $EX_NOPERM;
            echo "User Mail size OK" >> /var/log/filter;
            $SENDMAIL $SENDER $RECIPIENTS <in.$$
exit $?

Reply via email to