--- 4.5.23/exim.conf-SpamBlockerTechnology-v4.5.23.txt	2020-03-11 16:17:54.105108907 -0600
+++ 4.5.24/exim.conf-SpamBlockerTechnology-v4.5.24.txt	2020-06-13 11:25:00.723364364 -0600
@@ -1,4 +1,4 @@
-# SpamBlockerTechnology* powered exim.conf, Version 4.5.23
+# SpamBlockerTechnology* powered exim.conf, Version 4.5.24
 # August 15, 2018
 # Exim configuration file for DirectAdmin
 # Requires exim.pl as distributed by DirectAdmin here:
@@ -8,47 +8,47 @@
 # Dovecot/IMAP Mandatory
 # *SpamBlockerTechnology is a Trademark of NoBaloney Internet Services:
 # http://www.nobaloney.net
-# 
+#
 # WARNING! Do NOT use this exim.conf Exim configuration file unless you
 # make the required modifications to your Exim configuration
 # following the instructions in the README file included in this
 # distribution:
 # README-SpamBlockerVersion4exim.conf.txt
-# 
+#
 # The original exim.conf file distributed with Exim 4, includes the
 # following copyright notice:
-# 
+#
 # Copyright (C) 2002 University of Cambridge, Cambridge, UK
-# 
+#
 # Portions of the file are taken from the exim.conf file as
 # distributed with DirectAdmin (http://www.directadmin.com/)
-# 
+#
 # Copyright (C) 2003-2011 JBMC Software, St Albert, AB, Canada
-# 
+#
 # Portions of this file are written by NoBaloney Internet Services
 # and are copyright as follows:
-# 
+#
 # Copyright (C) 2004-2011 NoBaloney Internet Services, Riverside, Calif., USA
-# 
+#
 # The entire Exim 4 distribution, including the exim.conf file, is
 # distributed under the GNU GENERAL PUBLIC LICENSE, Version 2,
 # June 1991. If you do not have a copy of the GNU GENERAL PUBLIC LICENSE
 # you may download it, in it's entirety, from the website at:
-# 
+#
 # http://www.nobaloney.net/exim/gnu-gpl-v2.txt
-# 
+#
 # Thanks to all the members of the DirectAdmin community and of the exim
 # community who have given their # much needed and appreciated help.
-# 
+#
 # The most recent version of this file may always downloaded from the website
 # at: http://www.nobaloney.net/downloads/spamblocker
-# 
+#
 # MODIFICATION INSTRUCTIONS
-# 
+#
 # YOU MUST MAKE THE CHANGES TO THIS
 # SpamBlockerTechnology* powered exim.conf, Version 4.0
 # file as documented in the README file.
-# 
+#
 # The README file for this version is named:
 # README-SpamBlockerVersion4exim.conf.txt
 
@@ -353,7 +353,7 @@
 
   defer  message = DOMAIN_SUSPENDED
         domains = +local_domains
-        condition = ${if exists{/etc/virtual/${domain}_off}{yes}{no}}
+        condition = ${if exists{/etc/virtual/${domain_data}_off}{yes}{no}}
 
   drop  authenticated = *
         condition = ${if exists{BLACKLIST_USERNAMES}}
@@ -656,8 +656,8 @@
   driver = redirect
   allow_defer
   allow_fail
-  data = ${if exists{/etc/virtual/${domain}/majordomo/list.aliases}{${lookup{$local_part}lsearch{/etc/virtual/${domain}/majordomo/list.aliases}}}}
-  domains = lsearch;/etc/virtual/domainowners
+  domains = lsearch,ret=key;/etc/virtual/domainowners
+  data = ${if exists{/etc/virtual/${domain_data}/majordomo/list.aliases}{${lookup{$local_part}lsearch{/etc/virtual/${domain_data}/majordomo/list.aliases}}}}
   file_transport = address_file
   group = daemon
   pipe_transport = majordomo_pipe
@@ -672,8 +672,8 @@
   #condition = "${if eq {$received_protocol} {local} {true} {false} }"
   condition = "${if or { {eq {$received_protocol} {local}} \
                          {eq {$received_protocol} {spam-scanned}} } {true} {false} }"
-  data = ${if exists{/etc/virtual/${domain}/majordomo/private.aliases}{${lookup{$local_part}lsearch{/etc/virtual/${domain}/majordomo/private.aliases}}}}
-  domains = lsearch;/etc/virtual/domainowners
+  domains = lsearch,ret=key;/etc/virtual/domainowners
+  data = ${if exists{/etc/virtual/${domain_data}/majordomo/private.aliases}{${lookup{$local_part}lsearch{/etc/virtual/${domain_data}/majordomo/private.aliases}}}}
   file_transport = address_file
   group = daemon
   pipe_transport = majordomo_pipe
@@ -684,10 +684,11 @@
   driver = redirect
   allow_filter
   no_check_local_user
-  condition = "${if exists{/etc/virtual/${domain}/filter}{yes}{no}}"
+  domains = lsearch,ret=key;/etc/virtual/domainowners
+  condition = "${if exists{/etc/virtual/${domain_data}/filter}{yes}{no}}"
   user = "${lookup{$domain}lsearch{/etc/virtual/domainowners}{$value}}"
   group = "mail"
-  file = /etc/virtual/${domain}/filter
+  file = /etc/virtual/${domain_data}/filter
   directory_transport = address_file
   pipe_transport = virtual_address_pipe
   retry_use_local_part
@@ -696,10 +697,12 @@
 uservacation:
   # uservacation reply to all except errors, bounces, lists
   driver = accept
+  domains = lsearch,ret=key;/etc/virtual/domainowners
+  local_parts = ${if match {$local_part}{\N^\.*[^./][^/]*$\N}{${lookup{$local_part}lsearch,ret=key{/etc/virtual/$domain_data/passwd}{$value}{${lookup{$local_part}lsearch,ret=key{/etc/virtual/$domain_data/aliases}{$value}}}}}fail}
   condition = ${if def:h_Auto-submitted:{${if match{$h_Auto-submitted:}{\N^no\N\}{yes}{no}}}{yes}}
-  condition = ${lookup{$local_part} lsearch {/etc/virtual/${domain}/vacation.conf}{yes}{no}}
+  condition = ${lookup{$local_part} lsearch {/etc/virtual/${domain_data}/vacation.conf}{yes}{no}}
   condition = ${if match{$h_X-Spam-Status:}{\N^Yes\N}{no}{yes}}
-  require_files = /etc/virtual/${domain}/reply/${local_part}.msg
+  require_files = /etc/virtual/${domain_data}/reply/${local_part_data}.msg
   # do not reply to errors and bounces or lists
   senders = " ! ^.*-request@.*:\
               ! ^owner-.*@.*:\
@@ -714,15 +717,17 @@
 #both passwd and forwarders do not have local_part.
 userautoreply:
   driver = accept
+  domains = lsearch,ret=key;/etc/virtual/domainowners
+  local_parts = ${if match {$local_part}{\N^\.*[^./][^/]*$\N}{${lookup{$local_part}lsearch,ret=key{/etc/virtual/$domain_data/passwd}{$value}{${lookup{$local_part}lsearch,ret=key{/etc/virtual/$domain_data/aliases}{$value}}}}}fail}
   condition = ${if def:h_Auto-submitted:{${if match{$h_Auto-submitted:}{\N^no\N\}{yes}{no}}}{yes}}
-  condition = ${lookup{$local_part} lsearch {/etc/virtual/${domain}/autoresponder.conf}{yes}{no}}
+  condition = ${lookup{$local_part} lsearch {/etc/virtual/${domain_data}/autoresponder.conf}{yes}{no}}
   condition = ${if match{$h_X-Spam-Status:}{\N^Yes\N}{no}{yes}}
-  require_files = /etc/virtual/${domain}/reply/${local_part}.msg
+  require_files = /etc/virtual/${domain_data}/reply/${local_part_data}.msg
 
-  condition = ${if exists{/etc/virtual/${domain}/passwd}}
-  condition = ${if exists{/etc/virtual/${domain}/aliases}}  
-  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain}/passwd}{no}{yes}}
-  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain}/aliases}{no}{yes}}
+  condition = ${if exists{/etc/virtual/${domain_data}/passwd}}
+  condition = ${if exists{/etc/virtual/${domain_data}/aliases}}
+  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain_data}/passwd}{no}{yes}}
+  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain_data}/aliases}{no}{yes}}
 
   # do not reply to errors and bounces or lists
   senders = " ! ^.*-request@.*:\
@@ -737,10 +742,11 @@
 #either passwd or forwarders exist, failover from above.
 userautoreply_unseen:
   driver = accept
+  domains = lsearch,ret=key;/etc/virtual/domainowners
   condition = ${if def:h_Auto-submitted:{${if match{$h_Auto-submitted:}{\N^no\N\}{yes}{no}}}{yes}}
-  condition = ${lookup{$local_part} lsearch {/etc/virtual/${domain}/autoresponder.conf}{yes}{no}}
+  condition = ${lookup{$local_part} lsearch {/etc/virtual/${domain_data}/autoresponder.conf}{yes}{no}}
   condition = ${if match{$h_X-Spam-Status:}{\N^Yes\N}{no}{yes}}
-  require_files = /etc/virtual/${domain}/reply/${local_part}.msg
+  require_files = /etc/virtual/${domain_data}/reply/${local_part_data}.msg
   # do not reply to errors and bounces or lists
   senders = " ! ^.*-request@.*:\
               ! ^owner-.*@.*:\
@@ -768,11 +774,11 @@
 #user exists
 virtual_user_unseen:
   driver = accept
-  condition = ${if exists{/etc/virtual/${domain}/passwd}{1}{0}}
-  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain}/aliases}{1}{0}}
-  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain}/aliases}{${if eq{$value}{$local_part}{0}{1}}}{0}}
+  domains = lsearch,ret=key;/etc/virtual/domainowners
+  condition = ${if exists{/etc/virtual/${domain_data}/passwd}{1}{0}}
+  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain_data}/aliases}{1}{0}}
+  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain_data}/aliases}{${if eq{$value}{$local_part}{0}{1}}}{0}}
   condition = ${perl{save_virtual_user}}
-  domains = lsearch;/etc/virtual/domainowners
   group = mail
   .include_if_exists /etc/exim/local_part_suffix.conf
   retry_use_local_part
@@ -786,10 +792,11 @@
   .include_if_exists /etc/exim.srs.forward.conf
   allow_defer
   allow_fail
-  condition = ${if exists{/etc/virtual/${domain}/passwd}{1}{0}}
-  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain}/aliases}{1}{0}}
-  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain}/passwd}{0}{1}}
-  data = ${lookup{$local_part}lsearch{/etc/virtual/$domain/aliases}}
+  domains = lsearch,ret=key;/etc/virtual/domainowners
+  condition = ${if exists{/etc/virtual/${domain_data}/passwd}{1}{0}}
+  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain_data}/aliases}{1}{0}}
+  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain_data}/passwd}{0}{1}}
+  data = ${lookup{$local_part}lsearch{/etc/virtual/$domain_data/aliases}}
   file_transport = address_file
   group = mail
   pipe_transport = virtual_address_pipe
@@ -800,10 +807,10 @@
 #user exists
 virtual_user:
   driver = accept
-  condition = ${if exists{/etc/virtual/${domain}/passwd}{1}{0}}
-  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain}/aliases}{0}{1}}
+  domains = lsearch,ret=key;/etc/virtual/domainowners
+  condition = ${if exists{/etc/virtual/${domain_data}/passwd}{1}{0}}
+  condition = ${lookup{$local_part}lsearch{/etc/virtual/${domain_data}/aliases}{0}{1}}
   condition = ${perl{save_virtual_user}}
-  domains = lsearch;/etc/virtual/domainowners
   group = mail
   retry_use_local_part
   transport = dovecot_lmtp_udp
@@ -817,7 +824,8 @@
   .include_if_exists /etc/exim.srs.forward.conf
   allow_defer
   allow_fail
-  data = ${if exists{/etc/virtual/$domain/aliases}{${lookup{$local_part}lsearch*{/etc/virtual/$domain/aliases}}}}
+  domains = lsearch,ret=key;/etc/virtual/domainowners
+  data = ${if exists{/etc/virtual/$domain_data/aliases}{${lookup{$local_part}lsearch*{/etc/virtual/$domain_data/aliases}}}}
   file_transport = address_file
   group = mail
   pipe_transport = virtual_address_pipe
@@ -829,7 +837,8 @@
   driver = redirect
   allow_defer
   allow_fail
-  data = ${if exists{/etc/virtual/$domain/aliases}{${lookup{$local_part}lsearch{/etc/virtual/$domain/aliases}}}}
+  domains = lsearch,ret=key;/etc/virtual/domainowners
+  data = ${if exists{/etc/virtual/$domain_data/aliases}{${lookup{$local_part}lsearch{/etc/virtual/$domain_data/aliases}}}}
   file_transport = devnull
   group = mail
   pipe_transport = devnull
@@ -920,55 +929,55 @@
   delivery_date_add
   directory_mode = 770
   envelope_to_add
-  directory = "${extract{5}{:}{${lookup{${lookup{$domain}lsearch*{/etc/virtual/domainowners}{$value}}}lsearch{/etc/passwd}{$value}}}}/imap/${domain}/${local_part}/Maildir"
+  directory = "${extract{5}{:}{${lookup{${lookup{$domain}lsearch*{/etc/virtual/domainowners}{$value}}}lsearch{/etc/passwd}{$value}}}}/imap/${domain_data}/${local_part_data}/Maildir"
   maildir_format
   group = mail
   mode = 660
   return_path_add
   user = "${lookup{$domain}lsearch*{/etc/virtual/domainowners}{$value}}"
-  quota = ${if exists{/etc/virtual/${domain}/quota}{${lookup{$local_part}lsearch*{/etc/virtual/${domain}/quota}{$value}{0}}}{0}}
+  quota = ${if exists{/etc/virtual/${domain}/quota}{${lookup{$local_part}lsearch*{/etc/virtual/${domain_data}/quota}{$value}{0}}}{0}}
   .include_if_exists /etc/exim/virtual_localdelivery.conf.post
 
 #EDIT#58:
 uservacation:
   driver = autoreply
-  file = /etc/virtual/${domain}/reply/${local_part}.msg
+  file = /etc/virtual/${domain_data}/reply/${local_part_data}.msg
   from = "${local_part}@${domain}"
-  log = /etc/virtual/${domain}/reply/${local_part}.log
+  log = /etc/virtual/${domain_data}/reply/${local_part_data}.log
   no_return_message
-  headers = ${if exists{/etc/virtual/${domain}/reply/${local_part}.headers}{${readfile{/etc/virtual/${domain}/reply/${local_part}.headers}}}}
+  headers = ${if exists{/etc/virtual/${domain_data}/reply/${local_part_data}.headers}{${readfile{/etc/virtual/${domain_data}/reply/${local_part_data}.headers}}}}
   subject = ${if def:h_Subject: {\
-                ${if exists{/etc/virtual/${domain}/reply/${local_part}.subject}\
-                    {${readfile{/etc/virtual/${domain}/reply/${local_part}.subject}{}}}\
+                ${if exists{/etc/virtual/${domain_data}/reply/${local_part_data}.subject}\
+                    {${readfile{/etc/virtual/${domain_data}/reply/${local_part_data}.subject}{}}}\
                     {Autoreply}\
                 }: ${quote:${escape:${length_60:$h_Subject:}}}}\
                 {I am on vacation}}
   to = "${reply_address}"
   user = mail
-  once = /etc/virtual/${domain}/reply/${local_part}.once
+  once = /etc/virtual/${domain_data}/reply/${local_part_data}.once
   once_file_size = 100K
-  once_repeat = ${if exists{/etc/virtual/${domain}/reply/${local_part}.once_time}{${readfile{/etc/virtual/${domain}/reply/${local_part}.once_time}{}}}{2d}}
+  once_repeat = ${if exists{/etc/virtual/${domain_data}/reply/${local_part_data}.once_time}{${readfile{/etc/virtual/${domain_data}/reply/${local_part_data}.once_time}{}}}{2d}}
 
 #COMMENT#59:
 userautoreply:
   driver = autoreply
-  bcc = ${lookup{${local_part}} lsearch {/etc/virtual/${domain}/autoresponder.conf}{$value}}
-  file = /etc/virtual/${domain}/reply/${local_part}.msg
+  bcc = ${lookup{${local_part}} lsearch {/etc/virtual/${domain_data}/autoresponder.conf}{$value}}
+  file = /etc/virtual/${domain}/reply/${local_part_data}.msg
   from = "${local_part}@${domain}"
-  log = /etc/virtual/${domain}/reply/${local_part}.log
+  log = /etc/virtual/${domain_data}/reply/${local_part_data}.log
   no_return_message
-  headers = ${if exists{/etc/virtual/${domain}/reply/${local_part}.headers}{${readfile{/etc/virtual/${domain}/reply/${local_part}.headers}}}}
+  headers = ${if exists{/etc/virtual/${domain_data}/reply/${local_part_data}.headers}{${readfile{/etc/virtual/${domain_data}/reply/${local_part_data}.headers}}}}
   subject = ${if def:h_Subject: {\
-                ${if exists{/etc/virtual/${domain}/reply/${local_part}.subject}\
-                    {${readfile{/etc/virtual/${domain}/reply/${local_part}.subject}{}}}\
+                ${if exists{/etc/virtual/${domain_data}/reply/${local_part_data}.subject}\
+                    {${readfile{/etc/virtual/${domain_data}/reply/${local_part_data}.subject}{}}}\
                     {Autoreply}\
                 }: ${quote:${escape:${length_60:$h_Subject:}}}}\
                 {Autoreply Message}}
   to = "${reply_address}"
   user = mail
-  once = /etc/virtual/${domain}/reply/${local_part}.once
+  once = /etc/virtual/${domain_data}/reply/${local_part_data}.once
   once_file_size = 100K
-  once_repeat = ${if exists{/etc/virtual/${domain}/reply/${local_part}.once_time}{${readfile{/etc/virtual/${domain}/reply/${local_part}.once_time}{}}}{2d}}
+  once_repeat = ${if exists{/etc/virtual/${domain_data}/reply/${local_part_data}.once_time}{${readfile{/etc/virtual/${domain_data}/reply/${local_part_data}.once_time}{}}}{2d}}
 
 #COMMENT#60:
 devnull:
