>
>> I don't suppose you mean
>> that you want to limit the number of apparent recipients in the To: and
>> Cc: header fields. :-)
>
> He might do. That's something I'm trying to implement here, after a very
> nasty internal spam attack. Someone emailed all students on campus, and
> included 20,000 email addresses in the To: header. 70 people hit
> reply-to-all.
>
> What I'm trying to do, if I can get the syntax right, is replace long
> headers To: and Cc: headers (say, more than 1024 chars) with a comment
> like "long list hidden by postmaster:;". I don't see a way of actually
> counting the number of addresses, which I'd slightly prefer.
>
I've got this working now. So, my MSA server is rewriting long To: and Cc:
headers.
I had difficulty getting the syntax right, so I refactored to put the code
into macros, so my transports look like this:
remote_smtp:
driver = smtp
no_delay_after_cutoff
headers_remove = \
Bcc \
REMOVE_LONG_HEADERS
headers_add = \
X-Sussex: true \
REPLACE_LONG_HEADERS
hosts_avoid_tls = !*.sussex.ac.uk : !*.susx.ac.uk
The "X-Sussex: true" header lets my MX server know whether a message
originated here. Ideally I'd do something clever with encryption, but
that's not relevant here. What is relevant is the REMOVE_LONG_HEADERS
macro. I use a macro because I have four transports: remote_smtp,
remote_lmtp, remote_smtp_rew, and remote_lmtp_rew. The lmtp transports are
for delivery to our Cyrus IMAP server. The _rew variants are for people
that want their sender addresses canonicalised (my spell checker wants to
say "cannibalised" here!).
So, the Macros look like this:
# Maximum permitted header lengths (unit is characters)(
MAX_CC = 4096
MAX_TO = 4096
# This condition tests that the To: header is less than MAX_TO characters.
LONG_TO_HEADERS = \
> { ${strlen:$h_To:} } {MAX_TO}
# This condition tests that the Cc: header is less than MAX_CC characters.
LONG_CC_HEADERS = \
> { ${strlen:$h_Cc:} } {MAX_CC}
# This is used by headers_remove
REMOVE_LONG_HEADERS = \
${if LONG_TO_HEADERS {: To }}\
${if LONG_CC_HEADERS {: Cc }}
# This is used by headers_add
CONCEALED_STRING = address list masked by postmaster:;
REPLACE_LONG_HEADERS = \
${if LONG_TO_HEADERS {\nTo: CONCEALED_STRING }}\
${if LONG_CC_HEADERS {\nCc: CONCEALED_STRING }}
--
Ian Eiloart
IT Services, University of Sussex