Attachment 'exim4.conf.deb8-9-devuan1-2.txt'
Download 1 ### Confiugrazione per Exim4
2 ### Realizzata da Kurgan (kurgan at kurgan dot org)
3 ### versione del 24/1/2019
4
5
6 ##
7 ## Variabili che usero` in seguito. (da modificare se necessario)
8 ##
9
10 # Indirizzo mail del postmaster per tutti i domini gestiti dal server.
11 # NON USARE un utente che sia "postmaster@<uno dei domini locali>
12 # altrimenti si crea un loop.
13 POSTMASTER=utente@domain.tld
14
15 # dove si trovano i files della mail
16 MAIL=/var/vmail
17
18 # dove si trova la configurazione di exim4
19 EXIM4=/etc/exim4
20
21 # Dove si trovano le chiavi per DKIM
22 DKIM_FILE = EXIM4/dkim/${lc:$sender_address_domain}-private.pem
23
24 # dove si trovano i files di configurazione degli utenti dei domini virtuali
25 VIRTUALS=/etc/vmail
26
27 # white e black list degli host da cui accettare connessioni SMTP
28 WHITELIST=EXIM4/white.list
29 BLACKLIST=EXIM4/black.list
30
31 # gli alias per i soli utenti di sistema della macchina
32 SYS_ALIASES=/etc/aliases
33
34
35 # Il livello di spam oltre il quale spamassassin rifiuta lo spam a livello smtp
36 # in qualsiasi caso (moltiplicato per 10!) (metterlo a 65534 e` come dire
37 # che lo spam riconosciuto come tale per contenuto non viene mai rifiutato
38 # a livello SMTP ma viene sempre accettato e marcato)
39 SPAM_SCORE_DENY=100
40
41 # Il livello di spam oltre il quale marco il messaggio come spam pero` lo accetto
42 # comunque (lo rifiuto pero` se il livello supera "SPAM_SCORE_DENY" indicato sopra)
43 # La marcatura setta acl_m5 a 1 e consente poi di filtrare il messaggio in un filtro
44 SPAM_SCORE_MARK=50
45
46
47 # Voglio che il check del mittente setti un warning o rifiuti la mail in caso
48 # di mittente inesistente? (usare "warn", "refuse" o "none" per disattivarlo)
49 # il check del mittente e` considerato pratica erronea, anche se funziona,
50 # quindi e` meglio disattivarlo per essere dei "buoni cittadini di internet"
51 SPAM_CHECK_SENDER=none
52
53 # Voglio che il check delle RBL setti un warning o rifiuti la mail in caso
54 # il cui l'ip del mittente sia in una RBL? (usare "warn" o "refuse" o "none")
55 SPAM_CHECK_RBL=refuse
56
57 # Quali RBL uso per il check precedente (barracudacentral vuole una registrazione)
58 SPAM_RBL_DNSLIST=zen.spamhaus.org
59 #SPAM_RBL_DNSLIST=zen.spamhaus.org : b.barracudacentral.org
60
61
62 # Abilita la funzionalita` di greylisting usando greylistd. (usare "enabled" o "disabled")
63 # Richiede che graylistd sia installato e configurato. Se non usate Debian,
64 # controllate i permessi e il path del socket di graylistd.
65 GREYLISTING=disabled
66
67
68 # Scelta del trasporto da usare per il delivery locale agli utenti dei domini virtuali.
69 # Se si vogliono usare i filtri sieve, occorre usare il delivery che passa per Dovecot LDA
70 # Altrimenti si puo` usare il delivery interno di exim.
71 # Le scelte possibili sono:
72 # - virtual_user_delivery per quello interno di Exim
73 # - virtual_user_dovecot_delivery per l' LDA di Dovecot con il supporto per Sieve
74 # vedasi https://mater.kurgan.org/kb/LinuxDebian/Dovecot-Sieve
75 VIRTUAL_DELIVERY = virtual_user_delivery
76 # VIRTUAL_DELIVERY = virtual_user_dovecot_delivery
77
78
79
80 # Rate limit: per limitare il rischio di spam da parte di un account compromesso
81 # vengono applicati dei rate limit al numero di email inviate per periodo di tempo,
82 # a mezzo delle ACL "ratelimit". Qui sono hardcoded i default, che possono poi essere
83 # modificati (per gli utenti autenticati) nel file di definizione degli utenti.
84
85 # Per gli utenti autenticati: 40 email ogni 5 minuti
86 RATELIMIT_LIMIT=40
87 RATELIMIT_TIME=5m
88
89
90 # Per gli host che possono fare relay e non sono utenti autenticati. (Se sono autenticati
91 # si applica la regola precedente in ogni caso). Se serve che un host superi questi valori
92 # mettere l'host in whitelist.
93 RATELIMIT_HOST_LIMIT=40
94 RATELIMIT_HOST_TIME=5m
95
96 # Per l'allarme in caso di superamento del rate limit: indirizzo email a cui mandare un allarme
97 RATELIMIT_ALARM_RECEIVER=utente@dominio.tld
98
99
100
101 # Variabile interna per definire il numero di campi separati da ":" nel file degli utenti
102 # La versione "minimale" prevede 3 campi: username:password:parametri (opzionali) e
103 # quindi il numero di ":" per arrivare ai parametri opzionali e` 2.
104 # Se uso la modifica per le quote, dovecot mi obbliga a 8 campi, di cui sono usati solo
105 # il primo, il secondo, e l'ottavo. In questo caso il numero di ":" diventa 7.
106 # Questo parametro non va modificato se non si sa cosa si sta facendo.
107
108 # Usare "2" per un file utenti cosi` fatto:
109 # username:password:parametri opzionali
110 # Usare "7" per un file utenti cosi` fatto:
111 # username:password::::::parametri opzionali
112 USERFILE_FIELDS=2
113
114
115
116
117
118 ##
119 ## Configurazione generale di Exim (da modificare se necessario)
120 ##
121
122 #
123 # Disabilitare il supporto ipv6.
124 # E` necessario per riuscire a mandare email a gmail, almeno per il momento.
125 # Se mandi da ipv6 sei sempre uno spammer
126 #
127 disable_ipv6=true
128
129
130
131 # porte sulle quali ascolta l' SMTP. E` sensato usare la 25 (ovviamente)
132 # e anche la 587 (submit). Eventualmente altre porte non standard possono essere
133 # aggiunte.
134 daemon_smtp_ports=25 : 587 : 465
135 tls_on_connect_ports = 465
136
137
138
139 # Se il vostro mail server e` dietro ad un NAT e` meglio inserire qui l' IP pubblico
140 # del NAT, in modo da evitare che il mail server si mandi la mail da solo creando un loop.
141 # questo problema si verifica tipicamente sull' MX secondario quando il primario e` down.
142
143 #hosts_treat_as_local = 1.2.3.4
144
145
146 # hostname della macchina e dominio da usare in assenza di dominio
147 primary_hostname = host.dominio.tld
148 qualify_domain = host.dominio.tld
149
150
151 # I virtuali sono definiti come nomi di files in una directory. Il dominio e` locale
152 # se esiste nella directory VIRTUALS un file che si chiama come il dominio.
153 # Qui non occorre specificare il nome della macchina, che viene preso gia`
154 # in considerazione (nei posti giusti) usando quello indicato prima in
155 # "$primary_hostname". Lo stesso vale per "localhost".
156
157 domainlist local_domains = dsearch;VIRTUALS/users
158
159
160 # domini per i quali faccio relay ma non sono locali (lasciare vuoto, ovvero non scrivere nulla
161 # dopo il carattere "=", per non fare relay per nessun dominio a parte i locali)
162 # esempio: domainlist relay_to_domains = dominio1.com : dominio2.it
163 domainlist relay_to_domains =
164
165
166 # host per i quali faccio relay (i miei client in LAN)
167 hostlist relay_from_hosts = 127.0.0.1/32 : ::::1
168
169
170 # Exim 4.86.2-2 e successivi, introducono questi due parametri. Se non li valorizzo
171 # (anche vuoti) Exim scrive warning dappertutto. Questa configurazione funziona anche
172 # con l'environment piallato totalmente, comunuqe ci mettiamo una cosa sensata.
173 # (non tiene nulla dell'environment del chiamante, e ci mette il path standard)
174 add_environment = <; PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
175 # add_environment = <; PATH=/bin:/usr/bin
176 keep_environment =
177
178
179
180 # se questo file e` presente, exim blocca il delivery contestuale alla ricezione.
181 # lo uso come "stop" in caso di allarme sul rate limit. In realta` non e`
182 # uno stop quanto un delay, perche` ad ogni queue run comunque la mail esce.
183 # se volessi un vero stop dovrei fermare exim.
184 queue_only_file = /tmp/exim_queue_only
185
186
187 # Configurazione dello scanner antivirus. Indica che scanner uso
188 # e come contattarlo. Qui uso clamd (daemon di clamav) su socket locale.
189 av_scanner = clamd:/var/run/clamav/clamd.ctl
190
191 # Se spamd usa il socket e non la porta tcp, questa riga va scommentata. Se
192 # volete usare la porta tcp di default su localhost potete commentare questa riga.
193 spamd_address = /var/run/spamd.ctl
194
195 # Configurazione delle ACL
196 acl_smtp_rcpt = acl_check_rcpt
197 acl_smtp_data = acl_check_contents
198 acl_smtp_mime = acl_check_mime
199
200
201 # trusted_users contiene anche www-data se si usa una webmail che ne ha bisogno.
202 # altrimenti si puo` anche togliere
203 never_users = root
204 trusted_users = mail : www-data
205
206 # Disattivo le richieste ident, tanto quasi nessuno le onora.
207 # rfc1413_hosts = *
208 rfc1413_query_timeout = 0s
209
210 # limiti sul file system per non ingrippare la macchina, e sulle dimensioni delle mail
211 # e dei bounce
212 check_spool_space = 100M
213 return_size_limit = 10k
214 message_size_limit = 100M
215
216 # limiti sulle sessioni smtp.
217 smtp_accept_max_per_connection = 100
218 smtp_accept_queue = 150
219
220
221 # configurazioni dei retry delle mail fallite e dell'eliminazione di quelle che non si
222 # riescono a consegnare
223 ignore_bounce_errors_after = 2d
224 timeout_frozen_after = 7d
225 auto_thaw = 12h
226
227
228 # Logging verboso
229 # log_selector = +address_rewrite +all_parents +delivery_size +received_recipients +received_sender +subject
230
231 # logging molto verboso (da usarsi al posto di quella di prima)
232 log_selector = +all -arguments
233
234
235 # Configurazione SSL server (per smtps o STARTTLS)
236 # scommentare tutte e tre le righe e puntare a certificati validi
237 #tls_certificate = /etc/letsencrypt/ilmiodominio.cert
238 #tls_privatekey = /etc/letsencrypt/ilmiodominio.key
239 #tls_advertise_hosts = *
240
241
242 # patch per bug sslv3 (disabilita totalmente sia SSLv2 che SSLv3)
243 # funziona su Exim 4.80 con link alle lib GNUTLS su Debian 7
244 # non e` detto che funzioni su altre versioni di GNUTLS
245 # sicuramente va modificata se non si usa GNUTLS
246 #tls_require_ciphers = SECURE256:-VERS-SSL3.0
247
248
249
250 ##################################################################
251 ##################################################################
252 ## Fine della parte di configurazione che va modificata ##
253 ## per installare Exim. Da qui in poi dovrebbe andare bene ##
254 ## cosi` come e`. ##
255 ##################################################################
256 ##################################################################
257
258
259
260
261 ######################################################################
262 # ACL CONFIGURATION #
263 # Specifies access control lists for incoming SMTP mail #
264 ######################################################################
265
266 # NOTA: un "accept" o un "deny" che matchano le condizioni
267 # provocano l'accettazione o il rifiuto della mail immediatamente,
268 # quindi tutte le condizioni che seguono in ordine di apparizione
269 # vengono totalmente ignorate.
270
271 begin acl
272
273
274 # Questa ACL viene verificata al momento in cui il remoto mi manda il comando "RCPT TO"
275 acl_check_rcpt:
276
277 # Deny if the local part contains @ or % or / or | or !. These are rarely
278 # found in genuine local parts, but are often tried by people looking to
279 # circumvent relaying restrictions.
280 deny local_parts = ^.*[@%!/|]
281
282 # salvo in due variabili domain e local_part del destinatario, mi serviranno
283 # nella acl successiva per decidere se fare o meno il controllo dello spam.
284 # per farlo uso una acl "warn" alla quale dico di settare due variabili senza
285 # fare alcuna altra azione.
286 warn
287 set acl_m0 = $local_part
288 set acl_m1 = $domain
289
290 # Whitelist / Blacklist
291 accept hosts = ${if exists{WHITELIST}{WHITELIST}{}}
292 set acl_c0 = no_spam_check
293
294 deny hosts = ${if exists{BLACKLIST}{BLACKLIST}{}}
295
296
297
298 # Rate limt per gli utenti autenticati: si applica solo agli utenti
299 # autenticati, da qualsiasi host provengano (conta lo username,
300 # non l'host di provenienza)
301 # Legge, se ci sono, due parametri ratelimit_limit e ratelimit_time
302 # dal file degli utenti e applica questi limiti Se non ci sono usa
303 # i valori hard-coded all'inizio del file di configurazione.
304 # la mostruosa stringa qui sotto si traduce di fatto in una chiamata
305 # a ratelimit cosi` fatta:
306 # ratelimit = limite / tempo / strict / $authenticated_id.
307 # La complessita` sta nel fatto di leggere i valori per limite e tempo
308 # dal file degli utenti per ogni utente e gestire il fallback al default
309 # in assenza di questi valori.
310 # Questa ACL blocca l'invio di ulteriore mail fino a che non si scende
311 # sotto il rate limit impostato, inoltre manda una mail usando
312 # lo script indicato nella riga "continue" ad un indirizzo codificato
313 # all'inizio del file di configurazione (RATELIMIT_ALARM_RECEIVER).
314 # Lo script puo` anche creare un file che inibisce il delivery delle email,
315 # file che andra` cancellato a mano dopo essere intervenuti sul
316 # problema. Questo file pero` non impedisce il delivery ogni tot minuti
317 # che fa exim (vedi /etc/default/exim4) e quindi non impedisce l'eventuale
318 # delivery dello spam ma lo ritarda solo di un poco.
319
320
321 deny authenticated = *
322 ratelimit = ${extract{ratelimit_limit} {${extract{USERFILE_FIELDS}{:} {${lookup {${local_part:$authenticated_id}} lsearch {VIRTUALS/users/${domain:$authenticated_id}}}} }}{$value}{RATELIMIT_LIMIT} } / ${extract{ratelimit_time} {${extract{USERFILE_FIELDS}{:} {${lookup {${local_part:$authenticated_id}} lsearch {VIRTUALS/users/${domain:$authenticated_id}}}} }}{$value}{RATELIMIT_TIME} } / strict / $authenticated_id
323 log_message = RATELIMIT AUTH: $authenticated_id $sender_host_address - $sender_rate/$sender_rate_period (max $sender_rate_limit)
324 message = Utente bloccato per eccessivo invio di email. Rivolgesri all'amministratore del sistema
325 continue = ${run{/bin/bash -c "EXIM4/ratelimitalert.sh RATELIMIT_ALARM_RECEIVER $authenticated_id $sender_host_address $sender_rate $sender_rate_period $sender_rate_limit"}}
326
327
328
329 # Rate limt per gli host nella LAN: si applica agli host che possono fare relay
330 # e non usano autenticazione. Se invece usano l'autenticazione, allora questa
331 # non si applica e si applica la precedente.
332 # Se occorre che un host non sia limitato da questa regola, va messo in whitelist.
333 # Se dovesse servire in futuro rendero` questa regola configurabile per ogni host
334 # in modo diverso, ma per ora non ne ho voglia.
335
336 deny hosts = +relay_from_hosts
337 !authenticated = *
338 ratelimit = RATELIMIT_HOST_LIMIT / RATELIMIT_HOST_TIME / strict / $sender_host_address
339 log_message = RATELIMIT HOST: $sender_host_address - $sender_rate/$sender_rate_period (max $sender_rate_limit)
340 message = Host bloccato per eccessivo invio di email. Rivolgesri all'amministratore del sistema
341 continue = ${run{/bin/bash -c "EXIM4/ratelimitalert.sh RATELIMIT_ALARM_RECEIVER '' $sender_host_address $sender_rate $sender_rate_period $sender_rate_limit"}}
342
343
344
345 # Accept if the source is local SMTP (i.e. not over TCP/IP). We do this by
346 # testing for an empty sending host field.
347 # Qui dovro` ragionare sul rate limit.
348 accept hosts = :
349
350
351 # Se la mail viene dagli host dai quali accetto il relay (tipicamente la mia LAN)
352 # la accetto e setto una variabile per evitare di fare il check dello spam
353 # sui messaggi che vengono dalla mia rete.
354 accept hosts = +relay_from_hosts
355 set acl_c0 = no_spam_check
356
357
358 # Accept mail to postmaster and other administrative addresses in any local domain,
359 # regardless of the source, and without verifying the sender.
360 accept local_parts = postmaster : bayes : revoke
361 domains = +local_domains : +relay_to_domains : $primary_hostname : localhost : lsearch;VIRTUALS/domain_aliases
362
363
364 # Se il destinatario e` listato nel file VIRTUALS/allowed_recipients allora
365 # lo accetto comunque, ignorando tutti i controlli sul mittente.
366 accept recipients = ${if exists{VIRTUALS/allowed_recipients}{VIRTUALS/allowed_recipients}{}}
367 set acl_c0 = no_spam_check
368
369
370 # Se la mail viene da un client autenticato, la accetto comunque.
371 # Inoltre imposto una variabile che usero` per saltare la scansione antispam della mail
372 # proveniente da una connessione autenticata, che ritengo sicura.
373 accept authenticated = *
374 set acl_c0 = no_spam_check
375
376
377 # Rifiuta se non c'e' l'HELO
378 deny message = HELO/EHLO required by SMTP RFC
379 condition = ${if eq{$sender_helo_name}{}{yes}{no}}
380
381 # Rifiuta se l'IP in HELO e' uguale al mio...
382 deny message = My IP detected in HELO
383 condition = ${if eq{$sender_helo_name}{$interface_address}{yes}{no}}
384
385 # Rifiuta se l'hostname usato in HELO e' il mio
386 deny message = Forged hostname detected in HELO
387 !authenticated = *
388 condition = ${if match_domain{$sender_helo_name}{+local_domains}{yes}{no}}
389
390 # Solo un destinatario se il mittente e' nullo
391 deny message = Only one recipient accepted for NULL sender
392 senders = :
393 condition = ${if >{$rcpt_count}{1} {1}}
394
395
396 # RBL Check (se non e` nella lista degli host da cui faccio relay, ovvero la mia LAN,
397 # allora controllo presso i vari provider di RBL e poi rejecto con un messaggio personalizzabile)
398 deny hosts = ! +relay_from_hosts
399 condition = ${if eq {SPAM_CHECK_RBL} {refuse} {true}{false}}
400 dnslists = SPAM_RBL_DNSLIST
401 message = rejected because $sender_host_address is in a black list at $dnslist_domain
402
403 # Altro tipo di RBL check, come prima ma la mail viene accettata comunque, con un
404 # warning in un header e l'impostazione della variabile acl_m5, utile se si vuole
405 # usare il router che salva lo spam in un folder imap separato.
406 # imposta anche la variabile acl_m5 per indicare che un controllo antispam ha dato esito positivo
407 warn message = X-Warning: $sender_host_address is in a black list at $dnslist_domain
408 condition = ${if eq {SPAM_CHECK_RBL} {warn} {true}{false}}
409 hosts = ! +relay_from_hosts
410 log_message = RBL check: $sender_host_address found in $dnslist_domain
411 dnslists = SPAM_RBL_DNSLIST
412 set acl_m5 = 1
413
414 # Verifico se il mittente esiste facendo una chiamata al suo mail server e fingendo di
415 # volergli mandare una mail. Se il mittente non esiste, rifiuto la mail. Se il suo mail server
416 # non risponde, la accetto lo stesso.
417 deny condition = ${if eq {SPAM_CHECK_SENDER} {refuse} {true}{false}}
418 !verify = sender/callout=10s,connect=5s/defer_ok
419
420
421 # Variante che imposta un header se il mittente non esiste (2010-01-13)
422 # imposta anche la variabile acl_m5 per indicare che un controllo antispam ha dato esito positivo
423 warn condition = ${if eq {SPAM_CHECK_SENDER} {warn} {true}{false}}
424 !verify = sender/callout=10s,connect=5s/defer_ok
425 message = X-Warning: sender verify failed: $acl_verify_message
426 hosts = ! +relay_from_hosts
427 log_message = sender verify failed: $acl_verify_message
428 set acl_m5 = 1
429
430
431 # implementazione delle greylist a mezzo del demone greylistd.
432 # Se la mail non e` stata rifiutata prima, arriva qui e viene verificata la greylist prima
433 # di venire eventualmente accettata dalle ACL che seguono.
434 # notare che non considero il singolo host, ma la net /24 a cui esso appartiene.
435 # questo e` un rilassamento del controllo per evitare di ritardare all'infinito mail che vengono
436 # da sistemi che hanno diversi smpt server che lavorano in parallelo.
437 defer message = Sender is greylisted. Please try again later.
438 !authenticated = *
439 condition = ${if eq {GREYLISTING} {enabled} {true}{false}}
440 condition = ${if eq {grey}\
441 {${readsocket{/var/run/greylistd/socket}\
442 {${mask:$sender_host_address/24} \
443 $sender_address \
444 $local_part@$domain}\
445 {5s}{}{}}}\
446 {true}{false}}
447 log_message = Greylisted $sender_host_address $sender_address $local_part@$domain
448
449
450 # Accept if the address is in a local domain, but only if the recipient can
451 # be verified. Otherwise deny. The "endpass" line is the border between
452 # passing on to the next ACL statement (if tests above it fail) or denying
453 # access (if tests below it fail).
454 accept domains = +local_domains : $primary_hostname : localhost : lsearch;VIRTUALS/domain_aliases
455 endpass
456 message = unknown user
457 verify = recipient
458
459 # Accetto la mail se sono un MX secondario, ma tento di verificarla presso il primario.
460 # Se il primario non risponde, la accetto (defer_ok), mentre se risponde verifico se
461 # il destinatario esiste o meno. Se non esiste, la rifiuto. Questo evita di affogare
462 # il secondario nello spam che il primario ha rifiutato.
463 accept domains = +relay_to_domains
464 endpass
465 message = unrouteable address or unknown user
466 verify = recipient/callout=5s/defer_ok
467
468 # If control reaches this point, the domain is neither in +local_domains
469 # nor in +relay_to_domains.
470
471
472 # Reaching the end of the ACL causes a "deny", but we might as well give
473 # an explicit message.
474 deny message = relay not permitted
475
476
477
478 # Questa ACL viene verificata dopo aver ricevuto il body (DATA), quindi di fatto subito prima della
479 # fine della connessione SMTP.
480 acl_check_contents:
481
482 # check virus. Lascio che il messaggio passi se il virus scanner non funziona (defer_ok)
483 # I contenuti mime del messaggio sono gia` stati decodificati nella acl "acl_check_mime".
484 # DISATTIVAZIONE: il controllo antivirus e` sempre attivo a meno che nel file degli utenti
485 # del dominio non sia specificato "virus=off" fra i paramentri dopo la password.
486 deny message = This message contains a virus ($malware_name) and has been rejected
487 condition = ${if or{ {!exists{VIRTUALS/users/$acl_m1}} {!eq {${extract{virus} {${extract{USERFILE_FIELDS}{:} {${lookup {$acl_m0} lsearch {VIRTUALS/users/$acl_m1}}} }} }} {off}}} {true} {false} }
488 malware = */defer_ok
489
490
491 # Check spam: Se il messaggio non e` stato mandato dai miei utenti, e
492 # se non e` troppo grosso per scannarlo, lo scanno e mi segno i punteggi
493 # dentro delle variabili
494 warn
495 condition = ${if !eq {$acl_c0} {no_spam_check} }
496 spam = mail:true/defer_ok
497 logwrite = SpamScore $spam_score
498 set acl_m2 = $spam_score_int
499 set acl_m3 = $spam_report
500 set acl_m4 = [SPAM]($spam_score) $rh_Subject
501
502 # Check spam: se a livello di sistema e` impostata una soglia di "spammosita`"
503 # oltre la quale lo spam viene rifiutato, lo rifiuto a livello smtp
504 deny
505 condition = ${if > {$spam_score_int}{SPAM_SCORE_DENY} {true}{false}}
506 log_message = Message refused by system configuration (spam score $spam_score_int is too high)
507 message = This message is considered to be spam based on its contents
508
509 # Check spam: se a livello di sistema e` impostata una soglia di spammosita` per il marking,
510 # marco il messaggio con un header e setto la acl_m5 a 1 per indicare che un controllo
511 # antispam ha dato esito positivo (2010-01-15)
512 warn
513 condition = ${if > {$spam_score_int}{SPAM_SCORE_MARK} {true}{false}}
514 log_message = Message marked as spam by system configuration (spam score $spam_score_int is too high)
515 set acl_m5 = 1
516 message = X-Warning: Spamassassin score $spam_score_int is higher than system-wide threshold
517
518
519
520 # Check spam: se il destinatario ha impostato il parametro spam_smtp_deny,
521 # leggo il punteggio e decido se rifiutare la mail (in base al punteggio)
522 # Se spam_smtp_deny non e` impostato, salto questo controllo
523 deny
524 condition = ${if exists{VIRTUALS/users/$acl_m1} {true}{false} }
525 condition = ${if !eq {} {${extract{spam_smtp_deny} {${extract{USERFILE_FIELDS}{:} {${lookup {$acl_m0} lsearch {VIRTUALS/users/$acl_m1}}} }} }} }
526 condition = ${if > {$spam_score_int} {${extract{spam_smtp_deny} {${extract{USERFILE_FIELDS}{:} {${lookup {$acl_m0} lsearch {VIRTUALS/users/$acl_m1}}} }} }} }
527 log_message = Messagre refused by recipient (user) configuration (spam score too high)
528 message = This message is considered to be spam based on its contents
529
530
531 # Check spam: come sopra, pero` nel file degli alias e non nel file
532 # degli utenti. Teoricamente dovrei verificare se esite un alias
533 # con lo stesso indirizzo di un utente, e nel caso applicare solo il
534 # check dell'alias e non quello dell'utente, al momento li
535 # applico entrambi, col risultato che il piu` restrittivo decide la sorte
536 # del messaggio.
537 deny
538 condition = ${if exists{VIRTUALS/aliases/$acl_m1} {true}{false} }
539 condition = ${if !eq {} {${extract{spam_smtp_deny} {${extract{2}{:} {${lookup {$acl_m0} lsearch {VIRTUALS/aliases/$acl_m1}}} }} }} }
540 condition = ${if > {$spam_score_int} {${extract{spam_smtp_deny} {${extract{2}{:} {${lookup {$acl_m0} lsearch {VIRTUALS/aliases/$acl_m1}}} }} }} }
541 log_message = Messagre refused by recipient (alias) configuration (spam score too high)
542 message = This message is considered to be spam based on its contents
543
544
545 # Check spam: come sopra, pero` nel file dei domain alias.
546 # in questo caso pero` e` possibile indicare solo un valore
547 # per tutti gli utenti del dominio aliasato
548 deny
549 condition = ${if exists{VIRTUALS/domain_aliases} {true}{false} }
550 condition = ${if !eq {} {${extract{spam_smtp_deny} {${extract{2}{:} {${lookup {$acl_m1} lsearch {VIRTUALS/domain_aliases}}} }} }} }
551 condition = ${if > {$spam_score_int} {${extract{spam_smtp_deny} {${extract{2}{:} {${lookup {$acl_m1} lsearch {VIRTUALS/domain_aliases}}} }} }} }
552 log_message = Messagre refused by recipient (domain alias) configuration (spam score too high)
553 message = This message is considered to be spam based on its contents
554
555
556 # Alla fine accetto tutto quello che e` passato fino a qui.
557 accept
558
559
560 # Questa ACL si applica ai contenuti MIME. In pratica qui non faccio nessun
561 # controllo sul contenuto, ma mi limito a decodificarlo in modo da poter
562 # poi eseguire il controllo antivirus sui contenuti decodificati.
563 acl_check_mime:
564 warn decode = default
565 accept
566
567
568
569 ######################################################################
570 # ROUTERS CONFIGURATION #
571 # Specifies how addresses are handled #
572 ######################################################################
573 # THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! #
574 # An address is passed to each router in turn until it is accepted. #
575 ######################################################################
576
577 begin routers
578
579 # This router routes addresses that are not in local domains by doing a DNS
580 # lookup on the domain name. These are sent via SMTP.
581 # Any domain that resolves to 0.0.0.0 or to a loopback interface address
582 # (127.0.0.0/8) is treated as if it had no DNS entry.
583 # If the DNS lookup fails, no further routers are tried because of
584 # the no_more setting, and consequently the address is unrouteable.
585 dnslookup:
586 driver = dnslookup
587 domains = ! +local_domains : ! $primary_hostname : ! localhost : ! lsearch;VIRTUALS/domain_aliases
588 transport = remote_smtp
589 ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
590 no_more
591
592
593 # gestione autoreply
594 # Se esiste un file VIRTUALS/autoreply/domain/user allora fa un autoreply per questo utente
595 # usando come testo della risposta il contenuto del file
596 autoreply:
597 driver = accept
598 condition = ${if exists{VIRTUALS/autoreply/$domain/$local_part} {true}{false} }
599 no_verify
600 no_expn
601 unseen
602 transport = autoreply
603 senders = ! ^.*-request@.*:\
604 ! ^bounce-.*@.*:\
605 ! ^.*-bounce@.*:\
606 ! ^owner-.*@.*:\
607 ! ^postmaster@.*:\
608 ! ^abuse@.*:\
609 ! ^webmaster@.*:\
610 ! ^listmaster@.*:\
611 ! ^mailer-daemon@.*:\
612 ! ^root@.*
613
614
615 # gestione dei files .forward per gli utenti locali della macchina
616 userforward:
617 driver = redirect
618 check_local_user
619 condition = ${if exists{$home/.forward} {true}{false} }
620 domains = ${primary_hostname} : localhost
621 file = $home/.forward
622 no_verify
623 no_expn
624 check_ancestor
625 # allow_filter
626 file_transport = address_file
627 pipe_transport = address_pipe
628 reply_transport = address_reply
629
630
631 # alias di sistema presi da /etc/aliases, solo per l'hostname locale
632 system_aliases:
633 driver = redirect
634 allow_fail
635 allow_defer
636 domains = ${primary_hostname} : localhost
637 data = ${lookup {$local_part} lsearch{SYS_ALIASES} }
638 file_transport = address_file
639 pipe_transport = address_pipe
640
641
642 # delivery della mail per gli utenti locali della macchina
643 localuser:
644 driver = accept
645 domains = ${primary_hostname} : localhost
646 check_local_user
647 transport = local_delivery
648
649 # alias di sistema presi da /etc/aliases, solo per l'hostname locale
650 # Questa volta cerco con l' asterisco, in modo che se alla fine del file aliases metto una voce
651 # che dice "*:indirizzo", un qualsiasi indirizzo che non sia stato trovato prima (ne` fra gli alias
652 # ne` fra gli utenti) venga diretto all'indirizzo indicato dopo l'asterisco.
653 # questo sistema bruttino di fare due volte la ricerca degli alias serve per consentire di avere
654 # un ordine preciso: prima gli alias (Senza asterisco) poi gli utenti, e per finire l'alias con
655 # l'asterisco (se c'e`)
656 system_aliases_wildcard:
657 driver = redirect
658 allow_fail
659 allow_defer
660 domains = ${primary_hostname} : localhost
661 data = ${lookup {$local_part} lsearch*{SYS_ALIASES} }
662 file_transport = address_file
663 pipe_transport = address_pipe
664
665
666 # Redirect di tutte le mail indirizzate ai vari postmaster, sia
667 # dei domini locali (virtuali), sia a quello della macchina
668 # Queste vanno tutte a qualcuno che sappia cosa farne.
669 domain_postmaster:
670 driver = redirect
671 local_parts = postmaster
672 domains = +local_domains : ${primary_hostname} : localhost
673 check_ancestor
674 retry_use_local_part
675 data = POSTMASTER
676
677 ##### ATTENZIONE: questo pezzo e` incompleto e non va usato se non viene prima sistemato #####
678 ## Istruiamo spamassassin. Le mail indirizzate a bayes e revoke vanno mandate a
679 ## un trasporto speciale che addestra il filtro bayesiano e riporta a razor
680 #bayes_report:
681 # driver = accept
682 # local_parts = bayes : revoke
683 # domains = +local_domains
684 # transport = bayes_update
685
686
687 # gli indirizzi real-email@domain non passano per l'espansione degli alias
688 real_virtual_user:
689 driver = accept
690 local_part_prefix = real-
691 domains = +local_domains
692 condition = ${lookup {$local_part} lsearch{VIRTUALS/users/$domain} }
693 retry_use_local_part
694 transport = VIRTUAL_DELIVERY
695
696
697
698 # alias virtuali, redirect ad altri indirizzi e/o pipe verso comandi
699 virtual_aliases:
700 driver = redirect
701 allow_defer
702 allow_fail
703 domains = +local_domains
704 condition = ${if exists{VIRTUALS/aliases/$domain} {true}{false} }
705 pipe_transport = address_pipe
706 file_transport = address_file
707 data = ${extract{1}{:} {${lookup {$local_part} lsearch{VIRTUALS/aliases/${domain}} } }}
708 user=${extract{pipe_user} {${extract{2}{:}{${lookup {$local_part} lsearch{VIRTUALS/aliases/${domain}} }}}} {$value} {Debian-exim}}
709 group=${extract{pipe_group} {${extract{2}{:}{${lookup {$local_part} lsearch{VIRTUALS/aliases/${domain}} }}}} {$value} {Debian-exim}}
710
711
712
713
714 # Prima del delivery finale agli utenti virtuali applico eventuali
715 # regole per lo spam definite nel file VIRTUALS/users/$domain
716 # per l'utente in questione. (i prossimi due router)
717
718 # Questo router mette lo spam nel gufo se cosi` e`
719 # richiesto dalla configurazione utente. Attenzione che
720 # qui si perdono i messaggi se si sbaglia configurazione
721 virtual_spam_owl:
722 driver = redirect
723 domains = +local_domains
724 no_verify
725 condition = ${if > {$spam_score_int} {${extract{spam_blackhole} {${extract{USERFILE_FIELDS}{:} {${lookup {$local_part} lsearch {VIRTUALS/users/$domain}}} }}{$value}{65535} }} }
726 data=:blackhole:
727
728 # Questo router modifica il subject se richiesto
729 # nella configurazione dell'utente. Per velocita`
730 # faccio in modo di non ripassare tutti i router da capo
731 # ma di passare direttamente al successivo (redirect_router)
732 virtual_spam_add_subject:
733 driver = redirect
734 domains = +local_domains
735 no_verify
736 condition = ${if > {$spam_score_int} {${extract{spam_subject} {${extract{USERFILE_FIELDS}{:} {${lookup {$local_part} lsearch {VIRTUALS/users/$domain}}} }}{$value}{65535} }} }
737 headers_remove = Subject
738 headers_add = Subject: $acl_m4
739 data = $local_part@$domain
740 redirect_router = virtual_filter
741
742
743
744 # Delivery dello spam in una cartella IMAP apposta (2010-01-15)
745 # Questo, se l'utente ha il parametro spam_folder settato e la variabile acl_m5 e` uguale a 1
746 # (quindi la mail in questione ha fatto scattare almeno uno dei controlli antispam)
747 # salva la mail in un folder che ha il nome indicato nel parametro spam_folder
748 # (piu` esattamente chiama un trasporto apposta che provvedera` all'uopo)
749 virtual_spam_folder:
750 driver=accept
751 domains = +local_domains
752 condition = ${if and{ { !eq{}{${lookup {$local_part} lsearch{VIRTUALS/users/$domain}}}} {={$acl_m5}{1}} {={1}{ ${extract{spam_folder} { ${extract{USERFILE_FIELDS}{:} {${lookup {$local_part} lsearch {VIRTUALS/users/$domain}}} }}{1}{0}} }} } }
753 headers_remove = X-Spam-Score:X-Spam-Report
754 headers_add = X-Spam-Score: $acl_m2\nX-Spam-Report: $acl_m3\nX-Spam-Boolean: $acl_m5\n
755 transport = virtual_user_spam_delivery
756
757
758
759
760 # Filtri per gli utenti dei domini virtuali.
761 # Questo router applica un filtro alle mail in transito per l'utente
762 # se esiste un file VIRTUALS/filters/$domain/$local_part
763 # Questo sistema non e` sicuro se i filtri possono essere impostati da qualcuno che
764 # ha cattive intenzioni. Idealmente i files dei filtri dovrebbero essere creati solo
765 # dal sysadmin su richiesta degli utenti.
766 virtual_filter:
767 user=mail
768 group=mail
769 driver = redirect
770 domains = +local_domains
771 condition = ${if exists{VIRTUALS/filters/$domain/$local_part} {true}{false} }
772 file = VIRTUALS/filters/$domain/$local_part
773 headers_remove = X-Spam-Score:X-Spam-Report
774 headers_add = X-Spam-Score: $acl_m2\nX-Spam-Report: $acl_m3\nX-Spam-Boolean: $acl_m5\n
775 no_verify
776 allow_filter
777 allow_freeze
778 directory_transport = address_directory
779 file_transport = address_file
780 pipe_transport = address_pipe
781 reply_transport = autoreply
782
783
784 # Delivery agli utenti dei domini virtuali
785 virtual_user:
786 driver = accept
787 domains = +local_domains
788 condition = ${lookup {$local_part} lsearch{VIRTUALS/users/$domain} }
789 headers_remove = X-Spam-Score:X-Spam-Report
790 headers_add = X-Spam-Score: $acl_m2\nX-Spam-Report: $acl_m3\nX-Spam-Boolean: $acl_m5\n
791 retry_use_local_part
792 transport = VIRTUAL_DELIVERY
793
794
795 # Questo router cerca un indirizzo del tipo "user-ggmmaaaa@domain.tld" e se lo trova lo ridirige a
796 # user@domain.tld senza il "-ggmmaaaa". Serve a fornire ad ogni utente un indirizzo mail "temporaneo"
797 # valido solo per la data odierna, utile per iscriversi a quei servizi che poi magari ti spammano
798 # a morte, perche` da domani questo non e` piu` valido.
799 auto_daily_alias:
800 driver = redirect
801 check_ancestor
802 condition = ${if eq {${substr{-9}{10}{$local_part}}} {-${substr{6}{2}{$tod_logfile}}${substr{4}{2}{$tod_logfile}}${substr{0}{4}{$tod_logfile}}} {true}{false}}
803 data = ${substr{-9}{$local_part}}@$domain
804
805
806 # alias virtuali, redirect ad altri indirizzi e/o pipe verso comandi
807 # questa volta anche con l'asterisco, come per gli aliases locali
808 virtual_aliases_wildcard:
809 driver = redirect
810 allow_defer
811 allow_fail
812 domains = +local_domains
813 condition = ${if exists{VIRTUALS/aliases/$domain} {true}{false} }
814 pipe_transport = address_pipe
815 file_transport = address_file
816 data = ${extract{1}{:} {${lookup {$local_part} lsearch*{VIRTUALS/aliases/${domain}} } }}
817 user=${extract{pipe_user} {${extract{2}{:}{${lookup {$local_part} lsearch{VIRTUALS/aliases/${domain}} }}}} {$value} {Debian-exim}}
818 group=${extract{pipe_group} {${extract{2}{:}{${lookup {$local_part} lsearch{VIRTUALS/aliases/${domain}} }}}} {$value} {Debian-exim}}
819
820
821
822
823 # alias dei domini. Se esiste un file che si chiama VIRTUALS/domain_aliases
824 # questo consente di ridirigere tutta la mail per un dominio su un'altro.
825 # la sintassi del file domain_aliases e` "dominio_origine:dominio_destinazione[:variabili]"
826 # (una coppia per riga). In questo modo quando riceviamo una mail per
827 # utente@dominio_origine, prima viene verificato se esiste l'utente nel
828 # dominio originale. Se l'utente non esiste, o se proprio non esiste il file
829 # degli utenti del dominio originale, allora la mail viene ridiretta a
830 # utente@dominio_destinazione.
831 domain_aliases:
832 driver = redirect
833 condition = ${if and{ {exists{VIRTUALS/domain_aliases}} {!eq {${lookup {$domain} lsearch{VIRTUALS/domain_aliases}}} {}}}{true}{false}}
834 data = ${quote:$local_part}@${extract{1}{:} {${lookup {$domain} lsearch{VIRTUALS/domain_aliases}}}}
835
836
837
838 ######################################################################
839 # TRANSPORTS CONFIGURATION #
840 ######################################################################
841 # ORDER DOES NOT MATTER #
842 # Only one appropriate transport is called for each delivery. #
843 ######################################################################
844
845 begin transports
846
847 # Delivery via SMTP all' MX del dominio remoto
848 remote_smtp:
849 driver = smtp
850 dkim_canon = relaxed
851 dkim_selector = dkim
852 dkim_domain = ${lc:$sender_address_domain}
853 dkim_private_key = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
854 # fallback_hosts = your.provider.smtp.server
855 ### hosts_avoid_esmtp = *
856 # interface = 89.40.12.236
857
858 # Delivery locale per gli utenti fisici della macchina. (files in /var/mail)
859 local_delivery:
860 driver = appendfile
861 file = /var/mail/$local_part
862 group=mail
863 delivery_date_add
864 envelope_to_add
865 return_path_add
866
867 # Pipe ad un programma, per i vari files di forward
868 address_pipe:
869 driver = pipe
870 return_output
871
872 # Scrittura su un file, per i vari files di forward
873 address_file:
874 driver = appendfile
875 delivery_date_add
876 envelope_to_add
877 return_path_add
878
879 # Scrittura su una maildir, per i vari files di forward
880 address_directory:
881 driver=appendfile
882 delivery_date_add
883 envelope_to_add
884 return_path_add
885 maildir_format
886
887 # Reply a mezzo email, per i vari files di forward. Questo NON va usato per vacation
888 # perche` non ha protezioni tipo once o simili.
889 address_reply:
890 driver = autoreply
891
892 # Insegnamento a spamassassin
893 # Mai testato e mai usato. Al momento lo commento e lo tengo buono per il futuro.
894 # Come sistema di insegnamento a spamassassin, usiamo quello via IMAP.
895 #spam_update:
896 # driver = pipe
897 # user = mail
898 # group = mail
899 # return_output
900 # command = spamassassin if{ eq {$local_part}{revoke} {-k}{-r}}
901
902
903 # Delivery locale agli utenti virtuali (il trasporto fondamentale)
904 # Questa e` la versione che NON USA Dovecot LDA e quindi NON funziona con SIEVE.
905 virtual_user_delivery:
906 driver = appendfile
907 directory = MAIL/$domain/$local_part
908 maildir_format
909 user = mail
910 group = mail
911 mode = 0600
912 directory_mode = 0700
913
914
915 # Delivery locale agli utenti virtuali con Dovecot LDA e supporto SIEVE
916 # vedasi https://mater.kurgan.org/kb/LinuxDebian/Dovecot-Sieve
917 virtual_user_dovecot_delivery:
918 driver = pipe
919 command = /usr/lib/dovecot/dovecot-lda -d $local_part@$domain -f $sender_address -a $original_local_part@$original_domain
920 message_prefix =
921 message_suffix =
922 delivery_date_add
923 envelope_to_add
924 return_path_add
925 log_output
926 user = mail
927 temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78
928
929
930
931 # Delivery locale agli utenti virtuali della mail che e` considerata spam
932 # Questo viene chiamato se si decide di accettare lo spam anziche` rimbalzarlo
933 # e fa delivery in un folder imap apposito, specificato nella configurazione
934 # dell'utente alla voce "spam_folder". Viene chiamato dal router "virtual_spam_folder".
935 virtual_user_spam_delivery:
936 driver = appendfile
937 directory = MAIL/$domain/$local_part/.${extract{spam_folder} { ${extract{USERFILE_FIELDS}{:} {${lookup {$local_part} lsearch {VIRTUALS/users/$domain}}} }}{$value}{}}
938 # directory = MAIL/$domain/$local_part/.testspam
939 maildir_format
940 user = mail
941 group = Debian-exim
942 mode = 0600
943 directory_mode = 0700
944
945
946
947
948 # Trasporto di replay con funzione di limitazione con file once.
949 # funziona per il router autoreplay oppure se chiamato in un filtro.
950 # imposta il subject a un valore standard, e il testo al contenuto del file di autoreply oppure
951 # ad un valore standard se questo file non esiste. I valori possono essere overridati nel filtro.
952 autoreply:
953 driver = autoreply
954 to = ${sender_address}
955 from = "${local_part}@${domain}"
956 subject = "Autoreply from: ${local_part}@${domain}"
957 text = ${if exists{VIRTUALS/autoreply/$domain/$local_part}{${readfile{VIRTUALS/autoreply/$domain/$local_part}{\n}}}{"This autoreply text should always be overridden"}}
958 user = mail
959 group = mail
960 once = MAIL/$domain/${local_part}_autoreply.once
961 once_file_size = 10k
962 once_repeat = 1d
963
964
965
966
967
968 ######################################################################
969 # RETRY CONFIGURATION #
970 ######################################################################
971
972 begin retry
973
974
975 # Regle di retry.
976 # Se ho un errore 4xx (segno di una greylist) allora riprovo spesso
977 # Se ho errori diversi, riprovo in modo meno insistente
978
979 # ATTENZIONE: perche` questi retry cosi` veloci (2 minuti) funzionino
980 # occorre che Exim esegua il "queue run" spesso. Se lo fa solo ogni 30
981 # minuti allora ovviamente la mail partira` ogni 30 minuti e non piu`
982 # spesso.
983
984 # Domain Error Retries
985 # ------ ----- -------
986 * rcpt_4xx F,1h,2m; F,23h,30m; G,3d,1h,1.1
987 * mail_4xx F,1h,2m; F,23h,30m; G,3d,1h,1.1
988 * data_4xx F,1h,2m; F,23h,30m; G,3d,1h,1.1
989 * * F,2h,15m; F,23h,1h; G,3d,1h,1.1
990
991
992
993 ######################################################################
994 # REWRITE CONFIGURATION #
995 ######################################################################
996
997 # There are no rewriting specifications in this default configuration file.
998 begin rewrite
999
1000 ######################################################################
1001 # AUTHENTICATION CONFIGURATION #
1002 ######################################################################
1003
1004 begin authenticators
1005
1006
1007 ###
1008 ### Autenticazione su file di testo
1009 ###
1010
1011 #cram:
1012 # driver = cram_md5
1013 # public_name = CRAM-MD5
1014 # server_secret = ${lookup{$auth1}lsearch{EXIM4/passwd.smtp}{$value}fail}
1015 # server_set_id = $1
1016
1017
1018 #plain:
1019 # driver = plaintext
1020 # public_name = PLAIN
1021 # server_prompts = :
1022 # server_condition = "\
1023 # ${if and {{!eq{$2}{}}{!eq{$3}{}} \
1024 # {eq{$3}{${extract{1}{:} \
1025 # {${lookup{$2}lsearch{EXIM4/passwd.smtp}{$value}}}}}}}{1}{0}}"
1026 # server_set_id = $2
1027
1028 #login:
1029 # driver = plaintext
1030 # public_name = LOGIN
1031 # server_prompts = "Username:: : Password::"
1032 # server_condition = "\
1033 # ${if and {{!eq{$1}{}}{!eq{$2}{}} \
1034 # {eq{$2}{${extract{1}{:} \
1035 # {${lookup{$1}lsearch{EXIM4/passwd.smtp}{$value}}}}}}}{1}{0}}"
1036 # server_set_id = $1
1037
1038
1039 ###
1040 ### Autenticazione su Dovecot
1041 ###
1042
1043 # questo sistema richiede che Dovecot sia configurato per fornire autenticazione sul socket
1044 # definito qui in "server_socket" e che supporti tutti i metodi di autenticazione definiti
1045 # qui in alla voce "public_name".
1046
1047
1048 dovecot_cram:
1049 driver = dovecot
1050 public_name = CRAM-MD5
1051 server_socket = /var/run/dovecot/auth-client
1052 server_set_id = $auth1
1053
1054 dovecot_plain:
1055 driver = dovecot
1056 public_name = PLAIN
1057 server_socket = /var/run/dovecot/auth-client
1058 server_set_id = $auth1
1059
1060 dovecot_login:
1061 driver = dovecot
1062 public_name = LOGIN
1063 server_socket = /var/run/dovecot/auth-client
1064 server_set_id = $auth1
1065
1066 dovecot_ntlm:
1067 driver = dovecot
1068 public_name = NTLM
1069 server_socket = /var/run/dovecot/auth-client
1070 server_set_id = $auth1
1071
1072
1073
1074
1075 ######################################################################
1076 # CONFIGURATION FOR local_scan() #
1077 ######################################################################
1078
1079 # If you have built Exim to include a local_scan() function that contains
1080 # tables for private options, you can define those options here. Remember to
1081 # uncomment the "begin" line. It is commented by default because it provokes
1082 # an error with Exim binaries that are not built with LOCAL_SCAN_HAS_OPTIONS
1083 # set in the Local/Makefile.
1084
1085 # begin local_scan
1086
1087 # End of Exim configuration file
Attached Files
To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.You are not allowed to attach a file to this page.