[comp.mail.uucp] From != From:

geoff@utfraser.UUCP (01/27/87)

The fix I found to prevent sendmail bashing hell out of the From: header
(other than replacing sendmail with upas) was to modify sendmail.cf to
leave the sender address (and thus From: header) alone (with a few
exceptions due to weird gatewaying problems, alas) and invoke a shell
script (uuxfrom) which replaces the From line instead of invoking uux
directly.

Here are /usr/lib/mail/uuxfrom and some code fragments from the sources
to sendmail.cf.  Ruleset 1 (sender address digesting) and ruleset 2
(recipient address digesting) are null.  Ruleset 3 (address digesting in
general) and ruleset 4 (address reconstruction and excretion) use .uux
internally to denote an address that was in bang notation before
sendmail clubbed it into RFC-normal-form; this is preferable to using
.uucp internally since some machines generate return addresses
containing .uucp.

---/usr/lib/mail/uuxfrom---
#! /bin/sh
# uuxfrom - thishost sender date tohost touser... - relay uucp mail via uux
#	assumes honey danber uucp (BNU); else alter $UUX invocation below
PATH=/bin:/usr/bin; export PATH
: ${UUX=uux}
host="$1"
sender="$2"
date="$3"
tohost="$4"
shift; shift; shift; shift	# bug in v7 sh: shift n doesn't work?
# uux options: return stdin if rmail fails (to sender), grade A
(echo "From $sender $date remote from $host"; sed 1d) |
	$UUX -b -a"$sender" -gA - $tohost!rmail "$@"
---uucpm.m4---
S5

Muucp,	P=/usr/lib/mail/uuxfrom, F=sDFhu, S=13, R=23, M=1000000,
	A=uuxfrom $w $f $d $h ($u)
# as above, but $h!rmail can take multiple arguments
Muucpm,	P=/usr/lib/mail/uuxfrom, F=sDFhum, S=13, R=23, M=1000000,
	A=uuxfrom $w $f $d $h ($u)
S13
R$*<@$+>$*		$@$1<@$2>$3		already ok
R$+			$@$1<@$J>		tack on our hostname (re-write sender addr!)
#	next: s4
S23
#	next: s4
---smailm.m4---
Muuxrt,	P=/usr/bin/smail, F=sShum, S=17, R=27,
	A=smail -vkH$j $u
Mdom,	P=/usr/bin/smail, F=sShum, S=17, R=27,
	A=smail -vH$j $u

S17
R$*<$*.$=E>$*		$@$1<$2.$3.$D>$4		externalize
R$*<$*>$*		$@$1<$2>$3			already ok
# R$+			$@$1<@$j>			tack on our name
#	next: s4
S27
#	next: s4
---etherm.m4---
# next line is for the Toronto/Michigan standalone SMTP code
Mether,	P=/usr/lib/mail/smtp, F=SsDFuCX, S=11, R=21, A=smtp $h $g $u
# next line is only if you still use the old built-in SMTP code
# Mether,	P=[IPC], F=msDFuCX, S=11, R=21, A=IPC $h

S11
# The next lines are mostly to make strict SMTP servers happy by giving
# them RFC 822 return addresses, even for uucp addresses (u@h.uux),
# but also corrects some previously dubious return addresses.
# N.B.: These re-write sender addresses!
R$-<@$+.$=D.uux>	$@$1<@$2.$D>		d.{uucp,uux,local}!u => u@d.mydom
R$-<@$-.uux>		$@$1<@$2.$D>		host!u => u@host.mydom
R$+<@$+.uux>		$@<@$j>:$2!$1@$w	d.arpa!r => @thishost.mydom:d.arpa!r@thishost

R$*<@$+>$*		$@$1<@$2>$3		already ok
R$+			$@$1<@$J>		tack on our hostname (re-write sender addr!)
#	next: s4
S21
#	next: s4
---ethermbitm.m4---
#####		Ethernet to Bitnet Mailer specification
# next line is for the Toronto/Michigan standalone SMTP code
Metherbit,	P=/usr/lib/mail/smtp, F=SsDFuCX, S=14, R=21, A=smtp $h $g $u
# next line is only if you still use the old built-in SMTP code
# Metherbit,	P=[IPC], F=msDFuCX, S=14, R=21, A=IPC $h

S14
# The next lines are mostly to make strict SMTP servers happy by giving
# them RFC 822 return addresses, even for uucp addresses (u@h.uux),
# but also corrects some previously dubious return addresses.
# N.B.: These re-write sender addresses!
# N.B.: These assume that this host does uucp routing.
# N.B.: other sites will need to change .utoronto to their local Bitnet "domain"
R$-<@$+.$=D.uux>	$@$1<@$2.utoronto>	d.{uucp,uux,local}!u => u@d.mydom
R$-<@$-.uux>		$@$1<@$2.utoronto>	host!u => u@host.mydom
R$+<@$+.uux>		$2!$1.uux		b!u@a.uux => a!b!u
R$+!$+!$+.uux		$2!$3.uux		a!b!c => b!c; strip hosts
R$+!$+.uux		$@$2<@$1.utoronto>	h!u => u@h.utoronto

R$*<@$+>$*		$@$1<@$2>$3		already ok
R$+			$@$1<@$j>		tack on our hostname (re-write sender addr!)
#	next: s4
---base.m4---
S1
#	next: S= ruleset
S2
#	next: R= ruleset

S4
R@			$@				handle <> error addr
# externalize local domain info
R$*<$*LOCAL>$*		$1<$2$D>$3			change local info
# uux must always be presented in ! notation
R$+<@$+.uux>		$2!$1				u@dom.uux => dom!u
R$*<$+>$*		$1$2$3				defocus
R@$+:$+:$+		$@@$1,$2:$3			<route-addr> canonical
#	next: done; address is now in the message

#	start address munging here
S3
# handle "from:<>" special case
R<>			$@@				turn into magic token

# basic textual canonicalization
R$*<$+>$*		$2				basic RFC821/822 parsing
R$+ at $+		$1@$2				"at" -> "@" for RFC 822
R$*<$*>$*		$1$2$3				in case recursive

# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later
R@$+,$+			@$1:$2				change all "," to ":"

# localize and dispose of domain-based addresses
R@$+:$+			$@$>6<@$1>:$2			handle <route-addr>

# more miscellaneous cleanup
R$+			$:$>8$1				host dependent cleanup
R$+:$*;@$+		$@$1:$2;@$3			list syntax

# These heuristics are to make people at csri happy.
# Normally @ has precedence to make them happy, but neighbour! gets precedence.
#	recognise @$=w.$=D too?
R$+@$=w			$@$>6$1<@$2>		precedence to right @thishost
# a!b!...!u@h.uux is a kludgey way to make @ take precedence over !
# R$+^$+		$1!$2				convert ^ to !
# .uux indicates the original address was in ! notation
R$*!$*@$+.uux		$1^$2@$3.uux			a!b@c.uux => a^b@c.uux
R!$+			$@$>6$1<@$U.uux>		give !addr precedence
R$=w!$+			$@$>6$2<@$1.uux>		give thishost! precedence
R$=E!$+			$@$>6$2<@$1.uux>		give etherhost! precedence
R$=U!$+			$@$>6$2<@$1.uux>		give uuhost! precedence
R$*^$*@$+.uux		$1!$2@$3.uux			a^b@c.uux => a!b@c.uux

# can give ! precedence over @ by recognising ! here

R$+@$+			$:$1<@$2>			focus on domain
R$+<$+@$+>		$1$2<@$3>			move gaze right
R$+<@$+>		$@$>6$1<@$2>			already canonical

# convert old-style addresses to a domain-based address
# next line is original; three lines after are Ray Essick's version of same
# R$+%$+		$@$>6$1<@$2>			user%host
R$+%$+			$:$1<@$2>			user%host
R$+<@$+%$+>		$1%$2<@$3>			fix user%host%host2
R$+<@$+>		$@$>6$1<@$2>			get outta here

# can give @ precedence over ! by recognising ! here
# R$+^$+		$1!$2				convert ^ to !
# a!b!...!u@h.uux is a kludgey way to make @ take precedence over !
# R$*!$*@$+.uux		$1^$2@$3.uux			a!b@c.uux => a^b@c.uux
# .uux indicates the original address was in ! notation
# next two lines are all that's needed for sendmail to accept domain!address
R$+.!$+			$:$1!$2				dom.!route => dom!route
R$+!$+			$@$>6$2<@$1.uux>		resolve domain!route
# R$*^$*@$+.uux		$1!$2@$3.uux			a^b@c.uux => a!b@c.uux

R$-=$+			$@$>6$2<@$1.rscs>		resolve rscs names

#	next: s0 to deliver the message or
#	      s1 or s2 to munge the sender or recipient addresses in the message
---
-- 
Geoff Collyer	utcsri!utfraser!geoff, geoff@utfraser.toronto.{cdn,edu}