AW: [Exim] Problem with Envelope-to header

Top Page
Delete this message
Reply to this message
Author: Lumpp, Wolfgang
Date:  
To: exim-users
Subject: AW: [Exim] Problem with Envelope-to header
Hi,
I'm looking for the To: address.
But in case of mailing-lists in the To: header I find the address of the
mailing-list. The realy address which I could use for the command, is the
envelope-to.
Following is the script, which I use.
The problematic parts are prefixed with "PROBLEM"

In the part, where the mail goes back to exim, is the main problem.
Exim deliver the mail to the To: header, but in case of mailing-lists I
produce a mail-loop
Regards
Wolfgang


#!/bin/sh

###################################################################
# Inflex - Bidirectional Email scanner
#
# Inflex-exim 0.1.5-E 
#
# Inflex for Exim by Justin "jus" Stanford - designed for use with
# the Exim MTA (www.exim.org) version 3.xx (tested with 3.12).
# 
# E-mail any questions or suggestions to jus@??? 
# regarding inflex-exim. Please read INSTALL to correctly set up
# inflex-exim for use on your machine.
# 
# Inflex-exim was tested on a FreeBSD 3.4-STABLE mail server running
# Exim 3.12, performing both local delivery and relaying, using
# Network Associate's McAfee uvscan (/usr/ports/security/uvscan for 
# FreeBSD users). Inflex-exim should run equally as well on Linux or
# other unix type systems.
#
#
# Inflex is copyright to Mr Paul L Daniels.
#
# You are free to use and distribute Inflex as per the GPL licence
# agreement.
#
# All alterations and addtions should be sent to Paul L Daniels
# at jdaniels@???
#
# This program was created with the assistance of looking at
# AmaVis.  It's purpose is to provide a one-stop scanning
# point for all emails, both inbound and outbound, irrespective
# of the method required for the final delivery
#
# Written by Paul/Jack L Daniels
# 07/01/2000 [heheh, y2k compliant ;)]
#
#
# CHANGES -
#
#     0.1.5-E - 11/05/2000
#         .Inflex-exim, based on Inflex 0.1.5.
#         .Due to current limitations in exim, the recipient of a
#          blocked email will not be notified, only the sender.
#
#    0.1.5 - 04/04/2000
#        .Removed '7' out of the Minflex flags
#        .Provided both relaying and non-relaying version of .cf
#        .Updated FAQ with some useful hints re McAfee
#        .Inserted filename block specifically for the I LOVE YOU
virus
#        .
#    0.1.4 - 17/01/2000
#        .Fixed up reported blocked directory
#        .Replaced hard-coded sendmail cmd line with a more
#          generic one.
#        .Added Ability to turn on/off various sections of scanner
#          ie, file type, file name, antivirus
#        .Ability to turn on/off sending of various proponents of 
#          the messages to various people when a block is performed
#        .Minor typos in sender,receiver messages
#        .X-header addition
#
#    0.1.3 - 13/01/2000
#        .Made blocked emails get moved to a blocked$$ directory
#        .Added Exim mailout support
#
#    0.1.2 - 10/01/2000
#        .Changed version format, to match that of typical
#          LINUX based systems.
#        .Added support for McAfee and Sophos AntiVirus packages
#        .Cleaned up logging 
#        .changed directory naming to inflex$$ rather than av$$
#               .Made common apps such as find, file, grep become vars
#                 in the script so as to make things easier for
#                 alteration later on.
#        .Altered AntiVirus sections to report either a success
#          or failure rather than requiring later in the script
#          to decipher the dozens of possible exit codes from
#                 all of the various AV apps.
#
#########################################################################


#
# Our systemwide INFLEX Log file
#
logfile=/var/log/inflexlog

#
#
# Options to turn on/off various bits of Inflex scanning
#
# Use either y [for yes] or n [for no]
#
scanforvirus=y
scanforfiletype=y
scanforfilename=y
scanfortext=y

#
# Options for delivery of email to various people whom
# might want to hear that their email has been blocked
#

# Receiver msg's disabled by default due to current limitations in exim
# which disable this feature

deliverSenderAVmsg=y
deliverReceiverAVmsg=n
deliverSenderBLmsg=y
deliverReceiverBLmsg=n
deliverRootmsg=y

#
# Options for composition of actual outgoing email
#
# Unless you have formail running this option will not work and neither
# will inflex-exim. Only enable it if you are sure it is working and have
# specified the correct path to it above
#
appendXheader=y
Xheader="X-scanner: scanned by Virus-scanner (Mail is clean!)"


#
# Get our temporary directory name... from the process ID
# which is about as good as any random number
#
pid="inflex$$"
tmpdir=/var/tmp/${pid}
blockdir=/var/tmp/Blocked$$

#
# Our mail-specific logfiles
#
locallog=${tmpdir}/logfile
badfileslog=${tmpdir}/badfileslog
fsavlog=${tmpdir}/fsavlog
envtest=${tmpdir}/envtest
#
# Our message files
#
sendermsg=${tmpdir}/sendermsg
recvmsg=${tmpdir}/recvmsg
blockmsg=${tmpdir}/blockmsg

#
# setup our commonly used files
#
test=/usr/bin/test
mail=/usr/bin/mail
grep=/usr/bin/grep
file=/usr/bin/file
find=/usr/bin/find
touch=/usr/bin/touch
metamail=/usr/bin/metamail
formail=/usr/bin/formail


#
# Our MAIL PROGRAMS
#
exim=/usr/local/software/exim/bin/exim

#
# Our Virus Scanners
#
# Uncomment and specify the correct path for the scanner you wish to use.
# NA's McAfee uvscan is default, inflex-exim 0.1.5-E has been tested and
# verified with engine 3.x and 4.x.
#
#sophos=/usr/local/bin/sweep
mcafee=/usr/local/uvscan/uvscan
#fsav=/usr/local/fsav/fsav


#
# Setup who sent and who was supposed to receive all this
#
headto=$4
sender=$3
envelope=$2
hostname=$1

#
# Who's going to receive all the bounced reports
#
administrator=root

#
# Make the directory
#
mkdir -p ${tmpdir}
mkdir ${tmpdir}/unpacked

#
# Take standard input and create a file called RECEIVEDMAIL
#
cat > ${tmpdir}/receivedmail
cat ${tmpdir}/receivedmail | ${formail} -f -x Envelope-to: > ${envtest}
if [ -s ${envtest} ];
then
PROBLEM    receiver=${envelope}
else
    receiver=${headto}
fi


#
# Start a log file, with the basic information of who/etc
#
echo "" >> ${locallog}
echo "${pid} from:${sender} to:${receiver}" >> ${locallog}

#
# Setup the Metamil unpacking directory, else it'll unpack to /tmp
#
METAMAIL_TMPDIR=${tmpdir}/unpacked
export METAMAIL_TMPDIR

#
# Unpack the newly arrived email
#
${metamail} -r -q -x -w ${tmpdir}/receivedmail


#
# SCAN for files we don't really want people sending/receiving
#
#
# First up, get a list of all the files we have in this metamail package
#
${touch} ${badfileslog}
${find} ${tmpdir} -name '*' > ${tmpdir}/filelist1

#
# Now we run a magic-number file test on each of the files
# this way we can get around people who have tried renaming
# the files.
#
# The output from this is a full list of the files, and their
# TYPE as per the /etc/magic file
#
${file} -f ${tmpdir}/filelist1 > ${tmpdir}/fileresults



if [ "a${scanforfiletype}" != "an" ]; 
then
    #
    # Now we can search through the resultant file/type list as
    # generated from above, and we output the results to the
    # BADFILES list.
    #
    ${grep} "MS-DOS executable" ${tmpdir}/fileresults >> ${badfileslog}
    #${grep} "PC bitmap data" ${tmpdir}/fileresults >> ${badfileslog}
    ${grep} "AVI" ${tmpdir}/fileresults >> ${badfileslog}
    ${grep} "MPEG" ${tmpdir}/fileresults >> ${badfileslog}
    ${grep} "WAVE" ${tmpdir}/fileresults >> ${badfileslog}
else
    echo "Type scanning off." >> ${locallog}
    fi

    
    

if [ "a${scanforfilename}" != "an" ];
then
    #
    # Next we also scan for actual file names
    # This is VERY useful for if there is a know file that contains
    # a virus, but alas, our virus scanner can't pick it up 
    #
${find} ${tmpdir} -name 'links.vbs' >> ${badfileslog}
${find} ${tmpdir} -name '*.mp3' >> ${badfileslog}
${find} ${tmpdir} -name '*.vbs' >> ${badfileslog}
${find} ${tmpdir} -name '*.com' >> ${badfileslog}
${find} ${tmpdir} -name '*.bat' >> ${badfileslog}
${find} ${tmpdir} -name '*.exe' >> ${badfileslog}
${find} ${tmpdir} -name '*.wsh' >> ${badfileslog}
${find} ${tmpdir} -name 'LOVE-LETTER-FOR-YOU*' >> ${badfileslog}
else
    echo "Name scanning off." >> ${locallog}
    fi

    
    
#
# If any files tested positive in the above magic/name tests
# then the badfileslist will be bigger than 0-bytes
# Hence if so, set the scan status to say so!
#
if [ -s ${badfileslog} ];
then
    badfilescan=1
else
    badfilescan=0
fi





if [ "a${scanforvirus}" != "an" ];
then
#
# SCAN those files for viruses!
#
# Blocking out emails by method of file type is good for 
# controlling the abuse of resources on your network.  However
# we also should be wise enough to take this opportunity whilst
# we have a "foriegn" file in our network to SCAN it for a VIRUS!
#
# NOTE - We're using FPROT Antivirus here.... because I own
# a copy of it.  You could alter the following line to suit your
# own preferred AntiVirus scanner software, but I find FProt quite
# good, it also has a nice simple update utility which can be run
# via CRON.
#
# --archive, unpack archived files, eg zip, lha, exe-zip 
# --list,    display what we are scanning
# --dumb,    don't stop and ask questions, as the server cant answer
# --auto,    decide how to handle a virused file 
#
# FPROT Exit codes ---
#  0 - all clear
#  1 - fsav failed for some reason, perhaps a broken .def file
#  3 - virus was found.
#
if [ "a${fsav}" != "a" ]
then

    
    #
    # FPROT
    #
    ${fsav} --archive --list --dumb --auto ${tmpdir}/unpacked/* >
${fsavlog} 2>&1
    fsavresult=$?
    if ${test} ${fsavresult} -eq 3
    then
        detectedvirus=1
    else
        detectedvirus=0
    fi
fi


    #
    # SOPHOS
    #


if [ "a${sophos}" != "a" ]
then
     ${sophos} -nb -f -all -rec -ss -sc ${tmpdir}/unpacked > ${fsavlog}
2>&1
    fsavresult=$?
    if ${test} ${fsavresult} -ne 0
    then
        detectedvirus=1
    else
        detectedvirus=0
    fi
fi



    #
    # McAfee / NAI - UVScan
    #
if [ "a${mcafee}" != "a" ]
then
     ${mcafee} --secure -rv --summary ${tmpdir}/unpacked > ${fsavlog}
2>&1
    fsavresult=$?
    if ${test} ${fsavresult} -eq 13
    then
        detectedvirus=1
    else
        detectedvirus=0
        fi
    fi


else
    echo "Virus scanning off." >> ${fsavlog}
    detectedvirus=0    
    fi

    
#
#
# Now process the results of our above scans and tests.
# Now process the results of our above scans and tests.
#
#
# return to our start path (good manners)
#
cd ${tmpdir}



if [ "a${deliverRootmsg}" != "an" ];
then
    #
    # Test to see if we came up with a bad email due
    # to a BAD FILE [as apposed to a virused file]
    #
    if ${test} ${badfilescan} -eq 1 -o ${detectedvirus} -eq 1
    then


        #
        # Create and send an email to INFLEX's operator
        #
        echo "Inflex Sent notification to ${sender} and ${receiver}"

> ${blockmsg}

          echo "The attached mail has been BLOCKED" >> ${blockmsg}
          echo "The mail has been stored as ${blockdir}" >>
${blockmsg}
          echo "" >> ${blockmsg}
          echo "AntiVirus Results..." >> ${blockmsg}
          cat ${tmpdir}/fsavlog >> ${blockmsg}
          echo "" >> ${blockmsg}
          echo "Badfiles Scan Results" >> ${blockmsg}
          cat ${badfileslog} >> ${blockmsg}
          echo "" >> ${blockmsg}
          cat ${locallog} >> ${blockmsg}
          echo "" >> ${blockmsg}
          echo "END OF MESSAGE." >> ${blockmsg}

        
        ${mail} -s "BLOCKED DELIVERY" ${administrator} < ${blockmsg}
        fi


    fi




#
# Now, because we're blocking both viruses and bad files, we
# should let the users know -which- one it was, else we'll
# have a flurry of users panicing that their email contains
# viruses, when in fact they probably just sent a BMP file
#

    #
    # Responses for VIRUSES
    #
if ${test} ${detectedvirus} -eq 1
then
echo "Mail blocked due to VIRUS" >> ${locallog}



    if [ "a${deliverSenderAVmsg}" != "an" ];
    then
    #
    # Message to the sender
    #
echo "                 BLOCKED DELIVERY OF YOUR EMAIL TO ${receiver}" >
${sendermsg}
echo "" >> ${sendermsg}
echo "Our email scanner has detected a VIRUS in your email" >> ${sendermsg}
echo "Your email has been stopped." >> ${sendermsg} # The intended recipient
will receive a notification of this message." >> ${sendermsg}
echo "" >> ${sendermsg}
echo "The virus scanner revealed..." >> ${sendermsg}
cat ${fsavlog} >> ${sendermsg}
echo "" >> ${sendermsg}
echo "End." >> ${sendermsg}
${mail} -s "BLOCKED DELIVERY OF EMAIL TO ${receiver}" ${sender} <
${sendermsg}
    fi

    
    
    if [ "a${deliverReceiverAVmsg}" != "an" ];
    then
    #
    # Message to the intended receiver
    #
echo "                 BLOCKED DELIVERY OF EMAIL FROM ${sender}" >
${recvmsg}
echo "" >> ${recvmsg}
echo "Our email scanner has detected a VIRUS in an email destined for you."

>> ${recvmsg}

echo "This email has been stopped. The sender will receive a notification
of this message." >> ${recvmsg}
echo "" >> ${recvmsg}
echo "The virus scanner revealed..." >> ${recvmsg}
cat ${fsavlog} >> ${recvmsg}
echo "" >> ${recvmsg}
echo "End." >> ${recvmsg}

${mail} -s "BLOCKED DELIVERY OF EMAIL FROM ${sender}" ${receiver} <
${recvmsg}
    fi
fi


    
    


if ${test} ${badfilescan} -eq 1
then
echo "Mail blocked due to BAD FILE" >> ${locallog}


    if [ "a${deliverSenderBLmsg}" != "an" ];
    then
    #
    # Message to the sender
    #
echo "                 BLOCKED DELIVERY OF YOUR EMAIL TO ${receiver}" >
${sendermsg}
echo "" >> ${sendermsg}
echo "Our email scanner has detected a file TYPE which we are not" >>
${sendermsg}
echo "permitting through our systems. These namely include movies,
executables and large pictures." >> ${sendermsg}
echo "Your email has been stopped." >> ${sendermsg} # The intended recipient
will receive a notification of this message." >> ${sendermsg}
echo "" >> ${sendermsg}
echo "The files that were blocked are..." >> ${sendermsg}
cat ${badfileslog} >> ${sendermsg}
echo "" >> ${sendermsg}
echo "End." >> ${sendermsg}


${mail} -s "BLOCKED DELIVERY OF EMAIL TO ${receiver}" ${sender} <
${sendermsg}
    fi

    
    
    if [ "a${deliverReceiverBLmsg}" != "an" ];
    then
    #
    # Message to the intended receiver
    #
echo "                 BLOCKED DELIVERY OF EMAIL FROM ${sender}" >
${recvmsg}
echo "" >> ${recvmsg}
echo "Our email scanner has detected a file TYPE which we are not" >>
${recvmsg}
echo "permitting through our systems. " >>${recvmsg}
echo "" >>${recvmsg}
echo "These namely include movies, executables and large pictures." >>
${recvmsg}
echo "Your email has been stopped.  The intended sender will receive a
notification of this message." >> ${recvmsg}
echo "" >> ${recvmsg}
echo "The files that were blocked are..." >> ${recvmsg}
cat ${badfileslog} >> ${recvmsg}
echo "" >> ${recvmsg}
echo "End." >> ${recvmsg}
${mail} -s "BLOCKED DELIVERY OF EMAIL FROM ${sender}" ${receiver} <
${recvmsg}
    fi

    
fi




#
# If nothing really happened and all went well through this whole scanning
process
# We can then proceed to send off the email as per normal.
#

#
# Store our scanning results...
#
echo "Non-PassableFile status is: ${badfilescan}" >> ${locallog}
echo "AntiVirus status is: ${detectedvirus}" >> ${locallog}
echo "Bad files details..." >> ${locallog}
cat ${badfileslog} >> ${locallog}
echo "" >> ${locallog}
echo "AntiVirus details..." >> ${locallog}
cat ${fsavlog} >> ${locallog}
echo "" >> ${locallog}
echo "completed scanning process for ${pid}" >> ${locallog}
echo "Non-PassableFile status is: ${badfilescan}" >> ${locallog}
echo "AntiVirus status is: ${detectedvirus}" >> ${locallog}

#
# Now that our process is complete, we write the entire local log to the
# main log file
#
cat ${locallog} >> ${logfile}

#
# Some basic house keeping... if the file was all okay, we remove it
# else we leave it there for the administrator to "check out"
#
if ${test} \
    ${badfilescan} -eq 0 \
    -a ${detectedvirus} -eq 0
then
#
# Now that all is well and we're happy with the way things are
# we can send off the email to its required destination.
#


    #
    # does the user want a custom X-header.
    #
    if [ "a${appendXheader}" != "an" ];
    then
PROBLEM:        cat ${tmpdir}/receivedmail | ${formail} -f -I "To:
${receiver}" -A "${Xheader}" > ${tmpdir}/recm
        mv ${tmpdir}/recm ${tmpdir}/receivedmail
        fi


    echo ${sender}
    echo ${receiver}    

    
    # Exim makes the final delivery here
    # The mail that has just been scanned is resubmitted to exim for
    # delivery, with the received_protocol marked as "scanned_ok".


PROBLEM    cat ${tmpdir}/receivedmail | ${exim} -t -oMr scanned_ok 



#    rm -rf ${tmpdir}
else
#
# ELSE move everything to a "blocked" directory for later perusal
#
    mv ${tmpdir} ${blockdir}
fi




# END.
> On Wed, 24 May 2000, Lumpp, Wolfgang wrote:
>
> > Hi all,
> > in a transport I try:
> > command = /usr/sbin/inflex-exim $h_envelope-to: $sender_address
> > $received_for
> > but I didn't get a value for the Envelope-to: header.
>
> Unless you add it, there is no Envelope-To: header. The envelope of a
> message is normally transmitted 'out-of-band'. $envelope_sender might
> be what you are looking for, if I recall the variable name correctly..
>
> > Could anyone give me an idea.
> > virus_scan:
> >     driver = pipe
> >     command = /usr/sbin/inflex-exim $sender_host_name 
> $h_envelope-to:
> > $sender_address $sender_address
> >     envelope_to_add # I've tried it also without
> >     user = root
> >     group = root
> >     path = "/bin:/sbin:/usr/bin:/usr/sbin
> > Regards
> > Wolfgang

> >
> > --
> > ## List details at
> http://www.exim.org/mailman/listinfo/exim-users > Exim details
> at http://www.exim.org/ ##
> >
>
> --
>
>
>
> --
> ## List details at
> http://www.exim.org/mailman/listinfo/exim-users > Exim details
> at http://www.exim.org/ ##
>