From: Marc.Haber-lists@gmx.de (Marc Haber)
Date: Sat, 01 Aug 1998 13:05:12 GMT

I am using a virus scanner program that is invoked by a pipe, scans the mail
and re-invokes Exim to do the delivery. The pipe is invoking a perl script that
tries to unpack and MIME, zip and other archives and then applies the McAfee
scanner on the results.

The Exim configuration to handle this was created by Sven Paulus
<sven@oops.sub.de>. The relevant bits are shown below. The virus scanner scans
the mail and re-delivers it with

  exim -oMr scanned-ok 
  
to stop the mail from being scanned a second time. There was a bug in Exim 
prior to release 2.00 that stopped this working.


######################################################################
#                      TRANPORTS CONFIGURATION                       #
######################################################################
#                       ORDER DOES NOT MATTER                        #
#     Only one appropriate transport is called for each delivery.    #
######################################################################

virscan:
  driver = pipe
  bsmtp = all
  batch_max = 32767
  bsmtp_helo = true
  command = "/usr/local/virscan/bin/scanmail \
    $sender_host_address /var/log/exim_virscan 1"
  current_directory = "/tmp"
  from_hack = false
  freeze_exec_fail = false
  group = virscan
  ignore_status = false
  log_defer_output = false
  log_fail_output = false
  log_output = true
  prefix =
  return_output = false
  return_path_add = false
  timeout = 6h
  umask = 022
  use_shell = false
  user = virscan


######################################################################
#                      DIRECTORS CONFIGURATION                       #
#             Specifies how local addresses are handled              #
######################################################################
#                          ORDER DOES MATTER                         #
#   A local address is passed to each in turn until it is accepted.  #
######################################################################

# Follows system_aliases and userforward directors, but precedes localuser.

vircheck:
  condition = "${if or {{eq {$received_protocol}{no-attachment}} \
                        {eq {$received_protocol}{local-not-scanned}} \
                        {eq {$received_protocol}{scanned-ok}} \
                        {match {$sender_host_address}{^192\.168\.10\.}}} \
                 {0}{1}}"
  driver = localuser
  transport = virscan


######################################################################
#                      ROUTERS CONFIGURATION                         #
#            Specifies how remote addresses are handled              #
######################################################################
#                          ORDER DOES MATTER                         #
#  A remote address is passed to each in turn until it is accepted.  #
######################################################################

# The first router routes everything to the scanner unless the message
# has previously been scanned.

vircheck:
  condition = "${if eq {$received_protocol}{scanned-ok} {0}{1}}"
  driver = domainlist
  route_list = "*"
  transport = virscan
