annotate README.postfix @ 749:fdc57c9e5f56

Remove .sh from mlmmj-make-ml.sh; symlink original name
author Ben Schmidt
date Sun, 03 Oct 2010 22:12:33 +1100
parents dfc9ab125fd4
children ddae562f7cf0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
706
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
1 README.postfix Dec 16th 2009
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
2
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
3 POSTFIX ISSUES
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
4
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
5 The main issue with Postfix and mlmmj is the mlmmj requirement that
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
6 the mlmmj executables must be executed by root or the owner of the
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
7 list directory.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
8
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
9 This is at odds with Postfix. The standard local delivery mechanism
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
10 for Postfix is local(8) that ships with Postfix. According to
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
11 local(8) delivery to external programs is done on behalf of the
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
12 receiving user. But when delivering to a program without using a
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
13 .forward file there is no user context. And using an alias file
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
14 does not provide user context.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
15
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
16 The man page also explains that in the absence of user context the
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
17 local(8) daemon will use the owner of the :include: file from the
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
18 aliases file. But this is a problem too. By default :include:
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
19 files are disabled as a security precaution in aliases files for
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
20 delivering to external programs.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
21
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
22 This leaves us with a conundrum on how to execute the mlmmj
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
23 executables as an 'mlmmj' user without using alias files. One
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
24 answer is to use a postfix transport.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
25
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
26 First we'll get the 'mlmmj' user setup and then move onto the
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
27 postfix configuration:
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
28
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
29 MLMMJ SETUP
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
30
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
31 Create a 'mlmmj' user that will own all the lists. Use whatever
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
32 user creation app/script is provided by your system. Generally
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
33 'useradd'.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
34
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
35 Create the spool directory that is owned by the 'mlmmj' user.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
36 This is typically /var/spool/mlmmj but can be any directory so long
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
37 as it is owned by 'mlmmj'. It can even be the home directory of the
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
38 'mlmmj' user. If the spool directory is not /var/spool/mlmmj then
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
39 everywhere in this file replace /var/spool/mlmmj with your spool
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
40 directory.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
41
749
fdc57c9e5f56 Remove .sh from mlmmj-make-ml.sh; symlink original name
Ben Schmidt
parents: 748
diff changeset
42 Create a mailing list using mlmmj-make-ml. Make sure to use the
706
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
43 -s flag to set the spool directory if it isn't /var/spool/mlmmj
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
44
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
45 POSTFIX SETUP
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
46
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
47 First thing is to make sure that the postfix server accepts mail for
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
48 the mailing lists. For a server that handles mail for multiple
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
49 domains, this is done with a 'virtual_alias_map'. This is how I'll
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
50 demonstrate.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
51
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
52 Add a virtual_alias_map file to main.cf configuration. We'll use a
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
53 regular expression map since we need to be able to match all the
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
54 various mjmml delimiter addresses (list-subscribe, list-unsubscribe,
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
55 etc)
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
56
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
57 main.cf:
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
58 virtual_alias_maps = hash:/etc/postfix/virtual,
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
59 regexp:/var/spool/mlmmj/virtual.regexp
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
60
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
61 /var/spool/mlmmj/virtual.regexp:
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
62 /^(mlmmj-test.*)@example\.com$/ ${1}
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
63 /^(another-list.*)@sample\.com$/ ${1}
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
64
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
65 One line needs to be in the virtual map for each list the 'mlmmj' id
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
66 is to handle. The regex formula is:
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
67
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
68 /^(list-name.*)@(domain\.com)$/ ${1}
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
69
747
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
70 If you want to host multiple domains in a hierarchical structure,
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
71 you can alternatively use:
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
72
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
73 /^(list-name.*)@(domain\.com)$/ domain--${1}
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
74
706
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
75 Next we make sure that postfix can invoke the mlmmj executables as
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
76 the 'mlmmj' user. This is where the transport map comes in. So we
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
77 add a transport map and a configuration option that instructs the
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
78 transport to only deliver one file at a time. See transport(5) for
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
79 more information on transports.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
80
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
81 main.cf:
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
82 transport_maps = regexp:/var/spool/mlmmj/transport
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
83 mlmmj_destination_recipient_limit = 1
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
84
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
85 /var/spool/mlmmj/transport:
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
86 /^(list-test).*$/ mlmmj:list-test
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
87 /^(another-list).*$/ mlmmj:another-list
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
88
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
89 What this transport file says, is that any message destined for an
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
90 email address that matches the regexp on the left, deliver it using
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
91 the transport 'mlmmj' and setting 'nexthop' to the value in $1.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
92 Which in this case is the mailing list name. 'nexthop' is special
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
93 variable for transports.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
94
747
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
95 For the hierarchical multi-domain solution, use this variant:
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
96
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
97 /^(domain--list-name).*$/ mlmmj:domain/list-name
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
98
706
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
99 Now we setup the 'mlmmj' transport. The 'mlmmj' in mlmmj:$1 above
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
100 indicates a transport listed in the postfix master.cf file. We are
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
101 just going to create a transport called 'mlmmj' but it is nothing
748
dfc9ab125fd4 Fix spelling of 'receive' and 'voodoo'; make mlmmj-recieve a symlink
Chris Webb
parents: 747
diff changeset
102 more than a pipe(8) to the mlmmj-receive program that is invoked as
706
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
103 the 'mlmmj' user.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
104
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
105 master.cf:
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
106 # mlmmj mailing lists
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
107 mlmmj unix - n n - - pipe
748
dfc9ab125fd4 Fix spelling of 'receive' and 'voodoo'; make mlmmj-recieve a symlink
Chris Webb
parents: 747
diff changeset
108 flags=DORhu user=mlmmj argv=/usr/local/bin/mlmmj-receive -F -L /var/spool/mlmmj/$nexthop/
706
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
109
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
110 This takes the pipe(8) postfix delivery agent and tells it to invoke
748
dfc9ab125fd4 Fix spelling of 'receive' and 'voodoo'; make mlmmj-recieve a symlink
Chris Webb
parents: 747
diff changeset
111 '/usr/local/bin/mlmmj-receive' as the 'mlmmj' user and pipe the
706
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
112 email to it on stdin. This mode of transportation is given the name
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
113 'mlmmj'.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
114
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
115 The 'flags' parameter to pipe(8) is pretty critical here. In
748
dfc9ab125fd4 Fix spelling of 'receive' and 'voodoo'; make mlmmj-recieve a symlink
Chris Webb
parents: 747
diff changeset
116 particular if the 'R' option is not used mlmmj-receive fails to
dfc9ab125fd4 Fix spelling of 'receive' and 'voodoo'; make mlmmj-recieve a symlink
Chris Webb
parents: 747
diff changeset
117 receive the mail correctly. The options mean:
706
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
118
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
119 D - Prepend a 'Delivered-To: recipient' header
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
120 O - Prepend an 'X-Original-To: recipient' header
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
121 R - Prepend a 'Return-Path:'. header
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
122 h - fold $nexthop to lowercase
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
123 u - fold $recipient to lowercase
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
124
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
125 $nexthop gets set to what was on the right had side of the ':' in
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
126 the transport file. The way we have that configured is that
747
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
127 $nexthop will get set to the name of the mailing list (or domain
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
128 and name). Your list directories, then, should be at
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
129 /var/spool/mlmmj/list-name as usual, or for the hierarchical
fd77dd58bde1 Added info on a hierarchical multi-domain option to README.postfix
Ben Schmidt
parents: 706
diff changeset
130 multi-domain version, in /var/spool/mlmmj/domain/list-name.
706
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
131
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
132 Restart postfix and enjoy your new lists.
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
133
52189a450b0c Added README.postfix (Jeremy Hinegardner, Andreas Schneider)
mortenp
parents:
diff changeset
134