Re: [Exim] Resent- headers

Top Page
Delete this message
Reply to this message
Author: Phil Pennock
Date:  
To: Exim Users
Subject: Re: [Exim] Resent- headers
On 2003-11-12 at 10:51 +0000, Philip Hazel wrote:
> Some changes were made in that area: this is from the 4.20 ChangeLog:


Saw that, and the comments in the source, and just about anything which
a case-insensitive grep for "resent-" over the exim-4.24 source
distribution turned up. :^)

I accept that the "-t" behaviour is unpleasantly ill-defined and
problematic. The issue here is where -t is not used, but a mail is
accepted by SMTP and delivered on by some transport (either smtp driven
or appendfile).

Sorry that I didn't reply yesterday; looking today, I see that Tony
Finch has basically said what I was going to say. :^)

> I have changed what Exim does with Resent- headers several times after
> complaints, grumbling the while about imprecise specifications. Exim
> doesn't try to identify different header sets; this seemed to me like a
> mug's game. This is a comment from the code:


The whole thing is bad. I dislike it. I'm happy with Received: trace
fields. But the headers _do_ exist, so the best that can be done is to
try to conform to the standards and "reasonable" behaviour -- ie, don't
construct headers in such a way that they end up being misleading.

Pine may be misusing the headers, but if Exim ignores all the X-Resent
and stops treating any 'Resent-' header as special if it's separated
from a "higher" (later prepended) 'Resent-' header by any other header
(such as the block of Received: headers which you'd expect to see
between multiple resends, unless some MTA isn't adding trace
information) then Exim will at least handle the
least-extra-wording-needed-for-comprehensibility interpretation of the
standard, whilst not potentially corrupting headers.

> So what exactly *is* Exim doing to your message? If you've posted that,
> I'm afraid I've forgotten the details. Please remind me.


The original mail was a customer complaint; I meant to put together a
sample using "safe" data but didn't do so before, sorry.

Hrm, sync error, so need to lock-step which netcat can't do ... okay,
here's a quick hack which shoves a well-formed message through; the
"incoming.mail.nl.demon.net" is the Exim 4.24 systems which take mail
for Demon NL customers, does rewrites, rejects, etc, before shoving onto
store.mail (Exim 4.24 again), which stick the mail into a directory in
mailstore format; this mail should be executable via "perl -x" (beware
locale mangling of time).

-----------------------------< cut here >-------------------------------
#!/usr/bin/perl -w
use strict;
use IO::Socket;
use POSIX qw/ strftime /;
use Sys::Hostname ();

my $hostname = Sys::Hostname::hostname();
my $date_condensed = strftime '%Y%m%d%H%M%S', gmtime($^T);
my $date = strftime '%a, %d %b %Y %H:%M:%S %Z', gmtime($^T);
my $sender        = 'pdp+sample-Exim-test@???';
my $recipient        = 'fred@???';
my $orig_sender        = 'phil.pennock@???';
my $orig_recipient    = 'bitbucket@???';
my $body = <<"EOMESSAGE";
Resent-Message-Id: <$date_condensed.resent.fred-test.new\@$hostname>
Resent-From: $sender
Received: from non-existant ([10.0.0.1]) by $hostname with ESMTP id 1234
From: <$orig_sender>
To: <$orig_recipient>
Subject: test mail
Message-Id: <$date_condensed.fred-test.orig\@$hostname>
Date: $date
Resent-From: faked\@nowhere.example.org


test message
EOMESSAGE

my @body = split /\n/, $body;
sub lockstep;
my $s = IO::Socket::INET->new( Proto => 'tcp',
    PeerAddr => 'incoming.mail.nl.demon.net', PeerPort => 'smtp(25)');
die "no socket: $!" unless defined $s;


lockstep sock => $s;
lockstep sock => $s, line => "EHLO $hostname";
lockstep sock => $s, line => "MAIL FROM:<$sender>";
lockstep sock => $s, line => "RCPT TO:<$recipient>";
lockstep sock => $s, line => "DATA";
foreach (@body) {
    s/^\./../;
    print ">>> $_\n";
    print {$s} "$_\r\n";
}
lockstep sock => $s, line => ".";
lockstep sock => $s, line => "QUIT";


exit 0;

sub lockstep
{
    local %_ = @_;
    die "oops" unless exists $_{sock};
    if (exists $_{line}) {
        print ">>> $_{line}\n";
        print {$_{sock}} "$_{line}\r\n";
    }
    $_{sock}->flush();
    my $digit;
    while (defined($_ = $_{sock}->getline())) {
        s/\s+\z//;
        print "<<< $_\n";
        unless (/^(\d)\d\d([ -])/) { die "malformed line: $_"; }
        $digit = $1;
        last if $2 eq ' ';
    }
    die "error response" unless $digit == 2 or $digit == 3;
    return 1;
}
__END__
-----------------------------< cut here >-------------------------------


This was accepted with message-id 1AKEyT-0006q0-2S, and the final .msg
file looks like this:

-----------------------------< cut here >-------------------------------
Received: from store-21.mail.nl.demon.net by mailstore for fred@???
    id 1AKEyT-000LIi-64-000LIk; Thu, 13 Nov 2003 10:45:17 +0000
Received: from incoming-21.mail.nl.demon.net ([194.159.73.161]:4345)
    by store-21.mail.nl.demon.net with esmtp (Exim 4.24)
    id 1AKEyT-000LIi-64
    for fred@???; Thu, 13 Nov 2003 10:45:17 +0000
Received: from samhain.noc.nl.demon.net ([194.159.72.214]:4286)
    by incoming-21.mail.nl.demon.net with esmtp (Exim 4.24)
    id 1AKEyT-0006q0-2S
    for fred@???; Thu, 13 Nov 2003 10:45:17 +0000
Resent-Message-Id: <20031113104516.resent.fred-test.new@???>
Resent-From: pdp+sample-Exim-test@???
Received: from non-existant ([10.0.0.1]) by samhain.noc.nl.demon.net with ESMTP id 1234
From: <phil.pennock@???>
To: <bitbucket@???>
Subject: test mail
Message-Id: <20031113104516.fred-test.orig@???>
Date: Thu, 13 Nov 2003 10:45:16 CET
Resent-From: faked@???
Resent-Date: Thu, 13 Nov 2003 10:45:17 +0000


test message
-----------------------------< cut here >-------------------------------

Exim added the final header, "Resent-Date", but is claiming that the
earlier ("faked@") resend was on that date, which is patently false.


I'm sorry for not managing to clearly express my concerns before -- this
remains a problem on my part, I'm working on improving my communication
skills. Hopefully, the cause of my concern is now clear?
--
2001: Blogging invented. Promises to change the way people bore strangers with
banal anecdotes about their pets. <http://www.thelemon.net/issues/timeline.php>