Testsuite: Provide '>>> ' for script input to allow binary data
[users/heiko/exim.git] / configs / config.samples / C037
1 Date: Wed, 22 Nov 2000 17:51:42 -0500 (EST)
2 From: Dave C. <djc@microwave.com>
3
4 [Syntax converted for Exim 4 by PH, 06-Dec-2001. Unchecked.]
5
6 Ok.. Ive come up with something which might be worth including in the
7 cookbook. Credit where it is due, the idea for this came from Nigel's
8 C014.
9
10 I have a setup to support ETRN for a few small (ok, two) domains.
11 Currently it just leaves all the mail in the exim spool, and uses the
12 default exim etrn response to flush it out.
13
14 I don't like that - I agree with the opinion expressed on the list that
15 mail should be delivered somewhere else, and then shoved down an SMTP
16 session by some other program. Ive searched far and wide for something
17 suitable to do that shoving, and finally hit upon the only program I
18 trust to do that, handling errors and rejections correctly - exim
19 itself.
20
21 Nigel's solution for 'situation where a site I MX for has a known
22 outage', combined with a bit of bash scriptery, seems to form a neat
23 solution. (An intermittently connected host sort of falls under the
24 'known outage' category ;)
25
26 Without any further fluff, here are the details. Additional comments
27 appear below..
28
29 Either the real (intermittently connected) destination host needs to be
30 listed as the lowest MX (with the exim server as a less preferred) , or
31 the exim server needs to be the lowest MX, but have a router before the
32 lookuphost router which uses route_list or something appropriate to
33 normally deliver mail to the dialup host. The former is probably better
34 for a host which is usually connected and is only occasionally
35 disconnected (since other hosts would be able to delivery directly most
36 of the time, skipping an extra relay), while the latter would probably
37 work better for the converse ;) This paragraph actually applies anytime
38 you are using ETRN..
39
40 In either case, the routers below must precede whatever router handles
41 the normal direct-to-dialup-destination..
42
43 --
44
45 smtp_etrn_command = /etc/exim/etrn_script $domain
46
47 [- Content of /etc/exim/etrn_script: -]
48 #!/bin/sh
49  
50 # Where exim lives
51 EXIM=/usr/sbin/exim
52  
53 # Something appropriate to generate a temporary unique string 
54 UNIQ=`head -c100 /dev/urandom | md5sum | cut -f 1 -d" "`
55
56 arg=$1
57 domain=`echo $arg | sed 's/^\#//g'`
58  
59 if ( test -f /var/spool/etrn/${domain} ); then
60  exim_lock -q /var/spool/etrn/${domain} "mv /var/spool/etrn/${domain} /tmp/etrn-bsmtp-${UNIQ}"
61  ( cat /tmp/etrn-bsmtp-${UNIQ}
62    echo "QUIT" ) | $EXIM -bS -oMr etrn_requeue
63  rm -f /tmp/etrn-bsmtp-${UNIQ}
64 fi
65  
66 $EXIM -R $domain
67
68 [- end of etrn_script -]
69
70 [- exim transport -]
71
72 bsmtp_for_etrn:
73  driver=appendfile
74  file=/var/spool/etrn/$domain
75  user=exim
76  batch_max = 1000
77  use_bsmtp 
78
79 [- routers -]
80 [- You probably would want to put the domains in a file or a dbm and
81 [- adjused the 'domains' setting appropriately for both of these..
82
83 # If any message has already been delivered to the bsmtp file,
84 # this will detect the existence of the file and all messages will
85 # go there, regardless of age.
86 etrn_already:
87  driver = accept
88  transport = bsmtp_for_etrn
89  require_files = /var/spool/etrn/$domain
90  domains = etrntest.somedomain.com
91  
92 # If a message has been on the queue for over the specified amount of
93 # time, this will catch it and drop it into the bsmtp file
94 etrn_delay:
95  driver = accept
96  transport = bsmtp_for_etrn
97  condition = ${if >{$message_age}{1800} {yes}{no}}
98  domains = etrntest.somedomain.com
99
100 [- -]
101
102 Basically, this setup lets exim try to deliver to the real host for up
103 to whatever time is specified in the \%etrn_delay%\ router. (1800 seconds =
104 30 minutes), and then delivers all waiting messages, and any further
105 messages, directly to a BSMTP file. This setup uses one big BSMTP
106 file per domain, it probably wouldnt be too complex to have it use separate
107 files.
108
109 When the \^etrn_script^\ runs, it locks and renames the BSMTP file, and
110 reinjects the messages to Exim, which (presumably) will now be able to
111 deliver them. If it can't, then once they are too old they will again
112 be sent off to the BSMTP file.. (If for som reason this occurs over and
113 over without Exim being able to deliver them, eventually the messages
114 will be returned with \*too many Received headers*\; this is a good
115 thing, since their age will never get high enough for them to be
116 returned by any retry rules).