-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexim.conf
833 lines (641 loc) · 29.8 KB
/
exim.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
######################################################################
# Runtime configuration file for Exim #
######################################################################
### Created 27.2.2018, Karo
# update 5.6.2018 to add mysql connections, Karo
# Exim user and group
exim_group = mail
# Logging
# Default to /var/log/exim/%s.log
# this is CentOS default, ok
# Interfaces
# Defaults to 0.0.0.0
local_interfaces = 10.0.0.1 : 127.0.0.1
# ports to listen on (smtps is forced to use TLS/SSL via tls_on_connect_ports)
daemon_smtp_ports = smtp : smtps : submission
# Primary hostname
primary_hostname = mail.example.com
# Connections to MySQL database
hide mysql_servers = 127.0.0.1/database/user/password
# Domainlists
domainlist local_domains = @ : localhost : localhost.localdomain : example.com
domainlist relay_to_domains =
hostlist relay_from_hosts = localhost
# SSL/TLS config
tls_advertise_hosts = *
tls_require_ciphers = AES : 3DES
tls_certificate = /etc/pki/tls/certs/exim.crt
tls_privatekey = /etc/pki/tls/private/exim.key
# additionally listen on ssl/smtp
tls_on_connect_ports = 465
# log some details
log_selector = +tls_cipher +tls_peerdn \
+smtp_protocol_error +smtp_syntax_error
### Define ACLs
### The names of these ACLs are:
acl_smtp_mail = acl_check_mail
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
acl_smtp_mime = acl_check_mime
# ClamAV and Spamassassin
av_scanner = clamd:/var/run/clamd.scan/clamd.sock
spamd_address = 127.0.0.1 783
## Some setting for spam and virus checking
# seconds after a greylisted message is accepted (1 minute)
GREYLIST_TIMEOUT = ${eval:1*60}
# integer spam score threshold to activate selective greylisting (2.0 points)
GREYLIST_SPAM_THRESHOLD = 20
# messages bigger than this aren't spam-scanned
SPAM_FILESIZE_LIMIT = 2M
# messages bigger than this aren't virus-scanned
VIRUS_FILESIZE_LIMIT = 10M
# Qualify domain and -recipient
qualify_domain = example.com
qualify_recipient = example.com
# Trigger guard
never_users = root
# DNS lookup
host_lookup = *
# accept 8-bit mime
accept_8bitmime = yes
# bounce queue duration
ignore_bounce_errors_after = 2d
timeout_frozen_after = 7d
# auth config
auth_advertise_hosts = ${if eq {$tls_cipher}{}{}{*}}
# The settings below 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. and to
# disabled for release 4.86)
#
#rfc1413_hosts = *
#rfc1413_query_timeout = 5s
# Enable an efficiency feature. We advertise the feature; clients
# may request to use it. For multi-recipient mails we then can
# reject or accept per-user after the message is received.
#
prdr_enable = true
# If you're in a part of the world where ASCII is not sufficient for most
# text, then you're probably familiar with RFC2047 message header extensions.
# By default, Exim adheres to the specification, including a limit of 76
# characters to a line, with encoded words fitting within a line.
# If you wish to use decoded headers in message filters in such a way
# that successful decoding of malformed messages matters, you may wish to
# configure Exim to be more lenient.
#
# check_rfc2047_length = false
#
# In particular, the Exim maintainers have had multiple reports of problems
# from Russian administrators of issues until they disable this check,
# because of some popular, yet buggy, mail composition software.
keep_environment = ^LDAP
add_environment = PATH=/usr/bin::/bin
######################################################################
# ACL CONFIGURATION #
# Specifies access control lists for incoming SMTP mail #
######################################################################
begin acl
# This access control list is used for the MAIL command in an incoming
# SMTP message.
acl_check_mail:
# Hosts are required to say HELO (or EHLO) before sending mail.
# So don't allow them to use the MAIL command if they haven't
# done so.
deny condition = ${if eq{$sender_helo_name}{} {1}}
message = Nice people say HELO first
# Use the lack of reverse DNS to trigger greylisting. Some people
# even reject for it but that would be a little excessive.
warn condition = ${if eq{$sender_host_name}{} {1}}
set acl_m_greylistreasons = Host $sender_host_address lacks reverse DNS\n$acl_m_greylistreasons
accept
# 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:
# 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)
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}}
# 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 = :
control = dkim_disable_verify
deny message = Restricted characters in address
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]
deny message = Restricted characters in address
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
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
# 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
control = dkim_disable_verify
# 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
control = dkim_disable_verify
deny message = rejected because $sender_host_address is in blacklist at $dnslist_domain \n$dnslist_text
dnslists = zen.spamhaus.org
# Insist that a HELO/EHLO was accepted.
require message = nice hosts say HELO first
condition = ${if def:sender_helo_name}
### --- centos way ---
# 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
# At this point, the address has passed all the checks that have been
# configured, so we accept it unconditionally.
# accept
### --- centos way ---
### --- same thing in different way ---
accept domains = +local_domains
endpass
verify = recipient
accept domains = +relay_to_domains
endpass
verify = recipient
deny message = we are not an open relay.
# 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:
# Deny if the message contains an overlong line. Per the standards
# we should never receive one such via SMTP.
#
deny message = maximum allowed line length is 998 octets, \
got $max_received_linelength
condition = ${if > {$max_received_linelength}{998}}
# Put simple tests first. A good one is to check for the presence of a
# Message-Id: header, which RFC2822 says SHOULD be present. Some broken
# or misconfigured mailer software occasionally omits this from genuine
# messages too, though -- although it's not hard for the offender to fix
# after they receive a bounce because of it.
#
# deny condition = ${if !def:h_Message-ID: {1}}
# message = RFC2822 says that all mail SHOULD have a Message-ID header.\n\
# Most messages without it are spam, so your mail has been rejected.
#
# Alternatively if we're feeling more lenient we could just use it to
# trigger greylisting instead:
warn condition = ${if !def:h_Message-ID: {1}}
set acl_m_greylistreasons = Message lacks Message-Id: header. Consult RFC2822.\n$acl_m_greylistreasons
# 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).
log_message = rejected a message containing malware ($malware_name) from $sender_address to $recipients (ClamAV)
condition = ${if < {$message_size}{VIRUS_FILESIZE_LIMIT}}
# demime = *
malware = */defer_ok
# Bypass SpamAssassin checks if the message is too large.
#
accept condition = ${if >= {$message_size}{SPAM_FILESIZE_LIMIT}}
add_header = X-Spam-Note: SpamAssassin run bypassed due to message size
# accept condition = ${if !def:spam_score_int {1}}
# add_header = X-Spam-Note: SpamAssassin invocation failed
# Run SpamAssassin, but allow for it to fail or time out. Add a warning message
# and accept the mail if that happens. Add an X-Spam-Flag: header if the SA
# score exceeds the SA system threshold.
#
# Add spam score to all messages, (:true)
# Deny condition rewritten to here (25.3.2018, karo)
# Ordering of clauses is important!
### deny message
### spam = user
### conditions
deny message = This message scored over $spam_score spampoints. Congratulations!
spam = spamassassin:true/defer_ok
condition = ${if < {$message_size}{SPAM_FILESIZE_LIMIT}}
condition = ${if > {$spam_score_int}{100} {1}}
# hosts = !wildlsearch:/etc/exim/domain_whitelist.txt
warn message = X-Spam-Score: $spam_score
spam = spamassassin:true/defer_ok
# Spam report moved to spam messages. ~karo, 1.1.11
# warn message = X-Spam-Score: $spam_score\n\
# X-Spam-Report: $spam_report
!authenticated = *
condition = ${if < {$message_size}{SPAM_FILESIZE_LIMIT}}
# Add spam flag to spam messages
warn message = X-Spam-Flag: YES\n\
X-Spam-Report: $spam_report
spam = spamassassin/defer_ok
!authenticated = *
condition = ${if < {$message_size}{SPAM_FILESIZE_LIMIT}}
# Deny messages scoring over 10 spampoints
# deny message = This message scored $spam_score spampoints. Congratulations!
# spam = nobody:true/defer_ok
# condition = ${if >{$spam_score_int}{100}{1}{0}}
# hosts = ! wildlsearch;/etc/exim/domain_whitelist.txt
# accept
# Trigger greylisting (if enabled) if the SpamAssassin score is greater than (0.5)??
#
warn condition = ${if > {$spam_score_int}{25} {1}}
set acl_m_greylistreasons = Message has $spam_score SpamAssassin points\n$acl_m_greylistreasons
# If you want to greylist _all_ mail rather than only mail which looks like there
# might be something wrong with it, then you can do this...
#
# warn set acl_m_greylistreasons = We greylist all mail\n$acl_m_greylistreasons
# Now, invoke the greylisting. For this you need to have installed the exim-greylist
# package which contains this subroutine, and you need to uncomment the bit below
# which includes it too. Whenever the $acl_m_greylistreasons variable is non-empty,
# greylisting will kick in and will defer the mail to check if the sender is a
# proper mail which which retries, or whether it's a zombie. For more details, see
# the exim-greylist.conf.inc file itself.
#
require acl = greylist_mail
accept
# To enable the greylisting, also uncomment this line:
.include /etc/exim/exim-greylist.conf.inc
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,
# <user@[192.168.35.64]>. The RFCs require this facility. However, it is
# little-known these days, and has been exploited by evil people seeking
# to abuse SMTP relays. Consequently it is commented out in the default
# configuration. If you uncomment this router, you also need to uncomment
# allow_domain_literals above, so that Exim can recognize the syntax of
# domain literal addresses.
# domain_literal:
# driver = ipliteral
# domains = ! +local_domains
# transport = remote_smtp
# This router routes addresses that are not in local domains by doing a DNS
# lookup on the domain name. The exclamation mark that appears in "domains = !
# +local_domains" is a negating operator, that is, it can be read as "not". The
# recipient's domain must not be one of those defined by "domainlist
# local_domains" above for this router to be used.
#
# If the router is used, any domain that resolves to 0.0.0.0 or to a loopback
# interface address (127.0.0.0/8) is treated as if it had no DNS entry. Note
# that 0.0.0.0 is the same as 0.0.0.0/32, which is commonly treated as the
# local host inside the network stack. It is not 0.0.0.0/0, the default route.
# If the DNS lookup fails, no further routers are tried because of the no_more
# setting, and consequently the address is unrouteable.
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
# if ipv6-enabled then instead use:
# ignore_target_hosts = <; 0.0.0.0 ; 127.0.0.0/8 ; ::1
no_more
# This alternative router can be used when you want to send all mail to a
# server which handles DNS lookups for you; an ISP will typically run such
# a server for their customers. If you uncomment "smarthost" then you
# should comment out "dnslookup" above. Setting a real hostname in route_data
# wouldn't hurt either.
# smarthost:
# driver = manualroute
# domains = ! +local_domains
# transport = remote_smtp
# route_data = MAIL.HOSTNAME.FOR.CENTRAL.SERVER.EXAMPLE
# ignore_target_hosts = <; 0.0.0.0 ; 127.0.0.0/8 ; ::1
# no_more
# The remaining routers handle addresses in the local domain(s), that is those
# domains that are defined by "domainlist local_domains" above.
# This router handles aliasing using a linearly searched alias file with the
# name SYSTEM_ALIASES_FILE. When this configuration is installed automatically,
# the name gets inserted into this file from whatever is set in Exim's
# build-time configuration. The default path is the traditional /etc/aliases.
# If you install this configuration by hand, you need to specify the correct
# path in the "data" setting below.
#
##### NB You must ensure that the alias file exists. It used to be the case
##### NB that every Unix had that file, because it was the Sendmail default.
##### NB These days, there are systems that don't have it. Your aliases
##### NB file should at least contain an alias for "postmaster".
#
# If any of your aliases expand to pipes or files, you will need to set
# up a user and a group for these deliveries to run under. You can do
# this by uncommenting the "user" option below (changing the user name
# as appropriate) and adding a "group" option if necessary. Alternatively, you
# can specify "user" on the transports that are used. Note that the transports
# listed below are the same as are used for .forward files; you might want
# to set up different ones for pipe and file deliveries from aliases.
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup{$local_part}lsearch{/etc/aliases}}
file_transport = address_file
pipe_transport = address_pipe
virtual_alias:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{\
SELECT CONCAT(username, '@', domain)\
FROM alias \
WHERE alias='${quote_mysql:$local_part}'\
AND domain='${quote_mysql:$domain}'}}
# This router handles forwarding using traditional .forward files in users'
# home directories. If you want it also to allow mail filtering when a forward
# file starts with the string "# Exim filter" or "# Sieve filter", uncomment
# the "allow_filter" option.
# The no_verify setting means that this router is skipped when Exim is
# verifying addresses. Similarly, no_expn means that this router is skipped if
# Exim is processing an EXPN command.
# If you want this router to treat local parts with suffixes introduced by "-"
# or "+" characters as if the suffixes did not exist, uncomment the two local_
# part_suffix options. Then, for example, xxxx-foo@your.domain will be treated
# in the same way as xxxx@your.domain by this router. Because this router is
# not used for verification, if you choose to uncomment those options, then you
# will *need* to make the same change to the localuser router. (There are
# other approaches, if this is undesirable, but they add complexity).
# The check_ancestor option means that if the forward file generates an
# address that is an ancestor of the current one, the current one gets
# passed on instead. This covers the case where A is aliased to B and B
# has a .forward file pointing to A.
# The three transports specified at the end are those that are used when
# forwarding generates a direct delivery to a file, or to a pipe, or sets
# up an auto-reply, respectively.
userforward:
driver = redirect
check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
file = $home/.forward
allow_filter
no_verify
no_expn
check_ancestor
file_transport = address_file
pipe_transport = address_pipe
reply_transport = address_reply
procmail:
driver = accept
check_local_user
require_files = ${local_part}:+${home}/.procmailrc:/usr/bin/procmail
transport = procmail
no_verify
# This router matches local user mailboxes. If the router fails, the error
# message is "Unknown user".
# If you want this router to treat local parts with suffixes introduced by "-"
# or "+" characters as if the suffixes did not exist, uncomment the two local_
# part_suffix options. Then, for example, xxxx-foo@your.domain will be treated
# in the same way as xxxx@your.domain by this router.
localuser:
driver = accept
check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
transport = local_delivery
cannot_route_message = Unknown user
# Router for virtual user delivery
# query database for user and deliver to proper transport
virtualuser:
driver = accept
condition = ${lookup mysql {\
SELECT CONCAT(username, '@', domain)\
FROM user \
WHERE username='${quote_mysql:$local_part}'\
AND domain='${quote_mysql:$domain}'}}
domains = +local_domains
transport = virtual_user
######################################################################
# TRANSPORTS CONFIGURATION #
######################################################################
# ORDER DOES NOT MATTER #
# Only one appropriate transport is called for each delivery. #
######################################################################
# A transport is used only when referenced from a router that successfully
# handles an address.
begin transports
# This transport is used for delivering messages over SMTP connections.
# Refuse to send any message with over-long lines, which could have
# been received other than via SMTP. The use of message_size_limit to
# enforce this is a red herring.
remote_smtp:
driver = smtp
message_size_limit = ${if > {$max_received_linelength}{998} {1}{0}}
# This transport is used for delivering messages over SMTP using the
# "message submission" port (RFC4409).
remote_msa:
driver = smtp
port = 587
hosts_require_auth = *
# hosts_require_auth = ${if eq {$interface_port}{587}{*}{}}
# This transport invokes procmail to deliver mail
procmail:
driver = pipe
command = "/usr/bin/procmail -d $local_part"
return_path_add
delivery_date_add
envelope_to_add
user = $local_part
initgroups
return_output
# This transport is used for local delivery to user mailboxes in traditional
# BSD mailbox format. By default it will be run under the uid and gid of the
# local user, and requires the sticky bit to be set on the /var/mail directory.
# Some systems use the alternative approach of running mail deliveries under a
# particular group instead of using the sticky bit. The commented options below
# show how this can be done.
local_delivery:
driver = appendfile
# file = /var/mail/$local_part
directory = /home/$local_part/.maildir
maildir_format
delivery_date_add
envelope_to_add
return_path_add
# group = mail
# mode = 0660
virtual_user:
driver = appendfile
maildir_format
delivery_date_add
envelope_to_add
return_path_add
# this is stupid. Rewrite with $address_data = ${lookup mysql{SELECT uid,gid,home}} in router, then
# user = ${extract{uid}{$address_data}}
# to make all this with single sql query
group = ${lookup mysql {\
SELECT gid \
FROM user \
WHERE username='${quote_mysql:$local_part}'\
AND domain='${quote_mysql:$domain}'}}
user = ${lookup mysql {\
SELECT uid \
FROM user \
WHERE username='${quote_mysql:$local_part}'\
AND domain='${quote_mysql:$domain}'}}
directory = ${lookup mysql {\
SELECT home \
FROM user \
WHERE username='${quote_mysql:$local_part}'\
AND domain='${quote_mysql:$domain}'}}/.maildir
# This transport is used for handling pipe deliveries generated by alias or
# .forward files. If the pipe generates any standard output, it is returned
# to the sender of the message as a delivery error. Set return_fail_output
# instead of return_output if you want this to happen only when the pipe fails
# to complete normally. You can set different transports for aliases and
# forwards if you want to - see the references to address_pipe in the routers
# section above.
address_pipe:
driver = pipe
return_output
# This transport is used for handling deliveries directly to files that are
# generated by aliasing or forwarding.
address_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
# This transport is used for handling autoreplies generated by the filtering
# option of the userforward router.
address_reply:
driver = autoreply
# This transport is used to deliver local mail to cyrus IMAP server via UNIX
# socket. You'll need to configure the 'localuser' router above to use it.
#
#lmtp_delivery:
# home_directory = /var/spool/imap
# driver = lmtp
# command = "/usr/lib/cyrus-imapd/deliver -l"
# batch_max = 20
# user = cyrus
######################################################################
# RETRY CONFIGURATION #
######################################################################
begin retry
# This single retry rule applies to all domains and all errors. It specifies
# retries every 15 minutes for 2 hours, then increasing retry intervals,
# starting at 1 hour and increasing each time by a factor of 1.5, up to 16
# hours, then retries every 6 hours until 4 days have passed since the first
# failed delivery.
# WARNING: If you do not have any retry rules at all (this section of the
# configuration is non-existent or empty), Exim will not do any retries of
# messages that fail to get delivered at the first attempt. The effect will
# be to treat temporary errors as permanent. Therefore, DO NOT remove this
# retry rule unless you really don't want any retries.
# Address or Domain Error Retries
# ----------------- ----- -------
* * F,2h,15m; G,16h,1h,1.5; F,4d,6h
######################################################################
# REWRITE CONFIGURATION #
######################################################################
# There are no rewriting specifications in this default configuration file.
begin rewrite
######################################################################
# AUTHENTICATION CONFIGURATION #
######################################################################
begin authenticators
# This authenticator supports CRAM-MD5 username/password authentication
# with Exim acting as a _client_, as it might when sending its outgoing
# mail to a smarthost rather than directly to the final recipient.
# Replace SMTPAUTH_USERNAME and SMTPAUTH_PASSWORD as appropriate.
#client_auth:
# driver = cram_md5
# public_name = CRAM-MD5
# client_name = SMTPAUTH_USERNAME
# client_secret = SMTPAUTH_PASSWORD
#
# The following authenticators support plaintext username/password
# authentication using the standard PLAIN mechanism and the traditional
# but non-standard LOGIN mechanism, with Exim acting as the server.
# PLAIN and LOGIN are enough to support most MUA software.
#
# These authenticators are not complete: you need to change the
# server_condition settings to specify how passwords are verified.
# They are set up to offer authentication to the client only if the
# connection is encrypted with TLS, so you also need to add support
# for TLS. See the global configuration options section at the start
# of this file for more about TLS.
#
# The default RCPT ACL checks for successful authentication, and will accept
# messages from authenticated users from anywhere on the Internet.
#
# PLAIN authentication has no server prompts. The client sends its
# credentials in one lump, containing an authorization ID (which we do not
# use), an authentication ID, and a password. The latter two appear as
# $auth2 and $auth3 in the configuration and should be checked against a
# valid username and password. In a real configuration you would typically
# use $auth2 as a lookup key, and compare $auth3 against the result of the
# lookup, perhaps using the crypteq{}{} condition.
#PLAIN:
# driver = plaintext
# server_set_id = $auth2
# server_prompts = :
# server_condition = ${if saslauthd{{$2}{$3}{smtp}} {1}}
# server_advertise_condition = ${if def:tls_in_cipher }
# LOGIN authentication has traditional prompts and responses. There is no
# authorization ID in this mechanism, so unlike PLAIN the username and
# password are $auth1 and $auth2. Apart from that you can use the same
# server_condition setting for both authenticators.
#LOGIN:
# driver = plaintext
# server_set_id = $auth1
# server_prompts = <| Username: | Password:
# server_condition = ${if saslauthd{{$1}{$2}{smtp}} {1}}
# server_advertise_condition = ${if def:tls_in_cipher }
dovecot_plain:
driver = dovecot
public_name = PLAIN
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
dovecot_login:
driver = dovecot
public_name = LOGIN
server_socket = /var/run/dovecot/auth-client
# setting server_set_id might break several headers in mails sent by authenticated smtp. be careful.
server_set_id = $auth1
######################################################################
# CONFIGURATION FOR local_scan() #
######################################################################
# If you have built Exim to include a local_scan() function that contains
# tables for private options, you can define those options here. Remember to
# uncomment the "begin" line. It is commented by default because it provokes
# an error with Exim binaries that are not built with LOCAL_SCAN_HAS_OPTIONS
# set in the Local/Makefile.
# begin local_scan
# End of Exim configuration file