From c9d1c43703241901002705a2125c4c59e181f6d7 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Sat, 17 Dec 2005 09:57:54 -0500
Subject: [PATCH] improved ISPConfig mail

---
 config/exim4/exim4.conf.template |  239 +++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 175 insertions(+), 64 deletions(-)

diff --git a/config/exim4/exim4.conf.template b/config/exim4/exim4.conf.template
index c211e2e..4bed325 100644
--- a/config/exim4/exim4.conf.template
+++ b/config/exim4/exim4.conf.template
@@ -15,6 +15,7 @@
 # Server ID for Multiserver Setups
 MAILSERVER_ID=1
 MAILSERVER_HOSTNAME=mail.
+MAILSERVER_IP=192.168.0.108
 MAILSERVER_EXIM_BINARY=/usr/sbin/exim4
 MAILSERVER_SPAMC_BINARY=/usr/bin/spamc
 
@@ -47,7 +48,7 @@
 hostlist   relay_from_hosts = 127.0.0.1
 domainlist mmdomains = ${lookup mysql {SELECT domain FROM mail_mailman_domain}}
 
-acl_smtp_rcpt = acl_check_rcpt
+# acl_smtp_rcpt = acl_check_rcpt
 
 qualify_domain = 
 # qualify_recipient =
@@ -92,7 +93,17 @@
 # Require auth over SSL only.
 # auth_over_tls_hosts = *
 
+helo_try_verify_hosts = !+relay_from_hosts
+
+av_scanner = clamd:/var/run/clamav/clamd.ctl
 spamd_address = 127.0.0.1 783
+
+acl_smtp_rcpt = acl_check_rcpt
+#acl_smtp_mail = acl_check_sender
+acl_smtp_connect = acl_check_host
+acl_smtp_data = acl_check_data
+acl_smtp_helo = acl_check_helo
+
 
 ######################################################################
 #                       ACL CONFIGURATION                            #
@@ -102,36 +113,94 @@
 begin acl
 
 acl_check_rcpt:
+
   accept  hosts = :
+
   deny    domains       = +local_domains
           local_parts   = ^[.] : ^.*[@%!/|]
+
   deny    domains       = !+local_domains
           local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
+
   accept  local_parts   = postmaster
           domains       = +local_domains
+
   require verify        = sender
+
+  # Blacklist management
+  deny    senders = ${lookup mysql {SELECT DISTINCT address FROM MYSQL_BLACKTABLE WHERE '${quote_mysql:$sender_address}' LIKE address \
+                                    AND (recipient = '' OR recipient = '${quote_mysql:$domain}' OR recipient = '${quote_mysql:$local_part}@${quote_mysql:$domain}') \
+                                    AND active = '1' AND server_id = 'MAILSERVER_ID'}{$value}}
+         log_message     = Blacklisted. Sender: <$sender_address> Recipient: <$local_part@$domain>
+
   accept  domains       = +local_domains
           endpass
           verify        = recipient
+
   accept  domains       = +relay_to_domains
           endpass
           verify        = recipient
+
   accept  hosts         = +relay_from_hosts
+
   accept  authenticated = *
+
   deny    message       = relay not permitted
 
-acl_check_data:
-  warn  message = X-Spam-Score: $spam_score ($spam_bar)
-        spam = nobody:true
-  warn  message = X-Spam-Report: $spam_report
-        spam = nobody:true
-  warn  message = Subject: *SPAM* $h_Subject
-        spam = nobody
 
-  # reject spam at high scores (> 12)
-  deny   message = This message scored $spam_score spam points.
-         spam = nobody:true
-         condition = ${if >{$spam_score_int}{120}{1}{0}}
+acl_check_host:
+        accept
+                hosts = +relay_from_hosts
+        #deny    
+        #        log_message = match host_reject.list
+        #        hosts = /etc/exim4/filters/host_reject.list
+
+        accept
+
+acl_check_helo:
+        accept  hosts = +relay_from_hosts
+	# If the HELO pretend to be this host
+	deny	condition = ${if or { \
+					{eq {${lc:$sender_helo_name}}{MAILSERVER_HOSTNAME}} \
+					{eq {${lc:$sender_helo_name}}{MAILSERVER_IP}} \
+				    } {true}{false} }
+        # by default we accept
+        accept
+
+
+acl_check_data:
+
+        accept  hosts = +relay_from_hosts
+
+        # if there is a windows executable as attachment then we reject
+        deny    message = This message contains an attachment of a type which we do not accept (.$found_extension) 
+                demime = bat:btm:cmd:com:cpl:dll:exe:lnk:msi:pif:prf:reg:scr:vbs:url
+
+        # spamassassin
+        warn    message = X-SA-Score: $spam_score 
+                spam = nobody:true
+
+        warn    message = X-SA-Report: $spam_report 
+                spam = nobody:true
+
+                condition = ${if >{$spam_score_int}{0}{true}{false}}
+        warn    message = X-SA-Status: Yes 
+                spam = nobody:true
+                condition = ${if >{$spam_score_int}{50}{true}{false}}
+
+        deny    message = This message scored $spam_score spam points. 
+                spam = nobody:true 
+                condition = ${if >{$spam_score_int}{70}{true}{false}}
+
+        # clamav
+        deny    message = This message contains a virus or other harmful content ($malware_name)
+                demime = * 
+                malware = *
+                log_message = Virus found in Message
+
+        # accept by default
+        accept
+
 
 
 
@@ -176,13 +245,16 @@
   ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
   no_more
 
-blacklist_router:
-  driver = manualroute
-  senders = ${lookup mysql {SELECT DISTINCT address FROM MYSQL_BLACKTABLE WHERE '${quote_mysql:$sender_address}' LIKE address}{$value}}
-  condition = "${if !def:h_X-Spam-Flag: {1}{0}}"
-  headers_add = X-Spam-Flag: YES
-  route_list = * localhost
-  self = pass
+# Blacklists werden jetzt in den ACL gepr�ft
+#blacklist_router:
+#  driver = manualroute
+#  senders = ${lookup mysql {SELECT DISTINCT address FROM MYSQL_BLACKTABLE WHERE '${quote_mysql:$sender_address}' LIKE address AND recipient = '${quote_mysql:$local_part}@${quote_mysql:$domain}'}{$value}}
+#  # condition = "${if !def:h_X-Spam-Flag: {1}{0}}"
+#  # headers_add = X-Spam-Flag: YES
+#  route_list = * localhost
+#  # self = pass
+#  transport = devnull_transport
+#  verify = false
 
 #system_aliases:
 #  driver = redirect
@@ -203,11 +275,11 @@
    driver = redirect
    allow_fail
    allow_defer
-   data = ${lookup mysql{ SELECT destination FROM mail_redirect WHERE email='${local_part}@${domain}' AND type = 'alias'}}
+   data = ${lookup mysql{ SELECT destination FROM mail_redirect WHERE email='${quote_mysql:$local_part}@${quote_mysql:$domain}' AND type = 'alias'}}
 
 mysql_email_forward:
    driver = redirect
-   data = ${lookup mysql{ SELECT destination FROM mail_redirect WHERE email='${local_part}@${domain}' AND type = 'forward'}}
+   data = ${lookup mysql{ SELECT destination FROM mail_redirect WHERE email='${quote_mysql:$local_part}@${quote_mysql:$domain}' AND type = 'forward'}}
 
 #spamcheck_router:
 #  driver = manualroute
@@ -222,15 +294,52 @@
 #  transport = spamcheck
 #  verify = false
 
+#spamdelete_router:
+#  driver = manualroute
+#  domains = ${lookup mysql {SELECT SUBSTRING_INDEX(email,'@',-1) FROM MYSQL_EMAILTABLE WHERE email=CONCAT('${quote_mysql:$local_part}','@','${quote_mysql:$domain}') AND spamdelete = '1'}{$value}}
+#  # condition = "${if eq{$h_X-Spam-Flag:}{YES} {1}{0}}"
+#  condition = "${if match{$h_X-Spam-Flag}{YES} {1}{0}}"
+#  route_list = "* localhost byname"
+#  transport = devnull_transport
+#  verify = false
+
+
+spamrewrite_router:
+  driver = manualroute
+  domains = ${lookup mysql {SELECT SUBSTRING_INDEX(email,'@',-1) FROM mail_spamfilter WHERE email='${quote_mysql:$local_part}@${quote_mysql:$domain}'}{$value}}
+  senders = ! ${lookup mysql {SELECT DISTINCT MYSQL_WHITETABLE.address FROM MYSQL_WHITETABLE WHERE '${quote_mysql:$sender_address}' LIKE MYSQL_WHITETABLE.address}{$value}}
+  condition = ${if and { \
+    {>{$spam_score_int}{${lookup mysql {SELECT spam_rewrite_score_int FROM mail_spamfilter WHERE email='${quote_mysql:$local_part}@${quote_mysql:$domain}'}{$value}}}}\
+    {!eq {$received_protocol}{spam-rewrite}} \
+    {!eq {$received_protocol}{local}} \
+    }{true}{false}}
+  headers_remove = Subject
+  headers_add = Subject: ${lookup mysql {SELECT spam_rewrite_subject FROM mail_spamfilter WHERE email='${quote_mysql:$local_part}@${quote_mysql:$domain}'}{$value}} $header_subject
+  route_list = "* localhost byname"
+  transport = spamrewrite_transport
+  verify = false
+
+spamredirect_router:
+  driver = manualroute
+  domains = ${lookup mysql {SELECT SUBSTRING_INDEX(email,'@',-1) FROM mail_spamfilter WHERE email='${quote_mysql:$local_part}@${quote_mysql:$domain}'}{$value}}
+  senders = ! ${lookup mysql {SELECT DISTINCT MYSQL_WHITETABLE.address FROM MYSQL_WHITETABLE WHERE '${quote_mysql:$sender_address}' LIKE MYSQL_WHITETABLE.address}{$value}}
+  condition = ${if >{$spam_score_int}{${lookup mysql {SELECT spam_redirect_score_int FROM mail_spamfilter WHERE email='${quote_mysql:$local_part}@${quote_mysql:$domain}'}{$value}}}{true}{false}}
+  route_list = "* localhost byname"
+  transport = spamredirect_transport
+  verify = false
+
 spamdelete_router:
   driver = manualroute
-  domains = ${lookup mysql {SELECT SUBSTRING_INDEX(email,'@',-1) FROM MYSQL_EMAILTABLE WHERE email=CONCAT('${quote_mysql:$local_part}','@','${quote_mysql:$domain}') AND spamdelete = '1'}{$value}}
-  # condition = "${if eq{$h_X-Spam-Flag:}{YES} {1}{0}}"
-  condition = "${if match{$h_X-Spam-Flag}{YES} {1}{0}}"
+  domains = ${lookup mysql {SELECT SUBSTRING_INDEX(email,'@',-1) FROM mail_spamfilter WHERE email='${quote_mysql:$local_part}@${quote_mysql:$domain}'}{$value}}
+  senders = ! ${lookup mysql {SELECT DISTINCT MYSQL_WHITETABLE.address FROM MYSQL_WHITETABLE WHERE '${quote_mysql:$sender_address}' LIKE MYSQL_WHITETABLE.address}{$value}}
+  condition = ${if and { \
+    {>{$spam_score_int}{${lookup mysql {SELECT spam_delete_score_int FROM mail_spamfilter WHERE email='${quote_mysql:$local_part}@${quote_mysql:$domain}'}{$value}}}}\
+    {!eq {$received_protocol}{spam-rewrite}} \
+    {!eq {$received_protocol}{local}} \
+    }{true}{false}}
   route_list = "* localhost byname"
   transport = devnull_transport
   verify = false
-
 
 autoresponder_router:
   driver = accept
@@ -257,11 +366,6 @@
    data=${lookup mysql{ SELECT destination FROM mail_domain_catchall WHERE domain='${domain}'}}
    allow_fail
    allow_defer
-
-#domain_catchall_director:
-#  driver = redirect
-#  domains = ${lookup mysql {SELECT SUBSTRING_INDEX(email,'@',-1) FROM MYSQL_EMAILTABLE WHERE email=CONCAT('${quote_mysql:$local_part}','@') AND forward != ''}{$value}}
-#  data = ${lookup mysql {SELECT forward FROM MYSQL_EMAILTABLE WHERE email=CONCAT('${quote_mysql:$local_part}','@') AND forward != ''}{$value}}
       
 ######################################################################
 #                      TRANSPORTS CONFIGURATION                      #
@@ -272,26 +376,16 @@
 
 begin transports
 
+########################
+# Remote smtp transport
+########################
+
 remote_smtp:
   driver = smtp
 
-devnull_delivery:
-  driver = appendfile
-  file = /dev/null
-  group = mail
-
-address_pipe:
-  driver = pipe
-  return_output
-
-address_file:
-  driver = appendfile
-  delivery_date_add
-  envelope_to_add
-  return_path_add
-
-address_reply:
-  driver = autoreply
+###################
+# Mailman transport
+###################
 
 mailman_transport:
    driver = pipe
@@ -305,11 +399,15 @@
    user = ${lookup mysql{SELECT mm_user FROM mail_mailman_domain WHERE domain='${domain}'}}
    group = ${lookup mysql{SELECT mm_group FROM mail_mailman_domain WHERE domain='${domain}'}}
 
-spamcheck:
+
+#################################################################################
+# This transport is only for rewriting the header of the message with ***SPAM***
+#################################################################################
+
+spamrewrite_transport:
   driver = pipe
-  command = MAILSERVER_EXIM_BINARY -oMr spam-scanned -bS
+  command = MAILSERVER_EXIM_BINARY -oMr spam-rewrite -bS
   use_bsmtp = true
-  transport_filter = MAILSERVER_SPAMC_BINARY
   home_directory = "/tmp"
   current_directory = "/tmp"
   user = mail
@@ -320,6 +418,23 @@
   message_prefix =
   message_suffix =
 
+######################################################
+# This transport is only for redirecting SPAM messages
+######################################################
+
+spamredirect_transport:
+  driver = appendfile
+  directory = ${lookup mysql {SELECT concat(spam_redirect_maildir,'/Maildir') FROM mail_spamfilter WHERE email='${quote_mysql:$local_part}@${quote_mysql:$domain}'}{$value}}
+  maildir_format
+  user = mail
+  group = mail
+  mode = 0660
+  directory_mode = 0770
+
+##########################
+# Local delivery transport
+##########################
+
 local_delivery:
   driver = appendfile
   directory = ${lookup mysql {SELECT concat(maildir,'/Maildir') FROM MYSQL_EMAILTABLE WHERE email=CONCAT('${quote_mysql:$local_part}','@','${quote_mysql:$domain}')}{$value}}
@@ -328,7 +443,8 @@
   group = mail
   quota = ${lookup mysql{select quota from MYSQL_EMAILTABLE where email=CONCAT('${quote_mysql:$local_part}','@','${quote_mysql:$domain}')}{${value}M}}
   quota_is_inclusive = false
-  #quota_size_regex = ,S=(\d+):
+  maildir_tag = ,S=$message_size
+  quota_size_regex = ,S=(\d+):
   quota_warn_threshold = 75%
   maildir_use_size_file = false
   quota_warn_message = "To: $local_part@$domain\n\
@@ -340,20 +456,10 @@
 			Please take note of this and remove unwanted mail from your mailbox.\n"
   mode = 0660
   directory_mode = 0770
-  
-#mysql_delivery:
-#   driver = appendfile
-#   maildir_format
-#   directory = \
-#      ${lookup mysql{SELECT maildir FROM passwd \
-#      WHERE email='${local_part}@${domain}'}}
-#   user = \
-#      ${lookup mysql{SELECT uid FROM passwd \
-#      WHERE email='${local_part}@${domain}'}}
-#   group = \
-#      ${lookup mysql{SELECT gid FROM passwd \
-#      WHERE email='${local_part}@${domain}'}}
 
+##########################
+# autoresponder transport
+##########################
 
 autoresponder_transport:
   driver = autoreply
@@ -362,11 +468,16 @@
   subject = "Autoresponder: ${local_part}@${domain}"
   text = ${lookup mysql {SELECT autoresponder_text FROM MYSQL_EMAILTABLE WHERE email=CONCAT('${quote_mysql:$local_part}','@','${quote_mysql:$domain}')}{$value}}
 
+##########################
+# devnull transport
+##########################
+
 devnull_transport:
   driver = appendfile
   file = /dev/null
   user = mail
 
+
 ######################################################################
 #                      RETRY CONFIGURATION                           #
 ######################################################################

--
Gitblit v1.9.1