# $Cambridge: exim/exim-src/src/configure.default,v 1.10 2006/07/27 10:36:34 ph10 Exp $ ###################################################################### # Runtime configuration file for Exim # ###################################################################### # This is a default configuration file which will operate correctly in # uncomplicated installations. Please see the manual for a complete list # of all the runtime configuration options that can be included in a # configuration file. There are many more than are mentioned here. The # manual is in the file doc/spec.txt in the Exim distribution as a plain # ASCII file. Other formats (PostScript, Texinfo, HTML, PDF) are available # from the Exim ftp sites. The manual is also online at the Exim web sites. # This file is divided into several parts, all but the first of which are # headed by a line starting with the word "begin". Only those parts that # are required need to be present. Blank lines, and lines starting with # # are ignored. ########### IMPORTANT ########## IMPORTANT ########### IMPORTANT ########### # # # Whenever you change Exim's configuration file, you *must* remember to # # HUP the Exim daemon, because it will not pick up the new configuration # # until you do. However, any other Exim processes that are started, for # # example, a process started by an MUA in order to send a message, will # # see the new configuration as soon as it is in place. # # # # You do not need to HUP the daemon for changes in auxiliary files that # # are referenced from this file. They are read every time they are used. # # # # It is usually a good idea to test a new configuration for syntactic # # correctness before installing it (for example, by running the command # # "exim -C /config/file.new -bV"). # # # ########### IMPORTANT ########## IMPORTANT ########### IMPORTANT ########### ###################################################################### # MAIN CONFIGURATION SETTINGS # ###################################################################### # Specify your host's canonical name here. This should normally be the fully # qualified "official" name of your host. If this option is not set, the # uname() function is called to obtain the name. In many cases this does # the right thing and you need not set anything explicitly. primary_hostname = corp-2.mycompany.co.uk disable_ipv6=true # The next three settings create two lists of domains and one list of hosts. # These lists are referred to later in this configuration using the syntax # +local_domains, +relay_to_domains, and +relay_from_hosts, respectively. They # are all colon-separated lists: #domainlist local_domains = @ : localhost : localhost.localdomain domainlist relay_to_domains = hostlist relay_from_hosts = 127.0.0.1 : 172.17.0.0/24 domainlist local_domains = ${lookup mysql {\ SELECT domain FROM user WHERE domain='${quote_mysql:$domain}' \ UNION \ SELECT domain FROM alias WHERE domain='${quote_mysql:$domain}' \ UNION \ SELECT domain FROM catchall WHERE domain='${quote_mysql:$domain}'\ }} # Most straightforward access control requirements can be obtained by # appropriate settings of the above options. In more complicated situations, # you may need to modify the Access Control List (ACL) which appears later in # this file. # The first setting specifies your local domains, for example: # # domainlist local_domains = my.first.domain : my.second.domain # # You can use "@" to mean "the name of the local host", as in the default # setting above. This is the name that is specified by primary_hostname, # as specified above (or defaulted). If you do not want to do any local # deliveries, remove the "@" from the setting above. If you want to accept mail # addressed to your host's literal IP address, for example, mail addressed to # "user@[192.168.23.44]", you can add "@[]" as an item in the local domains # list. You also need to uncomment "allow_domain_literals" below. This is not # recommended for today's Internet. # The second setting specifies domains for which your host is an incoming relay. # If you are not doing any relaying, you should leave the list empty. However, # if your host is an MX backup or gateway of some kind for some domains, you # must set relay_to_domains to match those domains. For example: # # domainlist relay_to_domains = *.myco.com : my.friend.org # # This will allow any host to relay through your host to those domains. # See the section of the manual entitled "Control of relaying" for more # information. # The third setting specifies hosts that can use your host as an outgoing relay # to any other host on the Internet. Such a setting commonly refers to a # complete local network as well as the localhost. For example: # # hostlist relay_from_hosts = 127.0.0.1 : 192.168.0.0/16 # # The "/16" is a bit mask (CIDR notation), not a number of hosts. Note that you # have to include 127.0.0.1 if you want to allow processes on your host to send # SMTP mail by using the loopback address. A number of MUAs use this method of # sending mail. # All three of these lists may contain many different kinds of item, including # wildcarded names, regular expressions, and file lookups. See the reference # manual for details. The lists above are used in the access control lists for # checking incoming messages. The names of these ACLs are defined here: acl_smtp_rcpt = acl_check_rcpt acl_smtp_data = acl_check_data acl_smtp_mime = acl_check_mime # You should not change those settings until you understand how ACLs work. # If you are running a version of Exim that was compiled with the content- # scanning extension, you can cause incoming messages to be automatically # scanned for viruses. You have to modify the configuration in two places to # set this up. The first of them is here, where you define the interface to # your scanner. This example is typical for ClamAV; see the manual for details # of what to set for other virus scanners. The second modification is in the # acl_check_data access control list (see below). #av_scanner = clamd:/var/run/clamav/clamd.sock # For spam scanning, there is a similar option that defines the interface to # SpamAssassin. You do not need to set this if you are using the default, which # is shown in this commented example. As for virus scanning, you must also # modify the acl_check_data access control list to enable spam scanning. #spamd_address = 127.0.0.1 783 ##spamd_address = /var/run/spamassassin/spamd.sock # If Exim is compiled with support for TLS, you may want to enable the # following options so that Exim allows clients to make encrypted # connections. In the authenticators section below, there are template # configurations for plaintext username/password authentication. This kind # of authentication is only safe when used within a TLS connection, so the # authenticators will only work if the following TLS settings are turned on # as well. # Allow any client to use TLS. tls_advertise_hosts = * # Specify the location of the Exim server's TLS certificate and private key. # The private key must not be encrypted (password protected). You can put # the certificate and private key in the same file, in which case you only # need the first setting, or in separate files, in which case you need both # options. tls_certificate = /etc/pki/tls/certs/exim.pem tls_privatekey = /etc/pki/tls/private/exim.pem # In order to support roaming users who wish to send email from anywhere, # you may want to make Exim listen on other ports as well as port 25, in # case these users need to send email from a network that blocks port 25. # The standard port for this purpose is port 587, the "message submission" # port. See RFC 4409 for details. Microsoft MUAs cannot be configured to # talk the message submission protocol correctly, so if you need to support # them you should also allow TLS-on-connect on the traditional but # non-standard port 465. #daemon_smtp_ports = 25 : 465 : 587 daemon_smtp_ports = smtp : smtps : submission tls_on_connect_ports = 465 # Specify list of interface IP addresses on which to listen. Each item # may optionally also specify a port. By default, Exim listens on all # available interfaces. # Listen only on loopback interface #local_interfaces = <; 127.0.0.1 ; ::1 local_interfaces = <; 127.0.0.1 ; 172.17.0.16 # Specify the domain you want to be added to all unqualified addresses # here. An unqualified address is one that does not contain an "@" character # followed by a domain. For example, "caesar@rome.example" is a fully qualified # address, but the string "caesar" (i.e. just a login name) is an unqualified # email address. Unqualified addresses are accepted only from local callers by # default. See the recipient_unqualified_hosts option if you want to permit # unqualified addresses from remote sources. If this option is not set, the # primary_hostname value is used for qualification. # qualify_domain = # If you want unqualified recipient addresses to be qualified with a different # domain to unqualified sender addresses, specify the recipient domain here. # If this option is not set, the qualify_domain value is used. # qualify_recipient = # The following line must be uncommented if you want Exim to recognize # addresses of the form "user@[10.11.12.13]" that is, with a "domain literal" # (an IP address) instead of a named domain. The RFCs still require this form, # but it makes little sense to permit mail to be sent to specific hosts by # their IP address in the modern Internet. This ancient format has been used # by those seeking to abuse hosts by using them for unwanted relaying. If you # really do want to support domain literals, uncomment the following line, and # see also the "domain_literal" router below. # allow_domain_literals # No deliveries will ever be run under the uids of these users (a colon- # separated list). An attempt to do so causes a panic error to be logged, and # the delivery to be deferred. This is a paranoic safety catch. There is an # even stronger safety catch in the form of the FIXED_NEVER_USERS setting # in the configuration for building Exim. The list of users that it specifies # is built into the binary, and cannot be changed. The option below just adds # additional users to the list. The default for FIXED_NEVER_USERS is "root", # but just to be absolutely sure, the default here is also "root". # Note that the default setting means you cannot deliver mail addressed to root # as if it were a normal user. This isn't usually a problem, as most sites have # an alias for root that redirects such mail to a human administrator. never_users = root # The setting below causes Exim to do a reverse DNS lookup on all incoming # IP calls, in order to get the true host name. If you feel this is too # expensive, you can specify the networks for which a lookup is done, or # remove the setting entirely. host_lookup = * # The settings below, which are actually the same as the defaults in the # code, cause Exim to make RFC 1413 (ident) callbacks for all incoming SMTP # calls. You can limit the hosts to which these calls are made, and/or change # the timeout that is used. If you set the timeout to zero, all RFC 1413 calls # are disabled. RFC 1413 calls are cheap and can provide useful information # for tracing problem messages, but some hosts and firewalls have problems # with them. This can result in a timeout instead of an immediate refused # connection, leading to delays on starting up SMTP sessions. (The default was # reduced from 30s to 5s for release 4.61.) rfc1413_hosts = * rfc1413_query_timeout = 5s # By default, Exim expects all envelope addresses to be fully qualified, that # is, they must contain both a local part and a domain. If you want to accept # unqualified addresses (just a local part) from certain hosts, you can specify # these hosts by setting one or both of # # sender_unqualified_hosts = # recipient_unqualified_hosts = # # to control sender and recipient addresses, respectively. When this is done, # unqualified addresses are qualified using the settings of qualify_domain # and/or qualify_recipient (see above). # If you want Exim to support the "percent hack" for certain domains, # uncomment the following line and provide a list of domains. The "percent # hack" is the feature by which mail addressed to x%y@z (where z is one of # the domains listed) is locally rerouted to x@y and sent on. If z is not one # of the "percent hack" domains, x%y is treated as an ordinary local part. This # hack is rarely needed nowadays; you should not enable it unless you are sure # that you really need it. # # percent_hack_domains = # # As well as setting this option you will also need to remove the test # for local parts containing % in the ACL definition below. # When Exim can neither deliver a message nor return it to sender, it "freezes" # the delivery error message (aka "bounce message"). There are also other # circumstances in which messages get frozen. They will stay on the queue for # ever unless one of the following options is set. # This option unfreezes frozen bounce messages after two days, tries # once more to deliver them, and ignores any delivery failures. ignore_bounce_errors_after = 2d # This option cancels (removes) frozen messages that are older than a week. timeout_frozen_after = 7d # This setting, if uncommented, allows users to authenticate using # their system passwords against saslauthd if they connect over a # secure connection. If you have network logins such as NIS or # Kerberos rather than only local users, then you possibly also want # to configure /etc/sysconfig/saslauthd to use the 'pam' mechanism # too. Once a user is authenticated, the acl_check_rcpt ACL then # allows them to relay through the system. # #auth_advertise_hosts = ${if eq {$tls_cipher}{}{}{*}} # # By default, we set this option to allow SMTP AUTH from nowhere # (Exim's default would be to allow it from anywhere, even on an # unencrypted connection). # # Comment this one out if you uncomment the above. Did you make sure # saslauthd is actually running first? # #auth_advertise_hosts = # mysql auth hide mysql_servers = localhost/system/username/password # seconds after a greylisted message is accepted (10 minutes) GREYLIST_TIMEOUT = ${eval:10*60} # integer spam score threshold to activate selective greylisting (3.0 points) GREYLIST_SPAM_THRESHOLD = 30 # messages bigger than this aren't spam-scanned SPAM_FILESIZE_LIMIT = 1M # messages bigger than this aren't virus-scanned VIRUS_FILESIZE_LIMIT = 32M ###################################################################### # ACL CONFIGURATION # # Specifies access control lists for incoming SMTP mail # ###################################################################### begin acl # This access control list is used for every RCPT command in an incoming # SMTP message. The tests are run in order until the address is either # accepted or denied. acl_check_rcpt: # Accept if the source is local SMTP (i.e. not over TCP/IP). We do this by # testing for an empty sending host field. accept hosts = : # temporary reject message, if already greylisted and entry hasn't expired yet # authenticated users skip this defer message = Your Message is currently still greylisted! Please try again later. log_message = message from ${sender_address} over [${sender_host_address}] is still GreyListed !authenticated = * # true, if triple is in db and not yet GREYLIST_TIMEOUT seconds since first seen # false, else (older or not in db) condition = ${if >={GREYLIST_TIMEOUT}{${lookup mysql{\ SELECT (UNIX_TIMESTAMP()-MAX(first_seen)) AS QueueTime \ FROM greylist \ WHERE SenderIP = '${quote_mysql:$sender_host_address}' \ AND SenderAddress = '${quote_mysql:$sender_address}' \ }{$value}{${eval:GREYLIST_TIMEOUT+1}}}}{true}{false}} ## deny, if foreign, unauthenticated connection claims to come from a local domain ## 2009-08-01 this has some strange behaviour (blocking) on two systems (A & B are different servers) with this config under the following condition ## A: user@Adomain writes to user user@Bdomain (which is an alias for someotheruser@Adomain) ## if your users have such circular aliases on different servers using this config, simply comment it out! #deny message = Sender claims to have a local address, but is neither authenticated nor relayed (try using SMTP-AUTH!) # log_message = Forged Sender address (claims to be local user [${sender_address}], but isn't authenticated) # !hosts = +relay_from_hosts # !authenticated = * # condition = ${if match_domain{$sender_address_domain}{+local_domains}} warn message = You cannot be localhost.localdomain in the internet log_message = HELO is faked as localhost.localdomain condition = ${if match{$sender_helo_name}{\Nlocalhost\.localdomain\N}} # we're doing HELO checks here, because we can't add headers in acl_smtp_helo warn message = X-Invalid-HELO: HELO is IP only (See RFC2821 4.1.3) log_message = HELO ($sender_helo_name) is IP only (See RFC2821 4.1.3) condition = ${if isip{$sender_helo_name}} warn message = X-Invalid-HELO: HELO is no FQDN (contains no dot) (See RFC2821 4.1.1.1) log_message = HELO ($sender_helo_name) is no FQDN (contains no dot) (See RFC2821 4.1.1.1) # Required because "[IPv6:
]" will have no .s condition = ${if match{$sender_helo_name}{\N^\[\N}{no}{yes}} condition = ${if match{$sender_helo_name}{\N\.\N}{no}{yes}} warn message = X-Invalid-HELO: HELO is no FQDN (ends in dot) (See RFC2821 4.1.1.1) log_message = HELO ($sender_helo_name) is no FQDN (ends in dot) (See RFC2821 4.1.1.1) condition = ${if match{$sender_helo_name}{\N\.$\N}} warn message = X-Invalid-HELO: HELO is no FQDN (contains double dot) (See RFC2821 4.1.1.1) log_message = HELO ($sender_helo_name) is no FQDN (contains double dot) (See RFC2821 4.1.1.1) condition = ${if match{$sender_helo_name}{\N\.\.\N}} warn message = X-Invalid-HELO: Host impersonating [$primary_hostname] log_message = HELO ($sender_helo_name) impersonating [$primary_hostname] condition = ${if match{$sender_helo_name}{$primary_hostname}{yes}{no}} # TODO: nicht auf loopback generieren warn message = X-Invalid-HELO: $interface_address is _my_ address log_message = HELO ($sender_helo_name) uses _my_ address ($interface_address) # [own IP] or even without brackets as HELO condition = ${if or{{\ eq{[$interface_address]}{$sender_helo_name}\ }{\ eq{$interface_address}{$sender_helo_name}\ }}} warn message = X-Invalid-HELO: no HELO log_message = no HELO ($sender_helo_name) condition = ${if !def:sender_helo_name} ############################################################################# # The following section of the ACL is concerned with local parts that contain # @ or % or ! or / or | or dots in unusual places. # # The characters other than dots are rarely found in genuine local parts, but # are often tried by people looking to circumvent relaying restrictions. # Therefore, although they are valid in local parts, these rules lock them # out, as a precaution. # # Empty components (two dots in a row) are not valid in RFC 2822, but Exim # allows them because they have been encountered. (Consider local parts # constructed as "firstinitial.secondinitial.familyname" when applied to # someone like me, who has no second initial.) However, a local part starting # with a dot or containing /../ can cause trouble if it is used as part of a # file name (e.g. for a mailing list). This is also true for local parts that # contain slashes. A pipe symbol can also be troublesome if the local part is # incorporated unthinkingly into a shell command line. # # Two different rules are used. The first one is stricter, and is applied to # messages that are addressed to one of the local domains handled by this # host. The line "domains = +local_domains" restricts it to domains that are # defined by the "domainlist local_domains" setting above. The rule blocks # local parts that begin with a dot or contain @ % ! / or |. If you have # local accounts that include these characters, you will have to modify this # rule. deny message = Restricted characters in address domains = +local_domains local_parts = ^[.] : ^.*[@%!/|] # The second rule applies to all other domains, and is less strict. The line # "domains = !+local_domains" restricts it to domains that are NOT defined by # the "domainlist local_domains" setting above. The exclamation mark is a # negating operator. This rule allows your own users to send outgoing # messages to sites that use slashes and vertical bars in their local parts. # It blocks local parts that begin with a dot, slash, or vertical bar, but # allows these characters within the local part. However, the sequence /../ # is barred. The use of @ % and ! is blocked, as before. The motivation here # is to prevent your users (or your users' viruses) from mounting certain # kinds of attack on remote sites. deny message = Restricted characters in address domains = !+local_domains local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./ ############################################################################# # Accept mail to postmaster in any local domain, regardless of the source, # and without verifying the sender. accept local_parts = postmaster domains = +local_domains # Deny unless the sender address can be routed. For proper verification of the # address, read the documentation on callouts and add the /callout modifier. require verify = sender # embed a header flag, if sender callout verification fails. this may lead to rejection in future, or give a hint to bayes filter # the next both directives have complement verify conditions, so only one matches warn message = X-Sender-Verify: FAILED ($sender_verify_failure) log_message = Sender ($sender_address) could not be verified using callout: $acl_verify_message ($sender_verify_failure) !verify = sender/callout=10s,random warn message = X-Sender-Verify: SUCCEEDED (sender exists & accepts mail) verify = sender/callout=10s,random # Accept if the message comes from one of the hosts for which we are an # outgoing relay. It is assumed that such hosts are most likely to be MUAs, # so we set control=submission to make Exim treat the message as a # submission. It will fix up various errors in the message, for example, the # lack of a Date: header line. If you are actually relaying out out from # MTAs, you may want to disable this. If you are handling both relaying from # MTAs and submissions from MUAs you should probably split them into two # lists, and handle them differently. # Recipient verification is omitted here, because in many cases the clients # are dumb MUAs that don't cope well with SMTP error responses. If you are # actually relaying out from MTAs, you should probably add recipient # verification here. # Note that, by putting this test before any DNS black list checks, you will # always accept from these hosts, even if they end up on a black list. The # assumption is that they are your friends, and if they get onto a black # list, it is a mistake. accept hosts = +relay_from_hosts control = submission # Accept if the message arrived over an authenticated connection, from # any host. Again, these messages are usually from MUAs, so recipient # verification is omitted, and submission mode is set. And again, we do this # check before any black list tests. accept authenticated = * control = submission/sender_retain/domain= # Insist that any other recipient address that we accept is either in one of # our local domains, or is in a domain for which we explicitly allow # relaying. Any other domain is rejected as being unacceptable for relaying. require message = relay not permitted domains = +local_domains : +relay_to_domains # We also require all accepted addresses to be verifiable. This check will # do local part verification for local domains, but only check the domain # for remote domains. The only way to check local parts for the remote # relay domains is to use a callout (add /callout), but please read the # documentation about callouts before doing this. require verify = recipient ############################################################################# # There are no default checks on DNS black lists because the domains that # contain these lists are changing all the time. However, here are two # examples of how you can get Exim to perform a DNS black list lookup at this # point. The first one denies, whereas the second just warns. # # deny message = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text # dnslists = black.list.example # # warn dnslists = black.list.example # add_header = X-Warning: $sender_host_address is in a black list at $dnslist_domain # log_message = found in $dnslist_domain ############################################################################# ############################################################################# # This check is commented out because it is recognized that not every # sysadmin will want to do it. If you enable it, the check performs # Client SMTP Authorization (csa) checks on the sending host. These checks # do DNS lookups for SRV records. The CSA proposal is currently (May 2005) # an Internet draft. You can, of course, add additional conditions to this # ACL statement to restrict the CSA checks to certain hosts only. # # require verify = csa ############################################################################# # At this point, the address has passed all the checks that have been # configured, so we accept it unconditionally. accept # This ACL is used after the contents of a message have been received. This # is the ACL in which you can test a message's headers or body, and in # particular, this is where you can invoke external virus or spam scanners. # Some suggested ways of configuring these tests are shown below, commented # out. Without any tests, this ACL accepts all messages. If you want to use # such tests, you must ensure that Exim is compiled with the content-scanning # extension (WITH_CONTENT_SCAN=yes in Local/Makefile). acl_check_data: # Unpack MIME containers and reject file extensions # used by worms. Note that the extension list may be # incomplete. deny message = $found_extension files are not accepted here demime = com:exe:vbs:bat:pif:reg:scr # Reject messages that have serious MIME errors. # This calls the demime condition again, but will return cached results. deny message = Serious MIME defect detected ($demime_reason). demime = * condition = ${if >{$demime_errorlevel}{2}{1}{0}} # # Deny if the message contains a virus. Before enabling this check, you # # must install a virus scanner and set the av_scanner option above. # deny message = This message contains a virus ($malware_name) and is rejected. # log_message = rejected VIRUS ($malware_name) from $sender_address to $recipients (ClamAV) # set acl_m0 = clamd:/var/run/clamav/clamd.sock # condition = ${if < {$message_size}{VIRUS_FILESIZE_LIMIT}} # demime = * # malware = * # 2009-08-01 disable f-prot for now, since its usage has changed # this is the place to configure additional virus scanning engines. # just copy and modify this block (read exim doc for available scanners) # deny message = This message contains a virus ($malware_name) and is rejected. # log_message = rejected VIRUS ($malware_name) from $sender_address to $recipients (F-Prot) # set acl_m0 = cmdline:/usr/bin/f-prot -ai -archive -collect -dumb -packed %s:Infection. :Infection. (.+)\$ # condition = ${if < {$message_size}{VIRUS_FILESIZE_LIMIT}} # demime = * # malware = * ## reject executeable double extensions in archives # deny demime = zip:rar:arj:tar:tgz:gz:bz2 # condition = ${run{/etc/exim/scan_archive.sh $message_exim_id ${lc:$found_extension}}{no}{yes}} # message = This message contains an unwanted binary Attachment in ${uc:$found_extension} file using a double extension # log_message = ${uc:$found_extension} archive contains potential dangerous double extension. # delay = 15s # # Add headers to all messages (:true). Before enabling this, # # you must install SpamAssassin. You may also need to set the spamd_address # # option above. # # # warn message = X-Spam-Score: $spam_score\n\ # X-Spam-Score-Int: $spam_score_int\n\ # X-Spam-Bar: $spam_bar\n\ # X-Spam-Report: $spam_report # !authenticated = * # condition = ${if < {$message_size}{SPAM_FILESIZE_LIMIT}} # spam = spamassassin:true # # # temp. reject messages that seem to have timeouts during spam-scan # defer message = Temporary error while spam-scanning. Please try again later. # log_message = message temporarily rejected, because of spam-scan error (maybe timeout) # !authenticated = * # condition = ${if < {$message_size}{SPAM_FILESIZE_LIMIT}} # condition = ${if !def:spam_score} # # # Reject spam messages with score over 10+2*max_score_from_db (fallback=15 if mysql fails), using an extra condition. # deny message = This message is classified as UBE (SPAM) and therefore rejected. You scored $spam_score points. Congratulations! # #spam = spamassassin:true # !authenticated = * # condition = ${if >={$spam_score_int}{${lookup mysql{\ # SELECT ((max(spam_threshold)*2+10)*10) AS spam_reject_threshold \ # FROM user \ # WHERE SMTP_allowed='YES' \ # }{$value}{15}}}{true}{false}} # temporary reject message for greylisting, if integer spamscore is above GREYLIST_SPAM_THRESHOLD and the message (sender address + IP) is seen for the first time # authenticated users skip this defer message = Your Message will be greylisted! Please try again in GREYLIST_TIMEOUT seconds. log_message = message from ${sender_address} over [${sender_host_address}] will be GreyListed as it scores $spam_score spam points !authenticated = * condition = ${if >={$spam_score_int}{GREYLIST_SPAM_THRESHOLD}{true}{false}} # false, if triple is in db (at this point if it's in the timeout has expired) # true, if not condition = ${lookup mysql{ \ SELECT MAX(first_seen) \ FROM greylist \ WHERE SenderIP = '${quote_mysql:$sender_host_address}' \ AND SenderAddress = '${quote_mysql:$sender_address}' \ }{false}{true}} # insert triple into database (which should succeed) condition = ${lookup mysql{ \ INSERT INTO greylist ( SenderIP, SenderAddress, first_seen ) \ VALUES ( '${quote_mysql:$sender_host_address}', '${quote_mysql:$sender_address}', UNIX_TIMESTAMP() ) \ }{$value}fail} # log, if mail successfully passed greylisting warn message = X-GreyList: Message successfully passed GreyListing after $acl_m0 seconds. log_message = message from ${sender_address} over [${sender_host_address}] with HELO ($sender_helo_name) successfully passed GreyListing after $acl_m0 seconds and scores $spam_score spam points !authenticated = * # true, if triple is in db (at this point if it's in the timeout has expired) # false, if not condition = ${lookup mysql{ \ SELECT MAX(first_seen) \ FROM greylist \ WHERE SenderIP = '${quote_mysql:$sender_host_address}' \ AND SenderAddress = '${quote_mysql:$sender_address}' \ }{true}{false}} set acl_m0 = ${eval:$tod_epoch-${lookup mysql{ \ SELECT MAX(first_seen) \ FROM greylist \ WHERE SenderIP = '${quote_mysql:$sender_host_address}' \ AND SenderAddress = '${quote_mysql:$sender_address}' \ }{$value}}} # save exim version and current date in header warn message = X-Exim-Version: $version_number (build at $compile_date)\n\ X-Date: $tod_log\n\ X-Connected-IP: $sender_host_address:$sender_host_port # save additional information in header warn message = X-Message-Linecount: $message_linecount\n\ X-Body-Linecount: $body_linecount\n\ X-Message-Size: $message_size\n\ X-Body-Size: $message_body_size #X-Received-Count: $received_count\n\ #X-Recipient-Count: $recipients_count\n\ #X-Local-Recipient-Count: $rcpt_count\n\ #X-Local-Recipient-Defer-Count: $rcpt_defer_count\n\ #X-Local-Recipient-Fail-Count: $rcpt_fail_count warn log_message = DEBUG load_avgx1000: $load_average spam_score: $spam_score message_size: $message_size # finally accept the message in DATA ACL. accept acl_check_mime: # File extension filtering. deny message = Blacklisted file extension detected condition = ${if match \ {${lc:$mime_filename}} \ {\N(\.exe|\.pif|\.bat|\.scr|\.lnk|\.com)$\N} \ {1}{0}} accept ###################################################################### # ROUTERS CONFIGURATION # # Specifies how addresses are handled # ###################################################################### # THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! # # An address is passed to each router in turn until it is accepted. # ###################################################################### begin routers # This router routes to remote hosts over SMTP by explicit IP address, # when an email address is given in "domain literal" form, for example, #