--On Tuesday, September 23, 2003 13:36:18 -0700 Chris Stromsoe <[EMAIL PROTECTED]> wrote:

On Tue, 23 Sep 2003, Pat Lashley wrote:

--On Tuesday, September 23, 2003 02:18:50 -0700 Chris Stromsoe
<[EMAIL PROTECTED]> wrote:

> out of ~40,000 messages I've got handy, between 50 and 60 had some
> variant of envelope-to (either plain or with x- or old-), and 36,906
> had a return-path header.  Return-Path is an rfc mandated header that
> must be handled.

None of the messages should have had either of those headers when you
recieved them.

It's very unlikely that any of the messages did have a Return-Path when they were handed to me. I wasn't saying that they did.

It wasn't clear whether you were testing incoming messages or ones already in mailboxes. And your statement above certainly implies that a bit less than 10% of the messages do NOT have a Return-Path header. Is that in fact the case; or was that 40,000 an overestimate?

                                                          All of the
messages containing envelope-to variants came that way.  (And, in fact,
there is no reason why they shouldn't -- as you said yourself, envelop-to
is not a standard header; it could be inserted at either end.)

Systems that do generate Envelope-To headers generally only do so when they believe that the message is about to achieve final delivery; and generally remove Envelope-To headers that already existed on incoming messages, whether or not they will be passed on or delivered locally. (On the theory that a pre-existing header may not be trustworthy.)


Yes, the RFC mandates a Return-Path header; but it specificly says
that it is to be generated only at the point of final delivery into
a file.

Keep reading the RFC. It also says that the message is considered delivered when it leaves the SMTP environment. Ie, when lmtpd takes it, lmtpd should add the Return-Path header.

LMTP is a dialect of SMTP; so it hasn't left the SMTP environment until sieve is through with it and lmtpd puts it into a cyrus mailbox. (If, in fact, that is what sieve says is to happen to the message.)


This seems very much like you're sniping at me.  I almost expected the
sentence to end with ", junior" or something similar.  It's nice that you
have a lot of experience doing software development and that you bring
your experience to play.  However, I don't believe that your experience
has anything to do with this issue.

I'm sorry that you feel that way. I was merely trying to point out that you are focusing on one half of the problem; and that your proposed 'solution' fails to address the other half. Or even admit to its existance.

As to the applicability of my experience; that is what helps me to step
back and look at the big picture to identify the actual requirements
rather than the immediate request.

The RFC _requires_ Return-Path.  It is standard.  Envelope-To is something
that somebody made up.  I can't recall it being mentioned in any smtp rfc
that I've read recently.  I can't recall seeing it generated by any MTA.
You keep asserting that it has something to do with this and that I should
somehow "know" how it fits into the discussion.  I don't believe that
Envelope-To has anything to do with discussing whether or not _lmtpd
should make sure that its in-memory data matches what it writes to disk_.

My actual assertion is that users, given the ability to filter on the envelope sender, will also want to filter on the envelope recipient. If you use Return-Path as the handle with which to check the former; you must consider Envelope-To as the appropriate handle for checking the latter.

I also assert that it is wrong to use those headers as the mechanism
for obtaining envelope values; and that the envelope extension to
sieve provides the right mechanism.


The x-sieve header is applied regardless of sieve script processing.  If
you enable sieve with cyrus, it is _always_ added.

But presumably, conceptually at least, -after- sieve has had a whack at the message. Note that the absence of a sieve script for a given local-part does not mean that sieve doesn't process the message; only that it uses the default action.


 - lmtpd has written the received header to disk.  When that message is
forwarded or bounced the on disk file is sent.  If on-disk format is
canonical, then the header cache needs to have the headers too.  If the
header cache is canonical, then the on-disk representation needs to not
have those headers until the message is dispensed with.

In the case of the Recieved: header, the bounce or forward happens after lmtp has 'accepted' the message for processing; so it is correct to include that header in the bounced or forwarded message even if it is not correct to have it yet when sieve processes it. (See my previous statement that argues that the Recieved: header should only be added once lmtpd indicates to the MTA that it has accepted the message for processing.)

A similar argument applies to the X-Sieve: header - by the time the
message is bounced or forwarded, sieve is done with it; so the header
would apply.

Return-Path should be filtered out of any bounce or forward because
the message has not, in fact, achieved final delivery; and therefore
should not conotain a Return-Path header.  (You can argue over whether
it shouldn't be in the file until final delivery or should be actively
filtered out for bounce/forward; but that's a minor implementation
detail.  Having it there optimizes the most common case - final delivery
to a cyrus mailbox.)


 - sendmail provides a Return-Path header to procmail, the final delivery
agent.  sendmail could also provide one to lmtpd, but lmtpd provides its
own.  lmtpd is the "local mail transport protocol".  Like a local mailer
in sendmail.  It is the final delivery step.

As such, it is a specialized dialect of SMTP; and is the proper agent for adding the Return-Path header to messages which it actually delivers into a local mailbox. But -NOT- to messages which are bounced or forwarded.

                                               Sure, other things can
happen after that; those things have nothing to do with anything that
happened up to that point.

Of course they do. As much as processing in any MTA has to do with anything that happened up to that point.

                            When sieve forwards or rejects a message, it
invokes sendmail as a client.  It doesn't try to relay the message through
the next hop or anything like that.  It reinjects the message.

An implementation detail. And one that only applies to the case where sieve is being used as part of a nominal final delivery. Sieve integrated into an MTA or MUA would handle it differently.


You are assuming that sieve processing occurs -AFTER- final delivery.
The authors of lmtpd apparently consider it to be happening -BEFORE-
final delivery; with the sieve script itself determining whether there
will even BE a final delivery at that point.

Or, the authors of lmtpd never considered this situation and it wasn't a big deal having or not having the missing headers in the cache. I'll let them speak for themselves.

I wish they would. But I strongly suspect that they had a much more global overview of mail processing than you are espousing.


It makes no sense to you because you continue to believe that it is a
shortcoming and not a correct behavour.  Stop trying to justify your
'solution' and try to take an objective look at the problem. You will
find that it is solved admirably by the envelope extension.

I objectively believe that lmtpd is maintaining an on-disk structure that does not match the structure that it is maintaining in-memory.

So what? That's an lmtpd implementation detail that should be opaque to you. The on-disk version doesn't represent the message as it currently exists to be processed by sieve; but the message as it is expected to exist after sieve is done.

(I suspect that the file is written at that early point primarily
to have something to look at if something goes drasticly wrong and
lmtpd crashes before it finishes processing; and partially as an
optimization to prevent the need to write it out multiple times if
the sieve script requests multiple actions for it.  I welcome either
confirmation or refutation from the lmtpd authors.)


I objectively believe that this is wrong.

No, you subjectively believe that it is wrong. All beliefs are subjective.



I noticed this when I was looking to find out why something I wanted
to do wasn't working.

Wasn't working -as you expected it to-. You seem to be completely resistant to the idea that your expectations were wrong.

The two things are _completely separate_.

No, they aren't. This is where that 30+ years of experience helps again. I've had to deal with this -many- times. (And freely admit that I still need to be vigilant to avoid doing it myself.) People tend to get focused on a particular symptom and believe that it is the problem. It isn't always easy to step back and take a broader look to discover the real underlying problem.


lmtpd is the final delivery. Read more of 2821:

   When the delivery SMTP server makes the "final delivery" of a
   message, it inserts a return-path line at the beginning of the mail
   data.  This use of return-path is required; mail systems MUST support
   it.  The return-path line preserves the information in the <reverse-
   path> from the MAIL command.  Here, final delivery means the message
   has left the SMTP environment.  Normally, this would mean it had been
   delivered to the destination user or an associated mail drop, but in
   some cases it may be further processed and transmitted by another
   mail system.

Which actually implies that lmtpd is wrong to be adding the Return-Path
and that the smtp server handing off to lmtpd should be adding it.  Which
is beside the point.

How is that beside the point? As I pointed out above, LMTP is a dialect of SMTP and the message has -NOT- left the SMTP environment until and unless lmtpd actually places it into a cyrus mailbox.


Wasn't the basis for your original 'problem' that naive users could not
understand why they couldn't filter on the Return-Path header?

No. I didn't say that anywhere. Are you reading what I'm writing or just looking to argue with me?

Perhaps I misunderstood your stated reasons for wanting to provide the ability to filter on Return-Path instead of using the envelope extension.

Say again?  I know the functionality of what I want.  I don't care how it
is implemented.  There are headers.  I want to be able to filter on all of
them.  Not a subset of them, but all of them.  I'm not overly concerned
with how that is implemented, just that it is implemented.

Again, you are focused too tightly on a particular symptom and ignoring the bigger 'problem'. The functionality you want is to filter on the envelope sender. The implementation that you want is to be able to use the Return-Path header. But the envelope extension provides another, cleaner, implementation of the actual functionality that you desire.

Obviously you do care how it is implemented; because you are steadfastly
refusng to simply use the implementation that is already in place.

You can filter on all of the headers that actually exist at that point.
The Return-Path header does -not- really exist yet.  That it appears to
exist is an implementation detail that you shouldn't be aware of.  (I
realise that this point is a but subtle.)


final delivery occurs when smtp passes the message to lmtpd.  What lmtpd
does with it afterward is its own business.

That's where we disagree. I claim that final delivery doesn't occur until it is actually placed into a mailbox. Apparently the authors of the lmtpd code tended more towards my view than yours.


If there were a separate sieve parser, lmtpd would quite probably feed
it the message (without a Return-Path header) via a pipe;

Look into how sendmail feeds procmail. I use procmail to filter on return-path all the time.

It's been quite a while since I've used procmail; but I believe that is a shortcomming of it's implementation. Does it have any other mechanism to get ahold of the envelope values?


sieve opens the on-disk file and _feeds it to sendmail_ for redirecting.
The on-disk file that _includes the Return-Path_.

As I said before, the Return-Path should probably be filtered out; or not added to the file until the file is placed into a mailbox.


So, is the on-disk file just an optimization?  Or is it the "final
delivery" and being used as such by other parts of lmtpd?

As I've said before, my position is that final delivery doesn't occur until the message is placed into a mailbox.

Have you looked at the code to see what it's doing?  Is there some
technical fault with what I'm proposing?  Or are you being disagreeable
because you don't personally like the return-path header or because I've
somehow offended your sensibilities?

I'm sorry if you see this as being disagreeable. I am not in the least offended by anything you've said yet. BUT I do believe that your proposal focuses narrowly on a particular symptom and attempts to fix a non-problem. If there is a real problem/bug, it is that the Return-Path header is allowed to remain in bounced and forwarded messages. If not removed entirely, it should be converted into an X-Original-Return-Path or something. (I don't recall off-hand whether there's an RFC-mandated heaer name for that purpose.)



-Pat

Reply via email to