summaryrefslogtreecommitdiff
path: root/src/mailman/pipeline/docs/file-recips.txt
blob: 81510b6e770b0f2fc7febc4659ffc626a4db952e (plain)
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
File recipients
===============

Mailman can calculate the recipients for a message from a Sendmail-style
include file.  This file must be called members.txt and it must live in the
list's data directory.

    >>> handler = config.handlers['file-recipients']
    >>> mlist = config.db.list_manager.create(u'_xtest@example.com')


Short circuiting
----------------

If the message's metadata already has recipients, this handler immediately
returns.

    >>> msg = message_from_string("""\
    ... From: aperson@example.com
    ...
    ... A message.
    ... """)
    >>> msgdata = {'recips': 7}
    >>> handler.process(mlist, msg, msgdata)
    >>> print msg.as_string()
    From: aperson@example.com
    <BLANKLINE>
    A message.
    <BLANKLINE>
    >>> msgdata
    {'recips': 7}


Missing file
------------

The include file must live inside the list's data directory, under the name
members.txt.  If the file doesn't exist, the list of recipients will be
empty.

    >>> import os
    >>> file_path = os.path.join(mlist.data_path, 'members.txt')
    >>> open(file_path)
    Traceback (most recent call last):
    ...
    IOError: [Errno ...]
    No such file or directory: u'.../_xtest@example.com/members.txt'
    >>> msgdata = {}
    >>> handler.process(mlist, msg, msgdata)
    >>> sorted(msgdata['recips'])
    []


Existing file
-------------

If the file exists, it contains a list of addresses, one per line.  These
addresses are returned as the set of recipients.

    >>> fp = open(file_path, 'w')
    >>> try:
    ...     print >> fp, 'bperson@example.com'
    ...     print >> fp, 'cperson@example.com'
    ...     print >> fp, 'dperson@example.com'
    ...     print >> fp, 'eperson@example.com'
    ...     print >> fp, 'fperson@example.com'
    ...     print >> fp, 'gperson@example.com'
    ... finally:
    ...     fp.close()

    >>> msgdata = {}
    >>> handler.process(mlist, msg, msgdata)
    >>> sorted(msgdata['recips'])
    ['bperson@example.com', 'cperson@example.com', 'dperson@example.com',
     'eperson@example.com', 'fperson@example.com', 'gperson@example.com']

However, if the sender of the original message is a member of the list and
their address is in the include file, the sender's address is /not/ included
in the recipients list.

    >>> from mailman.interfaces.member import MemberRole
    >>> address_1 = config.db.user_manager.create_address(
    ...     u'cperson@example.com')
    >>> address_1.subscribe(mlist, MemberRole.member)
    <Member: cperson@example.com on _xtest@example.com as MemberRole.member>

    >>> msg = message_from_string("""\
    ... From: cperson@example.com
    ...
    ... A message.
    ... """)
    >>> msgdata = {}
    >>> handler.process(mlist, msg, msgdata)
    >>> sorted(msgdata['recips'])
    ['bperson@example.com', 'dperson@example.com',
     'eperson@example.com', 'fperson@example.com', 'gperson@example.com']