[Raw Msg Headers][Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

rmail loses

When processing incoming UUCP mail, rmail expects to see old-fashioned
From_ headers -- like this:

>From user  date remote from host
>From user2  date2 remote from host2

rmail turns those headers into a sender address of host!host2!user2.
So far, so good.

Some sites -- notably UUNET -- don't send old-fashioned headers.  Instead,
they send a valid envelope sender address right there in the From_ line,
and omit the remote from:

>From user@site.dom.ain  date

At some point, Rayan made some interesting decisions in the rmail code.
The first decision was that if there's no remote from in the From_ line,
the mail must have come from a brain-dead smart mailer, probably uunet.
So rmail defaults the "remote from" to uunet if none is present.  The other
-- and this is the nasty one -- is that if an @ sign appears in the From_
line address, the path must need to be written as a source-route instead of
a bang path.


I ended up seeing monstrosities from a neighbouring site like this:

from @sonic:user@moon.nbn.com

Which is wrong for two reasons - moon is my neighbour and sonic is downstream
from them, and it's simply illegal to use a source route in this case.
RFC822 stipulates that each component in a source route must be a fully
qualified domain name.  This one obviously is not.

If your UUCP neighbour is running a smart mailer that puts a valid
domain-style sender address in the From_ line, that address should be safe
to use verbatim.  I haven't seen one yet that wasn't.  So all you need to
do is edit compat/rmail/rmail.c and find the following bit of code:

                cp = fl[flmax-1]->address;
                if (cp != NULL && strchr(cp, '@') != NULL) {
-                       for (i = 0; i < flmax; ++i) {
-                               (void) fprintf(mfp, "@%s%s%c",
-                                   PRINTABLE(fl[i]->remotehost, somewhere),
-                                   ((i == 0 && fl[i]->remotehost != NULL
-                                     && strchr(fl[i]->remotehost, '.') == NULL)     ? ".uucp" : ""),
-                                       ((i == flmax-1) ? ':' : ','));
-                       }
                } else {

The loop I marked with hyphens should be ripped out by the roots.
(I took the lazy way out and changed i = 0 to i = flmax, which just
short-circuits it.)  This has been working fine for me for a few days