1use strict;
2
3## A CONFIGURATION FILE FOR AMAVISD-NEW, LISTING ALL CONFIGURATION VARIABLES
4## WITH THEIR DEFAULT VALUES (FOR REFERENCE ONLY, NON-AUTHORITATIVE)
5
6## The 'after-default' comment indicates that these variables obtain their
7## default value if the config file left them undefined. It means these values
8## are not yet available during processing of the configuration file, but that
9## they can derive their value from other configurations variables no matter
10## where in the configuration file they appear.
11
12
13## GENERAL
14
15# $myhostname = ... predefined default from uname(3), must be a FQDN
16# $mydomain   = ... no useful default, should be set if used in expressions
17# $snmp_contact  = '';
18# $snmp_location = '';
19# $daemon_user   = undef;
20# $daemon_group  = undef;
21# $MYHOME        = '/var/amavis';
22# $TEMPBASE      = $MYHOME;                # after-default
23# $db_home       = "$MYHOME/db";           # after-default
24# $pid_file      = "$MYHOME/amavisd.pid";  # after-default
25# $lock_file     = undef;
26# $daemon_chroot_dir = undef;
27# $max_requests = 20;    # retire a child after that many accepts
28# $max_servers = 2;      # number of pre-forked children
29# $min_servers       = undef;  # see Net::Server::Prefork for semantics
30# $min_spare_servers = undef;
31# $max_spare_servers = undef;
32# $child_timeout = 8*60;
33# $localpart_is_case_sensitive = 0;
34# $enable_db = undef;
35# $enable_zmq = undef;
36# @zmq_sockets = ( "ipc://$MYHOME/amavisd-zmq.sock" );  # after-default
37# $nanny_details_level = 1;  # verbosity: 0, 1, 2
38# @additional_perl_modules = ();
39# @local_domains_maps=(\%local_domains,\@local_domains_acl,\$local_domains_re);
40# @mynetworks = qw( 127.0.0.0/8 [::1] 169.254.0.0/16 [fe80::]/10
41#                   10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 [fc00::]/7 );
42# @mynetworks_maps = (\@mynetworks);
43# @client_ipaddr_policy = map { $_ => 'MYNETS' } @mynetworks_maps;
44# $mail_digest_algorithm = 'MD5';
45# $mail_part_digest_algorithm = 'SHA1';
46
47
48## LOGGING AND DEBUGGING
49
50# $log_level = 0;
51# $logfile = undef;
52# $do_syslog = undef;  # same as 0
53# $syslog_ident = 'amavis';
54# $syslog_facility = 'mail';
55# $logline_maxlen = 980;
56# enable_log_capture_dump = undef;
57
58# $log_short_templ   ... built-in default at the end of file amavisd
59# $log_verbose_templ ... built-in default at the end of file amavisd
60# $log_recip_templ = ... built-in default at the end of file amavisd
61# $log_templ = $log_short_templ;
62
63# @debug_sender_acl = ();
64# @debug_sender_maps = (\@debug_sender_acl);
65# @debug_recipient_maps = ();
66# $sa_debug = undef;
67# $allow_preserving_evidence = 1;
68
69
70## DKIM VERIFICATION
71
72# $enable_dkim_verification = undef;
73# $reputation_factor = 0.2;
74# @signer_reputation_maps = ();
75# @author_to_policy_bank_maps = ();
76# $dkim_minimum_key_bits = 1024;
77# $myauthservid = $myhostname;  # after-default (RFC 5451)
78# $dkim_minimum_key_bits = 1024;
79
80## DKIM SIGNING
81
82# $enable_dkim_signing = undef;
83# %dkim_signing_keys = ();
84# @dkim_signature_options_bysender_maps = ();
85# $dkim_signing_service = undef;
86#
87# for (qw(Accept-Language Archived-At Auto-Submitted Content-Alternative
88#         Content-Base Content-Class Content-Description Content-Disposition
89#         Content-Duration Content-Features Content-Id Content-Language
90#         Content-Location Content-MD5 Content-Transfer-Encoding In-Reply-To
91#         List-Archive List-Help List-Id List-Owner List-Post List-Subscribe
92#         List-Unsubscribe Message-Context Message-ID MIME-Version
93#         Organisation Organization Original-Message-ID Pics-Label
94#         Precedence Received References Reply-To Resent-Date Resent-From
95#         Resent-Message-ID Resent-Sender Sensitivity Solicitation
96#         User-Agent VBR-Info X-Mailer))   { $signed_header_fields{lc $_} = 1 }
97# for (qw(From Date Subject Content-Type)) { $signed_header_fields{lc $_} = 2 }
98
99
100## MTA INTERFACE - INPUT
101
102# @listen_sockets =  ... $unix_socketname and $inet_socket_port are added here
103# $unix_socketname  = undef; # Unix socket to accept amavis helper protocol
104# $unix_socket_mode = undef; # sets sockets protection (numeric mode), or undef
105# $inet_socket_port = undef; # accept connections on this TCP port(s) (SMTP...)
106# $inet_socket_bind = [ '127.0.0.1', '[::1]' ];  # if both inet & inet6 avail.
107#   $inet_socket_bind = '127.0.0.1';             # if only inet available
108#   $inet_socket_bind = '[::1]'                  # if only inet6 available
109# @inet_acl = qw( 127.0.0.1 [::1] );
110# $listen_queue_size = undef;
111
112# $protocol = ... defaults to 'SMTP' or 'LMTP' (autodetected) on inet and inet6
113#             sockets; must be configured explicitly for Unix sockets.
114#             Possible values: 'SMTP', 'LMTP', 'AM.PDP',
115#             and with appropriate patches applied also: 'COURIER' or 'QMQPqq'
116
117# $soft_bounce = undef;
118# $smtpd_timeout = 8*60;
119# $smtpd_recipient_limit = 1100;
120# $smtpd_message_size_limit = undef;  # site-wide limit
121# @message_size_limit_maps = ();      # per-recipient limits
122# $smtpd_greeting_banner = '${helo-name} ${protocol} ${product} service ready';
123# $smtpd_quit_banner = '${helo-name} ${product} closing transmission channel';
124# $auth_required_inp = undef;
125# $auth_required_release = 1;
126# @auth_mech_avail=(); # empty list disables incoming AUTH; or: qw(PLAIN LOGIN)
127# $smtp_connection_cache_on_demand = 1;
128# $smtp_connection_cache_enable = 1;
129# $enforce_smtpd_message_size_limit_64kb_min = 1;
130# @smtpd_discard_ehlo_keywords = ();
131
132# $tls_security_level_in = undef;  # undef, 'may', 'encrypt', ...
133# $smtpd_tls_key_file = undef;   # deprecated, use 'SSL_key_file' below
134# $smtpd_tls_cert_file = undef;  # deprecated, use 'SSL_cert_file' below
135# %smtpd_tls_server_options = (
136#   SSL_verifycn_scheme => 'smtp',
137#   SSL_session_cache => 2,
138# # SSL_key_file  => "...",   # default taken from $smtpd_tls_key_file
139# # SSL_cert_file => "...",   # default taken from $smtpd_tls_cert_file
140# );
141
142
143## MTA INTERFACE - OUTPUT
144
145## see also $notify_method, $forward_method and $*_quarantine_method
146
147# $localhost_name = 'localhost'; # my EHLO name, and inserted in Received
148# $local_client_bind_address = undef;  # my source IP address as a SMTP client
149# $auth_required_out = undef;
150# $amavis_auth_user  = undef;    # for submitting notifications and quarantine
151# $amavis_auth_pass  = undef;
152# $auth_reauthenticate_forwarded = undef; # our credentials for forwarding too
153
154# $tls_security_level_out = undef;  # undef, 'may', 'encrypt', ...
155# %smtp_tls_client_options = (
156#   SSL_verifycn_scheme => 'smtp',
157# );
158
159
160## MAIL FORWARDING
161
162# $forward_method = 'smtp:[127.0.0.1]:10025';  # may be arrayref
163#              # or 'smtp:[::1]:10025' when INET6 is available
164# @forward_method_maps = ( sub { Opaque(c('forward_method')) } );
165# $resend_method = undef;  # falls back to $forward_method
166# $always_bcc = undef;
167
168# $final_virus_destiny  = D_DISCARD;  # subj to @viruses_that_fake_sender_maps
169# $final_banned_destiny = D_DISCARD;
170# $final_spam_destiny   = D_PASS;     # subject to $sa_dsn_cutoff_level
171# $final_bad_header_destiny = D_PASS;
172
173
174## QUARANTINE
175
176# $release_method = undef;  # falls back to $notify_method
177# $requeue_method = 'smtp:[127.0.0.1]:25';
178#              # or 'smtp:[::1]:25' when INET6 is available
179# $release_format = 'resend';  # (dsn), (arf), attach,  plain,  resend
180# $report_format  = 'arf';     # (dsn),  arf,  attach,  plain,  resend
181# $attachment_password = ''; # '': no pwd, undef: PIN, code ref, or static str
182# $attachment_email_name = 'msg-%m.eml';
183# $attachment_outer_name = 'msg-%m.zip';
184
185# $virus_quarantine_method        = 'local:virus-%m';
186# $spam_quarantine_method         = 'local:spam-%m.gz';
187# $banned_files_quarantine_method = 'local:banned-%m';
188# $bad_header_quarantine_method   = 'local:badh-%m';
189# $clean_quarantine_method   = undef;
190# $archive_quarantine_method = undef;
191
192# $mail_id_size_bits = 72;
193
194# $QUARANTINEDIR = undef;
195# $quarantine_subdir_levels = undef;  # 0 or 1  (undef treated as 0)
196# $sql_quarantine_chunksize_max;  # see SQL section
197
198# $virus_quarantine_to     = 'virus-quarantine';  # via %local_delivery_aliases
199# $banned_quarantine_to    = 'banned-quarantine';
200# $bad_header_quarantine_to= 'bad-header-quarantine';
201# $spam_quarantine_to      = 'spam-quarantine';
202# $spam_quarantine_bysender_to = undef;
203# $clean_quarantine_to     = 'clean-quarantine';
204# $archive_quarantine_to   = 'archive-quarantine';
205
206# @virus_quarantine_to_maps      = (\$virus_quarantine_to);
207# @banned_quarantine_to_maps     = (\$banned_quarantine_to);
208# @bad_header_quarantine_to_maps = (\$bad_header_quarantine_to);
209# @spam_quarantine_to_maps       = (\$spam_quarantine_to);
210# @spam_quarantine_bysender_to_maps = (\$spam_quarantine_bysender_to);
211# @clean_quarantine_to_maps      = (\$clean_quarantine_to);
212# @archive_quarantine_to_maps    = (\$archive_quarantine_to);
213
214# %local_delivery_aliases  ... predefined, used by a delivery method 'local:'
215# $mailfrom_to_quarantine = undef;  # undef keeps original sender
216
217
218## NOTIFICATIONS (DSN, admin, recip)
219
220# $notify_method  = 'smtp:[127.0.0.1]:10025';
221#              # or 'smtp:[::1]:10025' when INET6 is available
222
223# $propagate_dsn_if_possible = 1;
224# $terminate_dsn_on_notify_success = 0;
225
226# $newvirus_admin = undef;
227# $virus_admin = undef;
228# $spam_admin = undef;
229# $banned_admin = undef;
230# $bad_header_admin = undef;
231
232# $dsn_bcc = undef;
233
234# @newvirus_admin_maps   = (\$newvirus_admin);
235# @virus_admin_maps      = (\%virus_admin, \$virus_admin);
236# @banned_admin_maps     = (\$banned_admin);
237# @spam_admin_maps       = (\%spam_admin,  \$spam_admin);
238# @bad_header_admin_maps = (\$bad_header_admin);
239
240# $hdr_encoding = 'UTF-8';  # header field bodies charset
241# $bdy_encoding = 'UTF-8';  # notification body text charset
242# $hdr_encoding_qb = 'Q';   # quoted-printable (Q or B)
243
244# $notify_sender_templ       = ... built-in default at the end of file amavisd
245# $notify_virus_sender_templ = ... built-in default at the end of file amavisd
246# $notify_spam_sender_templ  = ... built-in default at the end of file amavisd
247# $notify_virus_admin_templ  = ... built-in default at the end of file amavisd
248# $notify_spam_admin_templ   = ... built-in default at the end of file amavisd
249# $notify_virus_recips_templ = ... built-in default at the end of file amavisd
250# $notify_spam_recips_templ  = ... built-in default at the end of file amavisd
251# $notify_release_templ      = ... built-in default at the end of file amavisd
252# $notify_report_templ       = ... built-in default at the end of file amavisd
253
254# $mailfrom_notify_admin = undef;
255# $mailfrom_notify_recip = undef;
256# $mailfrom_notify_spamadmin = undef;
257
258## these are after-defaults:
259# $hdrfrom_notify_sender = "\"Content-filter at $myhostname\" <postmaster\@$myhostname>";
260# $hdrfrom_notify_recip     = ... derived from $mailfrom_notify_recip
261# $hdrfrom_notify_admin     = ... derived from $mailfrom_notify_admin
262# $hdrfrom_notify_spamadmin = ... derived from $mailfrom_notify_spamadmin
263# $hdrfrom_notify_release   = $hdrfrom_notify_sender;
264# $hdrfrom_notify_report    = $hdrfrom_notify_sender;
265
266# $warnbannedsender = undef;
267# $warnbadhsender   = undef;
268
269# $warn_offsite     = undef;
270
271# $warnvirusrecip   = undef;
272# $warnbannedrecip  = undef;
273# $warnbadhrecip    = undef;
274# @warnvirusrecip_maps  = (\$warnvirusrecip);
275# @warnbannedrecip_maps = (\$warnbannedrecip);
276# @warnbadhrecip_maps   = (\$warnbadhrecip);
277
278
279## MODIFICATIONS TO PASSED MAIL
280
281# %allowed_added_header_fields = ...;     # built-in default
282# %prefer_our_added_header_fields = ...;  # built-in default
283# $remove_existing_x_scanned_headers = 0;
284# $remove_existing_spam_headers = 1;
285# @remove_existing_spam_headers_maps = (\$remove_existing_spam_headers);
286# $allow_fixing_improper_header = 1;   # all-white folding lines and long lines
287# $allow_fixing_improper_header_folding = 1;
288# $allow_fixing_long_header_lines = 1;
289# $prepend_header_fields_hdridx = 0;
290
291# $X_HEADER_TAG  = 'X-Virus-Scanned';               # after-default
292# $X_HEADER_LINE = "$myproduct_name at $mydomain";  # after-default
293
294# $defang_virus  = undef;
295# $defang_banned = undef;
296# $defang_spam   = undef;
297# $defang_bad_header = undef;
298# $defang_undecipherable = undef;
299# $defang_all    = undef;  # mostly for testing
300
301# $allow_disclaimers = undef;
302# $outbound_disclaimers_only = undef;
303# $enable_anomy_sanitizer = 0;
304# @anomy_sanitizer_args = ();   # a config file or list of var=value pairs
305# $altermime = 'altermime';     # a path to the program
306# @altermime_args_defang     = qw(--verbose --removeall);
307# @altermime_args_disclaimer = qw(--disclaimer=/etc/altermime-disclaimer.txt);
308# @disclaimer_options_bysender_maps = ();
309
310# $undecipherable_subject_tag = '***UNCHECKED*** ';
311# $sa_spam_subject_tag = undef;
312# $sa_spam_level_char = '*';
313
314# @spam_subject_tag_maps  = (\$sa_spam_subject_tag1); # N.B.: inconsistent name
315# @spam_subject_tag2_maps = (\$sa_spam_subject_tag);  # N.B.: inconsistent name
316# @spam_subject_tag3_maps = ();
317
318
319## ADDING ADDRESS EXTENSIONS TO RECIPIENTS - 'plus addressing'
320
321# $recipient_delimiter = undef;
322# $replace_existing_extension = 1;
323# $addr_extension_virus  = undef;
324# $addr_extension_banned = undef;
325# $addr_extension_spam   = undef;
326# $addr_extension_bad_header = undef;
327# @addr_extension_virus_maps      = (\$addr_extension_virus);
328# @addr_extension_banned_maps     = (\$addr_extension_banned);
329# @addr_extension_spam_maps       = (\$addr_extension_spam);
330# @addr_extension_bad_header_maps = (\$addr_extension_bad_header);
331
332
333## MAIL DECODING
334
335# $bypass_decode_parts = undef;
336
337# $keep_decoded_original_re = undef;
338# @keep_decoded_original_maps = (\$keep_decoded_original_re);
339
340# $map_full_type_to_short_type_re = ... predefined lookup table, see source
341# @map_full_type_to_short_type_maps = (\$map_full_type_to_short_type_re);
342
343# $MAXLEVELS = undef;
344# $MAXFILES  = undef;
345# $MIN_EXPANSION_QUOTA = undef;
346# $MAX_EXPANSION_QUOTA = undef;
347# $MIN_EXPANSION_FACTOR =   5;  # times original mail size
348# $MAX_EXPANSION_FACTOR = 500;  # times original mail size
349
350# $path = undef;
351# $file = 'file';
352
353# For backward compatibility the @decoders list defaults to use of legacy
354# variables $gzip, $bzip2, $lzop, ...  It is cleaner to explicitly assign
355# a list to @decoders in amavisd.conf and directly specify program paths,
356# without indirections through legacy variables $gzip, etc.
357#
358# $gzip = $bzip2 = $lzop = $rpm2cpio = undef;
359# $uncompress = $unfreeze = $arc = $unarj = $unrar = undef;
360# $zoo = $lha = $pax = $cpio = $cabextract = undef;
361#
362# @decoders = (
363#   ['mail', \&do_mime_decode],
364### [[qw(asc uue hqx ync)], \&do_ascii],  # not safe
365#   ['F',    \&do_uncompress, \$unfreeze],
366#   ['Z',    \&do_uncompress, \$uncompress],
367#   ['gz',   \&do_uncompress, \$gunzip],
368#   ['gz',   \&do_gunzip],
369#   ['bz2',  \&do_uncompress, \$bunzip2],
370#   ['xz',   \&do_uncompress,
371#            ['xzdec', 'xz -dc', 'unxz -c', 'xzcat'] ],
372#   ['lzma', \&do_uncompress,
373#            ['lzmadec', 'xz -dc --format=lzma',
374#             'lzma -dc', 'unlzma -c', 'lzcat', 'lzmadec'] ],
375#   ['lrz',  \&do_uncompress,
376#            ['lrzip -q -k -d -o -', 'lrzcat -q -k'] ],
377#   ['lzo',  \&do_uncompress, \$unlzop],
378#   ['lz4',  \&do_uncompress, ['lz4c -d'] ],
379#   ['rpm',  \&do_uncompress, \$rpm2cpio],
380#   [['cpio','tar'], \&do_pax_cpio, \$pax],
381### ['tar',  \&do_tar],  # no longer supported
382#   ['deb',  \&do_ar, \$ar],
383### ['a',    \&do_ar, \$ar],  # unpacking .a seems an overkill
384#   ['rar',  \&do_unrar, \$unrar],
385#   ['arj',  \&do_unarj, \$unarj],
386#   ['arc',  \&do_arc,   \$arc],
387#   ['zoo',  \&do_zoo,   \$zoo],
388#   ['doc',  \&do_ole,   \$ripole],
389#   ['cab',  \&do_cabextract, \$cabextract],
390#   ['tnef', \&do_tnef_ext, \$tnef],
391#   ['tnef', \&do_tnef],
392### ['lha',  \&do_lha,   \$lha],  # not safe, use 7z instead
393### ['sit',  \&do_unstuff, \$unstuff],  # not safe
394#   [['zip','kmz'], \&do_7zip,  ['7za', '7z'] ],
395#   [['zip','kmz'], \&do_unzip],
396#   ['7z',   \&do_7zip,  ['7zr', '7za', '7z'] ],
397#   [[qw(gz bz2 Z tar)],
398#            \&do_7zip,  ['7za', '7z'] ],
399#   [[qw(xz lzma jar cpio arj rar swf lha iso cab deb rpm)],
400#            \&do_7zip,  '7z' ],
401#   ['exe',  \&do_executable, \$unrar, \$lha, \$unarj],
402# );
403
404
405## ANTI-VIRUS AND INVALID/FORBIDDEN CONTENTS CONTROLS
406
407# @av_scanners = ();
408# @av_scanners_backup = ();
409# $first_infected_stops_scan = undef;
410# $virus_scanners_failure_is_fatal = undef;
411
412# $viruses_that_fake_sender_re = undef;
413# @viruses_that_fake_sender_maps = (\$viruses_that_fake_sender_re, 1);
414# @virus_name_to_policy_bank_maps = ();
415#
416# @virus_name_to_spam_score_maps =
417#  (new_RE(  # the order matters, first match wins
418#   [ qr'^Structured\.(SSN|CreditCardNumber)\b'            => 0.1 ],
419#   [ qr'^(Heuristics\.)?Phishing\.'                       => 0.1 ],
420#   [ qr'^(Email|HTML)\.Phishing\.(?!.*Sanesecurity)'      => 0.1 ],
421#   [ qr'^Sanesecurity\.(Malware|Rogue|Trojan)\.' => undef ],# keep as infected
422#   [ qr'^Sanesecurity\.Foxhole\.Zip_exe'                  => 0.1 ], # F.P.
423#   [ qr'^Sanesecurity\.Foxhole\.'                => undef ],# keep as infected
424#   [ qr'^Sanesecurity\.'                                  => 0.1 ],
425#   [ qr'^Sanesecurity_PhishBar_'                          => 0   ],
426#   [ qr'^Sanesecurity.TestSig_'                           => 0   ],
427#   [ qr'^Email\.Spam\.Bounce(\.[^., ]*)*\.Sanesecurity\.' => 0   ],
428#   [ qr'^Email\.Spammail\b'                               => 0.1 ],
429#   [ qr'^MSRBL-(Images|SPAM)\b'                           => 0.1 ],
430#   [ qr'^VX\.Honeypot-SecuriteInfo\.com\.Joke'            => 0.1 ],
431#   [ qr'^VX\.not-virus_(Hoax|Joke)\..*-SecuriteInfo\.com(\.|\z)' => 0.1 ],
432#   [ qr'^Email\.Spam.*-SecuriteInfo\.com(\.|\z)'          => 0.1 ],
433#   [ qr'^Safebrowsing\.'                                  => 0.1 ],
434#   [ qr'^winnow\.(phish|spam)\.'                          => 0.1 ],
435#   [ qr'^INetMsg\.SpamDomain'                             => 0.1 ],
436#   [ qr'^Doppelstern\.(Spam|Scam|Phishing|Junk|Lott|Loan)'=> 0.1 ],
437#   [ qr'^Bofhland\.Phishing'                              => 0.1 ],
438#   [ qr'^ScamNailer\.'                                    => 0.1 ],
439#   [ qr'^HTML/Bankish'                                    => 0.1 ],  # F-Prot
440#   [ qr'^PORCUPINE_JUNK'                                  => 0.1 ],
441#   [ qr'^PORCUPINE_PHISHING'                              => 0.1 ],
442#   [ qr'^Porcupine\.Junk'                                 => 0.1 ],
443#   [ qr'^PhishTank\.Phishing\.'                           => 0.1 ],
444#   [ qr'-SecuriteInfo\.com(\.|\z)'         => undef ],  # keep as infected
445#   [ qr'^MBL_NA\.UNOFFICIAL'               => 0.1 ],    # false positives
446#   [ qr'^MBL_'                             => undef ],  # keep as infected
447# ));
448
449# @banned_filename_maps = ( 'DEFAULT' );
450# %banned_rules = ( 'DEFAULT' => $banned_filename_re);  # after-default
451# $banned_filename_re = undef;  # traditional
452# $banned_namepath_re = undef;  # regexp-style
453
454# @bypass_virus_checks_maps = (\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
455# @bypass_banned_checks_maps = (\%bypass_banned_checks, \@bypass_banned_checks_acl, \$bypass_banned_checks_re);
456# @bypass_header_checks_maps = (\%bypass_header_checks, \@bypass_header_checks_acl, \$bypass_header_checks_re);
457
458# @virus_lovers_maps = (\%virus_lovers, \@virus_lovers_acl, \$virus_lovers_re);
459# @banned_files_lovers_maps = (\%banned_files_lovers, \@banned_files_lovers_acl, \$banned_files_lovers_re);
460# @bad_header_lovers_maps = (\%bad_header_lovers, \@bad_header_lovers_acl, \$bad_header_lovers_re);
461# @unchecked_lovers_maps = ();
462
463# $allowed_header_tests{$_} = 1  for qw(other mime 8bit control empty long
464#                                       syntax missing multiple);
465
466
467## ANTI-Spam CONTROLS
468
469# @spam_scanners = ( ['SpamAssassin', 'Amavis::SpamControl::SpamAssassin'] );
470
471# $helpers_home = $MYHOME;  # after-default
472# $sa_configpath = undef;
473# $sa_siteconfigpath = undef;
474# $sa_num_instances = 1;
475# @sa_userconf_maps = ();
476# @sa_username_maps = ();
477
478# $sa_mail_body_size_limit = undef;
479# $sa_local_tests_only = 0;
480# $sa_spawned = 0;
481# $dspam = undef;
482
483# $sa_timeout = 30;
484
485# @bypass_spam_checks_maps = (\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
486# @spam_lovers_maps = (\%spam_lovers, \@spam_lovers_acl, \$spam_lovers_re);
487
488# $sa_tag_level_deflt  = undef;
489# $sa_tag2_level_deflt = undef;
490# $sa_tag3_level_deflt = undef;
491# $sa_kill_level_deflt = undef;
492# $sa_dsn_cutoff_level = undef;
493# $sa_crediblefrom_dsn_cutoff_level = undef;
494# $sa_quarantine_cutoff_level = undef;
495
496# @spam_tag_level_maps  = (\$sa_tag_level_deflt);
497# @spam_tag2_level_maps = (\$sa_tag2_level_deflt);
498# @spam_tag3_level_maps = (\$sa_tag3_level_deflt);
499# @spam_kill_level_maps = (\$sa_kill_level_deflt);
500# @spam_quarantine_cutoff_level_maps = (\$sa_quarantine_cutoff_level);
501# @spam_notifyadmin_cutoff_level_maps = ();
502# @spam_dsn_cutoff_level_maps          = (\$sa_dsn_cutoff_level);
503# @spam_dsn_cutoff_level_bysender_maps = (\$sa_dsn_cutoff_level);
504# @spam_crediblefrom_dsn_cutoff_level_maps =
505#   (\$sa_crediblefrom_dsn_cutoff_level);
506# @spam_crediblefrom_dsn_cutoff_level_bysender_maps =
507#   (\$sa_crediblefrom_dsn_cutoff_level);
508
509# $bounce_killer_score = 0;
510
511# $penpals_bonus_score = undef;
512# $penpals_halflife = 7*24*60*60;
513# $penpals_threshold_low = 1.0;
514# $penpals_threshold_high = undef;
515
516# $reputation_factor = 0.2;
517
518# @score_sender_maps = ();
519# @signer_reputation_maps = ();
520
521# @blacklist_sender_maps = (\%blacklist_sender, \@blacklist_sender_acl, \$blacklist_sender_re);
522# @whitelist_sender_maps = (\%whitelist_sender, \@whitelist_sender_acl, \$whitelist_sender_re);
523
524# $per_recip_blacklist_sender_lookup_tables = undef;
525# $per_recip_whitelist_sender_lookup_tables = undef;  # deprecated
526
527# $os_fingerprint_method = undef;
528# $os_fingerprint_dst_ip_and_port = undef;
529
530
531## SQL, LDAP, Redis
532
533# $database_sessions_persistent = 1;
534# $trim_trailing_space_in_lookup_result_fields = 0;
535# $lookup_maps_imply_sql_and_ldap = 1;
536
537# @storage_redis_dsn = ();  # Redis server(s) for pen pals, IP reput, JSON log
538# $storage_redis_ttl = 16*24*60*60;
539# $enable_ip_repu = 1;
540# @ip_repu_ignore_networks = ();
541# @ip_repu_ignore_maps = (\@ip_repu_ignore_networks);
542# $redis_logging_key = undef;
543# $redis_logging_queue_size_limit = undef;
544
545# @lookup_sql_dsn  = ();  # SQL data source name for lookups, or empty
546# @storage_sql_dsn = ();  # SQL data source name for log/quarantine, or empty
547
548# $sql_store_info_for_all_msgs = 1;
549# $sql_schema_version = $myversion_id_numeric;
550# $timestamp_fmt_mysql = undef;
551# $sql_partition_tag = undef;
552# $sql_allow_8bit_address = 0;  # VARCHAR (0), VARBINARY/BYTEA (1)
553# $sql_lookups_no_at_means_domain = 0;
554# $sql_quarantine_chunksize_max = 16384;
555
556# $sql_select_policy =
557#   'SELECT *,users.id'.
558#   ' FROM users LEFT JOIN policy ON users.policy_id=policy.id'.
559#   ' WHERE users.email IN (%k) ORDER BY users.priority DESC';
560
561# $sql_select_white_black_list =
562#   'SELECT wb'.
563#   ' FROM wblist JOIN mailaddr ON wblist.sid=mailaddr.id'.
564#   ' WHERE wblist.rid=? AND mailaddr.email IN (%k)'.
565#   ' ORDER BY mailaddr.priority DESC';
566
567# %sql_clause = (
568#   'sel_policy' => \$sql_select_policy,
569#   'sel_wblist' => \$sql_select_white_black_list,
570#   'sel_adr' =>
571#     'SELECT id FROM maddr WHERE partition_tag=? AND email=?',
572#   'ins_adr' =>
573#     'INSERT INTO maddr (partition_tag, email, domain) VALUES (?,?,?)',
574#   'ins_msg' =>
575#     'INSERT INTO msgs (partition_tag, mail_id, secret_id, am_id,'.
576#     ' time_num, time_iso, sid, policy, client_addr, size, host)'.
577#     ' VALUES (?,?,?,?,?,?,?,?,?,?,?)',
578#   'upd_msg' =>
579#     'UPDATE msgs SET content=?, quar_type=?, quar_loc=?, dsn_sent=?,'.
580#     ' spam_level=?, message_id=?, from_addr=?, subject=?, client_addr=?,'.
581#     ' originating=?'.
582#     ' WHERE partition_tag=? AND mail_id=?',
583#   'ins_rcp' =>
584#     'INSERT INTO msgrcpt (partition_tag, mail_id, rseqnum, rid, is_local,'.
585#     ' content, ds, rs, bl, wl, bspam_level, smtp_resp)'.
586#     ' VALUES (?,?,?,?,?,?,?,?,?,?,?,?)',
587#   'ins_quar' =>
588#     'INSERT INTO quarantine (partition_tag, mail_id, chunk_ind, mail_text)'.
589#     ' VALUES (?,?,?,?)',
590#   'sel_msg' =>  # obtains partition_tag if missing in a release request
591#     'SELECT partition_tag FROM msgs WHERE mail_id=?',
592#   'sel_quar' =>
593#     'SELECT mail_text FROM quarantine'.
594#     ' WHERE partition_tag=? AND mail_id=?'.
595#     ' ORDER BY chunk_ind',
596#   'sel_penpals' =>  # no message-id references list
597#     "SELECT msgs.time_num, msgs.mail_id, subject".
598#     " FROM msgs JOIN msgrcpt USING (partition_tag,mail_id)".
599#     " WHERE sid=? AND rid=? AND msgs.content!='V' AND ds='P'".
600#     " ORDER BY msgs.time_num DESC",  # LIMIT 1
601#   'sel_penpals_msgid' =>  # with a nonempty list of message-id references
602#     "SELECT msgs.time_num, msgs.mail_id, subject, message_id, rid".
603#     " FROM msgs JOIN msgrcpt USING (partition_tag,mail_id)".
604#     " WHERE sid=? AND msgs.content!='V' AND ds='P' AND message_id IN (%m)".
605#       " AND rid!=sid".
606#     " ORDER BY rid=? DESC, msgs.time_num DESC",  # LIMIT 1
607# );
608
609## LDAP, Please see file README.lookups for more info.
610
611# $enable_ldap = 0;
612# $ldap_lookups_no_at_means_domain = 0;
613#
614# $default_ldap = {
615#   hostname       => 'localhost',
616#   localaddr      => undef,
617#   port           => undef,  # 389 or 636, default provided by Net::LDAP
618#   scheme         => undef,  # 'ldaps' or 'ldap', depending on hostname
619#   inet6          => $have_inet6 ? 1 : 0,
620#   version        => 3,
621#   timeout        => 120,
622#   deref          => 'find',
623#   bind_dn        => undef,
624#   bind_password  => undef,
625#   tls            => 0,
626#   verify         => 'none',
627#   sslversion     => 'tlsv1',
628#   clientcert     => undef,
629#   clientkey      => undef,
630#   cafile         => undef,
631#   capath         => undef,
632#   sasl           => 0,
633#   sasl_mech      => undef,  # space-separated list of mech names
634#   sasl_auth_id   => undef,
635# };
636
637
638## hierarchy by which a final setting is chosen:
639##   policy bank (based on port or IP address) -> *_by_ccat
640##   *_by_ccat (based on mail contents) -> *_maps
641##   *_maps (based on recipient address) -> final configuration value
642
643
644## MAPPING A CONTENTS CATEGORY TO A SETTING CHOSEN
645
646# %final_destiny_maps_by_ccat = (
647#   # value is normally a list of by-recipient lookup tables, but for compa-
648#   # tibility with old %final_destiny_by_ccat a value may also be a scalar
649#   CC_VIRUS,       sub { c('final_virus_destiny') },
650#   CC_BANNED,      sub { c('final_banned_destiny') },
651#   CC_UNCHECKED,   sub { c('final_unchecked_destiny') },
652#   CC_SPAM,        sub { c('final_spam_destiny') },
653#   CC_BADH,        sub { c('final_bad_header_destiny') },
654#   CC_MTA.',1',    D_TEMPFAIL,  # MTA response was 4xx
655#   CC_MTA.',2',    D_REJECT,    # MTA response was 5xx
656#   CC_MTA,         D_TEMPFAIL,
657#   CC_OVERSIZED,   D_BOUNCE,
658#   CC_CATCHALL,    D_PASS,
659# );
660# %forward_method_maps_by_ccat = (
661#   CC_CATCHALL,    sub { ca('forward_method_maps') },
662# );
663# %smtp_reason_by_ccat = (
664#   # currently only used for blocked messages only, status 5xx
665#   # a multiline message will produce a valid multiline SMTP response
666#   CC_VIRUS,       'id=%n - INFECTED: %V',
667#   CC_BANNED,      'id=%n - BANNED: %F',
668#   CC_UNCHECKED.',1', 'id=%n - UNCHECKED: encrypted',
669#   CC_UNCHECKED.',2', 'id=%n - UNCHECKED: over limits',
670#   CC_UNCHECKED,      'id=%n - UNCHECKED',
671#   CC_SPAM,        'id=%n - spam',
672#   CC_SPAMMY.',1', 'id=%n - spammy (tag3)',
673#   CC_SPAMMY,      'id=%n - spammy',
674#   CC_BADH.',1',   'id=%n - BAD HEADER: MIME error',
675#   CC_BADH.',2',   'id=%n - BAD HEADER: nonencoded 8-bit character',
676#   CC_BADH.',3',   'id=%n - BAD HEADER: contains invalid control character',
677#   CC_BADH.',4',   'id=%n - BAD HEADER: line made up entirely of whitespace',
678#   CC_BADH.',5',   'id=%n - BAD HEADER: line longer than RFC 5322 limit',
679#   CC_BADH.',6',   'id=%n - BAD HEADER: syntax error',
680#   CC_BADH.',7',   'id=%n - BAD HEADER: missing required header field',
681#   CC_BADH.',8',   'id=%n - BAD HEADER: duplicate header field',
682#   CC_BADH,        'id=%n - BAD HEADER',
683#   CC_OVERSIZED,   'id=%n - Message size exceeds recipient\'s size limit',
684#   CC_MTA.',1',    'id=%n - Temporary MTA failure on relaying',
685#   CC_MTA.',2',    'id=%n - Rejected by next-hop MTA on relaying',
686#   CC_MTA,         'id=%n - Unable to relay message back to MTA',
687#   CC_CLEAN,       'id=%n - CLEAN',
688#   CC_CATCHALL,    'id=%n - OTHER',  # should not happen
689# );
690# %lovers_maps_by_ccat = (
691#   CC_VIRUS,       sub { ca('virus_lovers_maps') },
692#   CC_BANNED,      sub { ca('banned_files_lovers_maps') },
693#   CC_UNCHECKED,   sub { ca('unchecked_lovers_maps') },
694#   CC_SPAM,        sub { ca('spam_lovers_maps') },
695#   CC_SPAMMY,      sub { ca('spam_lovers_maps') },
696#   CC_BADH,        sub { ca('bad_header_lovers_maps') },
697# );
698# %defang_maps_by_ccat = (
699#   # compatible with legacy %defang_by_ccat: value may be a scalar
700#   CC_VIRUS,       sub { c('defang_virus') },
701#   CC_BANNED,      sub { c('defang_banned') },
702#   CC_UNCHECKED,   sub { c('defang_undecipherable') },
703#   CC_SPAM,        sub { c('defang_spam') },
704#   CC_SPAMMY,      sub { c('defang_spam') },
705# # CC_BADH.',3',   1,  # NUL or CR character in header section
706# # CC_BADH.',5',   1,  # header line longer than 998 characters
707# # CC_BADH.',6',   1,  # header field syntax error
708#   CC_BADH,        sub { c('defang_bad_header') },
709# );
710# %subject_tag_maps_by_ccat = (
711#   CC_VIRUS,       [ '***INFECTED*** ' ],
712#   CC_BANNED,      undef,
713#   CC_UNCHECKED,   sub { [ c('undecipherable_subject_tag') ] }, # not by-recip
714#   CC_SPAM,        undef,
715#   CC_SPAMMY.',1', sub { ca('spam_subject_tag3_maps') },
716#   CC_SPAMMY,      sub { ca('spam_subject_tag2_maps') },
717#   CC_CLEAN.',1',  sub { ca('spam_subject_tag_maps') },
718# );
719# %quarantine_method_by_ccat = (
720#   CC_VIRUS,       sub { c('virus_quarantine_method') },
721#   CC_BANNED,      sub { c('banned_files_quarantine_method') },
722#   CC_UNCHECKED,   sub { c('unchecked_quarantine_method') },
723#   CC_SPAM,        sub { c('spam_quarantine_method') },
724#   CC_BADH,        sub { c('bad_header_quarantine_method') },
725#   CC_CLEAN,       sub { c('clean_quarantine_method') },
726# );
727# %quarantine_to_maps_by_ccat = (
728#   CC_VIRUS,       sub { ca('virus_quarantine_to_maps') },
729#   CC_BANNED,      sub { ca('banned_quarantine_to_maps') },
730#   CC_UNCHECKED,   sub { ca('unchecked_quarantine_to_maps') },
731#   CC_SPAM,        sub { ca('spam_quarantine_to_maps') },
732#   CC_BADH,        sub { ca('bad_header_quarantine_to_maps') },
733#   CC_CLEAN,       sub { ca('clean_quarantine_to_maps') },
734# );
735# %admin_maps_by_ccat = (
736#   CC_VIRUS,       sub { ca('virus_admin_maps') },
737#   CC_BANNED,      sub { ca('banned_admin_maps') },
738#   CC_UNCHECKED,   sub { ca('virus_admin_maps') },
739#   CC_SPAM,        sub { ca('spam_admin_maps') },
740#   CC_BADH,        sub { ca('bad_header_admin_maps') },
741# );
742# %always_bcc_by_ccat = (
743#   CC_CATCHALL,    sub { c('always_bcc') },
744# );
745# %dsn_bcc_by_ccat = (
746#   CC_CATCHALL,    sub { c('dsn_bcc') },
747# );
748# %mailfrom_notify_admin_by_ccat = (
749#   CC_SPAM,        sub { c('mailfrom_notify_spamadmin') },
750#   CC_CATCHALL,    sub { c('mailfrom_notify_admin') },
751# );
752# %hdrfrom_notify_admin_by_ccat = (
753#   CC_SPAM,        sub { c('hdrfrom_notify_spamadmin') },
754#   CC_CATCHALL,    sub { c('hdrfrom_notify_admin') },
755# );
756# %mailfrom_notify_recip_by_ccat = (
757#   CC_CATCHALL,    sub { c('mailfrom_notify_recip') },
758# );
759# %hdrfrom_notify_recip_by_ccat = (
760#   CC_CATCHALL,    sub { c('hdrfrom_notify_recip') },
761# );
762# %hdrfrom_notify_sender_by_ccat = (
763#   CC_CATCHALL,    sub { c('hdrfrom_notify_sender') },
764# );
765# %hdrfrom_notify_release_by_ccat = (
766#   CC_CATCHALL,    sub { c('hdrfrom_notify_release') },
767# );
768# %hdrfrom_notify_report_by_ccat = (
769#   CC_CATCHALL,    sub { c('hdrfrom_notify_report') },
770# );
771# %notify_admin_templ_by_ccat = (
772#   CC_SPAM,        sub { cr('notify_spam_admin_templ') },
773#   CC_CATCHALL,    sub { cr('notify_virus_admin_templ') },
774# );
775# %notify_recips_templ_by_ccat = (
776#   CC_SPAM,        sub { cr('notify_spam_recips_templ') },  #usually empty
777#   CC_CATCHALL,    sub { cr('notify_virus_recips_templ') },
778# );
779# %notify_sender_templ_by_ccat = (  # bounce templates
780#   CC_VIRUS,       sub { cr('notify_virus_sender_templ') },
781#   CC_BANNED,      sub { cr('notify_virus_sender_templ') }, #historical reason
782#   CC_SPAM,        sub { cr('notify_spam_sender_templ') },
783#   CC_CATCHALL,    sub { cr('notify_sender_templ') },
784# );
785# %notify_release_templ_by_ccat = (
786#   CC_CATCHALL,    sub { cr('notify_release_templ') },
787# );
788# %notify_report_templ_by_ccat = (
789#   CC_CATCHALL,    sub { cr('notify_report_templ') },
790# );
791# %notify_autoresp_templ_by_ccat = (
792#   CC_CATCHALL,    sub { cr('notify_autoresp_templ') },
793# );
794# %warnsender_by_ccat = (  # deprecated use, except perhaps for CC_BADH
795#   CC_VIRUS,       undef,
796#   CC_BANNED,      sub { c('warnbannedsender') },
797#   CC_SPAM,        undef,
798#   CC_BADH,        sub { c('warnbadhsender') },
799# );
800# %warnrecip_maps_by_ccat = (
801#   CC_VIRUS,       sub { ca('warnvirusrecip_maps') },
802#   CC_BANNED,      sub { ca('warnbannedrecip_maps') },
803#   CC_SPAM,        undef,
804#   CC_BADH,        sub { ca('warnbadhrecip_maps') },
805# );
806# %addr_extension_maps_by_ccat = (
807#   CC_VIRUS,       sub { ca('addr_extension_virus_maps') },
808#   CC_BANNED,      sub { ca('addr_extension_banned_maps') },
809#   CC_SPAM,        sub { ca('addr_extension_spam_maps') },
810#   CC_SPAMMY,      sub { ca('addr_extension_spam_maps') },
811#   CC_BADH,        sub { ca('addr_extension_bad_header_maps') },
812# # CC_OVERSIZED,   'oversized';
813# );
814# %addr_rewrite_maps_by_ccat = ( );
815
816
817## POLICY BANKS
818
819# %interface_policy = ();  # maps input interface/port to policy bank name
820
821# $policy_bank{''} = { ...predefined... };
822
823    ## the built-in policy bank (empty name) is predefined, and includes
824    ## references to most other variables listed above (the dynamic config
825    ## variables), which are accessed only indirectly through the currently
826    ## installed policy bank. Overlaying a policy bank with another policy
827    ## bank may bring-in references to entirely different variables,
828    ## possibly unnamed. Here is a list of configuration variables
829    ## referenced from the built-in policy bank by keys of the same name
830    ## (e.g. { log_level => \$log_level, inet_acl => \@inet_acl, ...} )
831    ##
832    ##   $child_timeout $smtpd_timeout
833    ##   $policy_bank_name $protocol $haproxy_target_enabled @inet_acl
834    ##   $myhostname $myauthservid $snmp_contact $snmp_location
835    ##   $myprogram_name $syslog_ident $syslog_facility
836    ##   $log_level $log_templ $log_recip_templ $enable_log_capture_dump
837    ##   $forward_method $notify_method $resend_method $report_format
838    ##   $release_method $requeue_method $release_format
839    ##   $attachment_password $attachment_email_name $attachment_outer_name
840    ##   $mail_digest_algorithm $mail_part_digest_algorithm
841    ##   $os_fingerprint_method $os_fingerprint_dst_ip_and_port
842    ##   $originating @smtpd_discard_ehlo_keywords $soft_bounce
843    ##   $propagate_dsn_if_possible $terminate_dsn_on_notify_success
844    ##   $amavis_auth_user $amavis_auth_pass $auth_reauthenticate_forwarded
845    ##   $auth_required_out $auth_required_inp $auth_required_release
846    ##   @auth_mech_avail $tls_security_level_in $tls_security_level_out
847    ##   $local_client_bind_address $smtpd_message_size_limit
848    ##   $localhost_name $smtpd_greeting_banner $smtpd_quit_banner
849    ##   $mailfrom_to_quarantine $warn_offsite $bypass_decode_parts @decoders
850    ##   @av_scanners @av_scanners_backup @spam_scanners
851    ##   $first_infected_stops_scan $virus_scanners_failure_is_fatal
852    ##   $sa_spam_level_char $sa_mail_body_size_limit
853    ##   $penpals_bonus_score $penpals_halflife $bounce_killer_score
854    ##   $reputation_factor
855    ##   $undecipherable_subject_tag $localpart_is_case_sensitive
856    ##   $recipient_delimiter $replace_existing_extension
857    ##   $hdr_encoding $bdy_encoding $hdr_encoding_qb
858    ##   $allow_disclaimers $outbound_disclaimers_only
859    ##   $prepend_header_fields_hdridx
860    ##   $allow_fixing_improper_header
861    ##   $allow_fixing_improper_header_folding $allow_fixing_long_header_lines
862    ##   %allowed_added_header_fields %prefer_our_added_header_fields
863    ##   %allowed_header_tests
864    ##   $X_HEADER_TAG $X_HEADER_LINE
865    ##   $remove_existing_x_scanned_headers $remove_existing_spam_headers
866    ##   %sql_clause $partition_tag
867    ##   %local_delivery_aliases $banned_namepath_re
868    ##   $per_recip_whitelist_sender_lookup_tables
869    ##   $per_recip_blacklist_sender_lookup_tables
870    ##   @anomy_sanitizer_args @altermime_args_defang
871    ##   @altermime_args_disclaimer @disclaimer_options_bysender_maps
872    ##   %signed_header_fields @dkim_signature_options_bysender_maps
873    ##   $enable_dkim_verification $enable_dkim_signing $dkim_signing_service
874    ##   $dkim_minimum_key_bits $enable_ldap $enable_ip_repu $redis_logging_key
875    ##
876    ##   @local_domains_maps
877    ##   @mynetworks_maps @client_ipaddr_policy @ip_repu_ignore_maps
878    ##   @forward_method_maps @newvirus_admin_maps @banned_filename_maps
879    ##   @spam_quarantine_bysender_to_maps
880    ##   @spam_tag_level_maps @spam_tag2_level_maps @spam_tag3_level_maps
881    ##   @spam_kill_level_maps
882    ##   @spam_subject_tag_maps @spam_subject_tag2_maps @spam_subject_tag3_maps
883    ##   @spam_dsn_cutoff_level_maps @spam_dsn_cutoff_level_bysender_maps
884    ##   @spam_crediblefrom_dsn_cutoff_level_maps
885    ##   @spam_crediblefrom_dsn_cutoff_level_bysender_maps
886    ##   @spam_quarantine_cutoff_level_maps @spam_notifyadmin_cutoff_level_maps
887    ##   @whitelist_sender_maps @blacklist_sender_maps @score_sender_maps
888    ##   @author_to_policy_bank_maps @signer_reputation_maps
889    ##   @message_size_limit_maps @debug_sender_maps @debug_recipient_maps
890    ##   @bypass_virus_checks_maps @bypass_spam_checks_maps
891    ##   @bypass_banned_checks_maps @bypass_header_checks_maps
892    ##   @viruses_that_fake_sender_maps
893    ##   @virus_name_to_spam_score_maps @virus_name_to_policy_bank_maps
894    ##   @remove_existing_spam_headers_maps
895    ##   @sa_userconf_maps @sa_username_maps
896    ##
897    ##   %final_destiny_maps_by_ccat %forward_method_maps_by_ccat
898    ##   %lovers_maps_by_ccat %defang_maps_by_ccat %subject_tag_maps_by_ccat
899    ##   %quarantine_method_by_ccat %quarantine_to_maps_by_ccat
900    ##   %notify_admin_templ_by_ccat %notify_recips_templ_by_ccat
901    ##   %notify_sender_templ_by_ccat %notify_autoresp_templ_by_ccat
902    ##   %notify_release_templ_by_ccat %notify_report_templ_by_ccat
903    ##   %warnsender_by_ccat
904    ##   %hdrfrom_notify_admin_by_ccat %mailfrom_notify_admin_by_ccat
905    ##   %hdrfrom_notify_recip_by_ccat %mailfrom_notify_recip_by_ccat
906    ##   %hdrfrom_notify_sender_by_ccat
907    ##   %hdrfrom_notify_release_by_ccat %hdrfrom_notify_report_by_ccat
908    ##   %admin_maps_by_ccat %warnrecip_maps_by_ccat
909    ##   %always_bcc_by_ccat %dsn_bcc_by_ccat
910    ##   %addr_extension_maps_by_ccat %addr_rewrite_maps_by_ccat
911    ##   %smtp_reason_by_ccat
912
913    # legacy dynamic configuration variables:
914
915    ##   $final_virus_destiny $final_banned_destiny $final_unchecked_destiny
916    ##   $final_spam_destiny $final_bad_header_destiny
917    ##   @virus_lovers_maps @spam_lovers_maps @unchecked_lovers_maps
918    ##   @banned_files_lovers_maps @bad_header_lovers_maps
919    ##   $always_bcc $dsn_bcc
920    ##   $mailfrom_notify_sender $mailfrom_notify_recip
921    ##   $mailfrom_notify_admin  $mailfrom_notify_spamadmin
922    ##   $hdrfrom_notify_sender  $hdrfrom_notify_recip
923    ##   $hdrfrom_notify_admin   $hdrfrom_notify_spamadmin
924    ##   $hdrfrom_notify_release $hdrfrom_notify_report
925    ##   $notify_virus_admin_templ  $notify_spam_admin_templ
926    ##   $notify_virus_recips_templ $notify_spam_recips_templ
927    ##   $notify_virus_sender_templ $notify_spam_sender_templ
928    ##   $notify_sender_templ $notify_release_templ
929    ##   $notify_report_templ $notify_autoresp_templ
930    ##   $warnbannedsender $warnbadhsender
931    ##   $defang_virus $defang_banned $defang_spam
932    ##   $defang_bad_header $defang_undecipherable $defang_all
933    ##   $virus_quarantine_method $banned_files_quarantine_method
934    ##   $unchecked_quarantine_method $spam_quarantine_method
935    ##   $bad_header_quarantine_method $clean_quarantine_method
936    ##   $archive_quarantine_method
937    ##   @virus_quarantine_to_maps @banned_quarantine_to_maps
938    ##   @unchecked_quarantine_to_maps @spam_quarantine_to_maps
939    ##   @bad_header_quarantine_to_maps @clean_quarantine_to_maps
940    ##   @archive_quarantine_to_maps
941    ##   @virus_admin_maps @banned_admin_maps
942    ##   @spam_admin_maps @bad_header_admin_maps @spam_modifies_subj_maps
943    ##   @warnvirusrecip_maps @warnbannedrecip_maps @warnbadhrecip_maps
944    ##   @addr_extension_virus_maps  @addr_extension_spam_maps
945    ##   @addr_extension_banned_maps @addr_extension_bad_header_maps
946
9471;  # insure a defined return value
948