[Dovecot] Dovecot LDA/LMTP vs postfix virtual delivery agent and the x-original-to header

Tobias Franzén lists.zxinn at otaking.se
Tue Apr 28 17:40:27 UTC 2015


On 2014-01-08 14:32, Charles Marcus wrote:
> On 2012-04-09 8:53 AM, Timo Sirainen <tss at iki.fi> wrote:
>> On 9.4.2012, at 15.50, Charles Marcus wrote:
>>>> LMTP adds a new Delivered-To:<rcpt-to at address>  header when there is
>>>> a single RCPT TO. You can force a single RCPT TO from Postfix side by
>>>> setting lmtp_destination_recipient_limit=1. LMTP doesn't
>>>> add/remove/change X-Original-To: header.
>
>>> Ok, thanks Timo... but...
>>>
>>> Are you saying that this 'Delivered-To:' header can somehow be 
>>> leveraged to provide the same info as the x-original-to header?
>
>> I guess X-Original-To is the same address as what Postfix sees as the 
>> original RCPT TO address before alias expansion and such? In that 
>> case, see my today's mail in Postfix list..
>
> Hi Timo,
>
> I just tried to find your email from that day, but don't see it in the 
> archives...
>
> Was this ever resolved (getting x-original-to support in LMTP, like it 
> is for the LDA)?
>
> If not, since it seemed like it wasn't going to be much work, any 
> chance you can revisit it soon?
>
> Thanks,
>
Hello,

I have tried to keep tabs on the various discussions going on related to 
the X-Original-To header when using Dovecot LMTP. Until now I have not 
needed a solution, but I am now finally about to migrate my old server.

Old setup: Postfix + SpamAssassin (after-queue content filter via pipe) 
+ virtual transport, and Courier-IMAP.
New setup: Postfix + amavisd-new (after-queue content filter via smtp, 
with ClamAV and SpamAssassin) + Dovecot LMTP, and Dovecot for IMAP.

Charles, have you found a way that works for you?

I was experimenting some with my test server and came up with a way that 
utilizes some additional internal smtp content filter forwarding, which 
produces some overhead. It should be light compared with the load from 
ClamAV and SpamAssassin, however.

I'm not yet sure how amavisd-new funneling would handle multiple local 
recipients with different settings without passing the mail through 
multiple time, at least once per local user, let alone without first 
performing address mapping in postfix (for alias expansion). I have 
configured per-user SpamAssassin bayes filtering, and may introduce a 
whitelist based on address book entries (Roundcube.)


This solution I'm currently testing will pass each message through 
amavisd-new one time each per local and remote recipient, and will only 
add the X-Original-To header to the specific local recipient each 
envelope is intended for. No external users will receive the header, and 
no local user will see which other local users (e.g. via BCC) have 
potentially received the same message.

Flow:
all mail in (both external and tls-authenticated internal) -> smtp (1) 
-> smtp-split (2) -> smtp-to-me (3a) | smtp-to-external (3b) -> 
smtp-amavis (4) -> dovecot-lmtp (5)

1) I rely on default_destination_recipient_limit=1 in main.cf to split 
each incoming mail into one stream per recipient.
2) smtp-split will receive one stream per recipient. Default 
content_filter=smtp-to-me, followed by option 
"smtpd_recipient_restrictions=permit_auth_destination,check_recipient_access,pcre:/usr/local/etc/postfix/filter-to-external.pcre,permit_mynetworks,reject" 
means I stop processing restrictions if my server is the destination. If 
my server is not the destination, the FILTER in check_recipient_access 
will override the preceding smtp-to-me filter.

Both 1) and 2) smtpd instances include option 
receive_override_options=no_address_mappings, to wait with mapping to 
internal recipient until we can add X-Original-To header for my server's 
users only.

3a) For mail to my server, smtp-to-me will add X-Original-To using a 
pcre script, in a similar fashion to step 2's filter. This step also 
expands the address mapping (by not specifying any 
receive_override_options).
   -o 
smtpd_recipient_restrictions=check_recipient_access,pcre:/usr/local/etc/postfix/recipient_access_x-orig.pcre,permit_mynetworks,reject

3b) For mail leaving my server, smtp-to-external will not add any 
processing besides implied expanding of the address mapping.

4) Mail is funneled through amavisd-new, once per final recipient. Mails 
leaving the server (sent from smtp-to-external) will be scanned by ClamV 
only. Mails with my server as the destination (sent from smtp-to-me) 
will go through ClamV, and SpamAssassin (together with per-user bayes 
filtering).

5) Nothing special is done here. The final destination address is sent 
to LMTP for delivery.

Contents of /usr/local/etc/postfix/recipient_access_x-orig.pcre:
/(.+)/        prepend X-Original-To: <$1>

Contents of /usr/local/etc/postfix/filter-to-external.pcre:
/^/        FILTER smtp-to-external:[127.0.0.1]:<port>


Room for improvement:
Postfix seem to know the orig_to even after processing in amavisd-new, 
however I have yet to find a way to use this option.
I can move the amavisd-new filter to before the X-Original-To header 
addition, however for amavisd-new to utilize per-user bayes, I currently 
need to do the address mapping in postfix before sending the content to 
amavisd-new. This may be possible to circumvent either with alias lookup 
in amavisd-new, or if I can find another way to use the 
postfix-available "orig_to" to populate X-Original-To header after 
scanning in amavisd-new.

I've tried to split the mails into one per recipient after address 
mapping and amavisd-new, instead of before as my solution above, without 
default_destination_recipient_limit=1 in main.cf. Instead I tried the 
options as part of smtp (and even smtpd) services in master.cf, 
unfortunately without success. I keep ending up with multiple 
X-Original-To with all local recipients (including BCC) in all internal 
copies delivered.


Have anyone successfully tackled this conundrum with other solutions?

Regards,
Tobias



More information about the dovecot mailing list