3.1.1. ═α±≥≡εΘΩα ∩≡επ≡α∞∞√ sendmail

═α±≥≡εΘΩα ∩≡επ≡α∞∞√ sendmail ∩≡εΦ±⌡εΣΦ≥ ∩≡Φ ∩ε∞ε∙Φ ⌠αΘδα /etc/sendmail/conf. ▌≥ε≥ ⌠αΘδ ∞εµφε ≡ατßΦ≥ⁿ φα φσ±ΩεδⁿΩε ≈α±≥σΘ:

┬ ßεδⁿ°Φφ±≥Γσ ±δ≤≈ασΓ Γ±σ Φτ∞σφσφΦ , Ωε≥ε≡√σ ∩≡Φ⌡εΣΦ≥ⁿ±  Γφσ±≥Φ Γ ⌠αΘδ Ωεφ⌠Φπ≤≡α÷ΦΦ, Ωα±α■≥±  ≥εδⁿΩε Φ∞σφΦ ∞α°Φφ√, Σε∞σφα Φ ∞α°Φφ °δ■τεΓ Γ Σ≡≤πΦσ ∩ε≈≥εΓ√σ ±δ≤µß√. ╬ΣφαΩε, σ±δΦ ≤ ε≡παφΦτα÷ΦΦ Φ∞σσ≥±  Σε±≥α≥ε≈φε ∩≡εΣεδµΦ≥σδⁿφα  Φ ±δαΓφα  Φ±≥ε≡Φ  Φ±∩εδⁿτεΓαφΦ  ²δσΩ≥≡εφφεΘ ∩ε≈≥√, ≥ε ∞εµσ≥ εΩατα≥ⁿ± , ≈≥ε Σδ  φε≡∞αδⁿφεπε ⌠≤φΩ÷ΦεφΦ≡εΓαφΦ  ∩≡ΦΣσ≥±  ∩≡εΦτΓσ±≥Φ Φ ≡ Σ ßεδσσ ±≤∙σ±≥Γσφφ√⌡ Φτ∞σφσφΦΘ.

┬ ÷σδε∞ Γ±σ ε∩Φ±αφφ√σ Γ√°σ ±σΩ÷ΦΦ ≡σ°α■≥ ≥≡Φ ε±φεΓφ√⌡ ταΣα≈Φ:

╧≡Φ ≡σΣαΩ≥Φ≡εΓαφΦΦ ⌠αΘδα ±δσΣ≤σ≥ ≤≈Φ≥√Γα≥ⁿ φσΩε≥ε≡√σ ∩≡αΓΦδα, Ωε≥ε≡√σ Φ±∩εδⁿτ≤■≥±  ∩≡Φ φα∩Φ±αφΦΦ ⌠αΘδα Ωεφ⌠Φπ≤≡α÷ΦΦ: Γ±  Φφ⌠ε≡∞α÷Φ  δεΩαδⁿφεπε ⌡α≡αΩ≥σ≡α ±ε±≡σΣε≥ε≈σφα Γ φα≈αδσ ⌠αΘδα, Ωε∞αφΣ√ εΣφεπε ≥Φ∩α ±εß≡αφ√ Γ Ωε∞∩αΩ≥φ√σ π≡≤∩∩√, ßεδⁿ°≤■ ≈α±≥ⁿ ⌠αΘδα ±ε±≥αΓδ ■≥ ∩≡αΓΦδα ∩≡σεß≡ατεΓαφΦ  αΣ≡σ±εΓ, Γ Ωεφ÷σ ⌠αΘδα ε∩Φ±αφ√ ∩≡επ≡α∞∞√ ≡α±±√δΩΦ ²δσΩ≥≡εφφεΘ ∩ε≈≥√.

┬±σ Ωε∞αφΣ√, Ωε≥ε≡√σ Φ±∩εδⁿτ≤■≥±  Γ ⌠αΘδσ φα±≥≡εσΩ sendmail ∞εµφε ∩≡σΣ±≥αΓΦ≥ⁿ Γ ΓΦΣσ ±δσΣ≤■∙σΘ ≥αßδΦ÷√:

╩ε∞αφΣα╤Φφ≥αΩ±Φ±═ατφα≈σφΦσ
Define MacroDxvalue ╙±≥αφεΓΦ≥ⁿ τφα≈σφΦσ "x"
Define Class╤±word1 word2 ... ╙±≥αφεΓΦ≥ⁿ τφα≈σφΦσ Ωδα±±α "c"
Define ClassFcfile ταπ≡≤τΦ≥ⁿ τφα≈σφΦσ Ωδα±±α Φτ ⌠αΘδα
Set OptionOovalue ╙±≥αφεΓΦ≥ⁿ τφα≈σφΦσ ε∩÷ΦΦ "o"
Trusted UsersTuser1 user2 ... ╬∩≡σΣσδΦ≥ⁿ ΣεΓσ≡σφφ√⌡ ∩εδⁿτεΓα≥σδσΘ
Set PrecedencePname=number ─δ  φε∞σ≡α ε°ΦßΩΦ number ≤±≥αφεΓΦ≥ⁿ Φ∞  name
Define MailerMname,[field=value] ╬∩≡σΣσδΦ≥ⁿ ∩≡επ≡α∞∞≤ ≡α±±√δΩΦ ∩ε≈≥√
Define HeaderH[?mflag?]name:format ╬∩≡σΣσδΦ≥ⁿ ⌠ε≡∞α≥ ∩εδ  ταπεδεΓΩα
Set RulsetSn═α≈α≥ⁿ ε∩≡σΣσδσφΦσ φαßε≡α ∩≡αΓΦδ ∩≡σεß≡ατεΓαφΦ  αΣ≡σ±εΓ
Define RuleRlhs rhs comment ╬∩≡σΣσδΦ≥ⁿ ∩≡αΓΦδε ∩≡σεß≡ατεΓαφΦ  αΣ≡σ±α

╘ε≡∞α≥ Ωε∞αφΣ√ ⌠αΘδα φα±≥≡εσΩ sendmail φσ ε≈σφⁿ ≤Σεßσφ Σδ  ≈≥σφΦ . ┬ ÷σδε∞ σπε ∞εµφε ε∩≡σΣσδΦ≥ⁿ ±δσΣ≤■∙Φ∞ εß≡ατε∞:

╨Φ±. 3.2. ╤≥≡≤Ω≥≤≡α Ωε∞αφΣ√ ⌠αΘδα φα±≥≡εσΩ sendmail

╥σ∩σ≡ⁿ ≡ατßσ≡σ∞ ßεδσσ ∩εΣ≡εßφε φσΩε≥ε≡√σ Ωε∞αφΣ√ Φ ±σΩ÷ΦΦ ⌠αΘδα φα±≥≡εσΩ sendmail. ╦≤≈°σ Γ±σπε ²≥ε ±Σσδα≥ⁿ φα ε±φεΓσ ≡σαδⁿφεπε ⌠αΘδα. ═α≈φσ∞ ± ±σΩ÷ΦΦ ε∩Φ±αφΦ  δεΩαδⁿφ√⌡ ∩α≡α∞σ≥≡εΓ:

	##################
	#   local info   #
	##################
	Cwlocalhost
	CP.
	# UUCP relay host
	DYucbvax.Berkeley.EDU
	CPUUCP
	#  BITNET relay host
	#DBmailhost.Berkeley.EDU
	DBrelay.kiae.su
	CPBITNET
	# "Smart" relay host (may be null)
	DSrelay.kiae.su
	# who I send unqualified names to (null means deliver locally) 
	DR
	# who gets all local email traffic ($R has precedence for unqualified names)
	DH
	# who I masquerade as (null for no masquerading)
	DM
	# class L: names that should be delivered locally, even if we have a relay
	# class E: names that should be exposed as from this host, even if we masquerade
	#CLroot
	CEroot
	# operators that cannot be in local usernames (i.e., network indicators)
	CO @ % !
	# a class with just dot (for identifying canonical names)
	C..
	# dequoting map Kdequote dequote

╩αΩ ΓΦΣφε Φτ ²≥επε δΦ±≥Φφπα, Γ ΣαφφεΘ ±σΩ÷ΦΦ ε∩Φ±αφ√ Φ∞  ΣαφφεΘ ∞α°Φφ√ (Cwlocalhost), α ≥αΩµσ Ωδα±± ∞α°Φφ-°δ■τεΓ Γ Σ≡≤πΦσ ∩ε≈≥εΓ√σ ±Φ±≥σ∞√ (CP....). ╧≡Φ ²≥ε∞ φα≡α∙ΦΓαφΦσ Ωδα±±α ∩≡εΦ±⌡εΣΦ≥ ∩ε ∞σ≡σ ε∩Φ±αφΦ  °δ■τα Σδ  ΩαµΣεπε Φτ ΓΦΣεΓ ∩ε≈≥εΓ√⌡ ±δ≤µß. ┬ Ωεφ÷σ ±σΩ÷ΦΦ ε∩Φ±αφ√ ±Φ∞Γεδ√, Ωε≥ε≡√σ φσ ∞επ≤≥ Φ±∩εδⁿτεΓα≥ⁿ±  Γ Ωα≈σ±≥Γσ Φ∞σφ ∩εδⁿτεΓα≥σδσΘ ΦδΦ Σε∞σφεΓ.

╤δσΣ≤■∙α  ±σΩ÷Φ  - ε∩≡σΣσδσφΦσ ∞αΩ≡ε±εΓ sendmail:

	######################
	#   Special macros   #
	######################
	# SMTP initial login message
	De$j Sendmail $v/$Z ready at $b
	# UNIX initial From header format
	DlFrom $g  $d
	# my name for error messages
	DnMAILER-DAEMON
	# delimiter (operator) characters
	Do.:%@!^/[]
	# format of a total name
	Dq$?x$x <$g>$|$g$.
	# Configuration version number
	DZ8.6.6

┬ ΣαφφεΘ ±σΩ÷ΦΦ ε∩Φ±αφ√ ±εεß∙σφΦ , Ωε≥ε≡√σ Γ√Σασ≥ sendmail ∩≡Φ ΓταΦ∞εΣσΘ±≥ΓΦΦ ± Σ≡≤πΦ∞Φ ≥≡αφ±∩ε≡≥φ√∞Φ απσφ≥α∞Φ. ╩αΩ ΓΦΣφε Φτ ²≥επε ε∩Φ±αφΦ , ε∩≡σΣσδσφΦσ ∞αΩ≡ε±α ²≥ε φσ ≥εδⁿΩε ∩≡Φ±ΓαΦΓαφΦσ τφα≈σφΦ , φε Φ Γ√∩εδφσφΦσ ε∩≡σΣσδσφφ√⌡ ΣσΘ±≥ΓΦΘ. ═αΦßεδσσ Φφ≥σ≡σ±φεσ ∩≡σΣδεµσφΦσ Φτ Γ±σ⌡ - ∩≡σΣδεµσφΦσ, ε∩≡σΣσδ ■∙σσ τφα≈σφΦσ ∞αΩ≡ε±α q:

	Dq$?x$x <$g>$|$g$.

╟Σσ±ⁿ ε∩Φ±αφα ≤±δεΓφα  ∩εΣ±≥αφεΓΩα τφα≈σφΦ . ┬±σ ∩≡σΣδεµσφΦσ ∞εµφε ε∩Φ±α≥ⁿ ±δσΣ≤■∙σΘ ⌠≡ατεΘ:

"┼±δΦ τφα≈σφΦσ ∩σ≡σ∞σφφεΘ x ≤±≥αφεΓδσφε, ≥ε: q = τφα≈σφΦσ_x <τφα≈σφΦσ_g>, Φφα≈σ: q=τφα≈σφΦσ_g".

╥ε µσ ±α∞εσ ∞εµφε τα∩Φ±α≥ⁿ Φ ∩ε-Σ≡≤πε∞≤:

	if(x!=NULL)
	 {
	  strcpy(q,x);
	  strcat(q," <");
	  strcat(q,g);
	  strcat(q,">");
	 {
	else
	 {
	  strcpy(q,g);
	 }

┬ Σαφφε∞ ±δ≤≈ασ $? ±εε≥Γσ≥±≥Γ≤σ≥ ε∩σ≡α≥ε≡≤ if, $| - else, α $. - Ωεφσ÷ ≤±δεΓφεπε ε∩σ≡α≥ε≡α.

╤δσΣ≤■∙α  ±σΩ÷Φ  - ²≥ε ε∩≡σΣσδσφΦσ ε∩÷ΦΘ:

	###############
	#   Options   #
	###############
	# strip message body to
	7 bits on input?
	#O7False
	# Insist that the BIND
	name server be running to resolve names
	OI
	# deliver MIME-encapsulated
	error messages?
	OjTrue

┬ Σαφφε∞ ±δ≤≈ασ ∩≡ΦΓσΣσφ ≥εδⁿΩε ⌠≡απ∞σφ≥ ²≥εΘ ±σΩ÷ΦΦ. ┴εδⁿ°Φφ±≥Γε ∩α≡α∞σ≥≡εΓ εß∙Φσ Σδ  Γ±σ⌡ ≤±≥αφεΓεΩ sendmail. ╙Ωαταφφ√σ µσ Γ δΦ±≥Φφπσ ∩α≡α∞σ≥≡√  Γδ ■≥±  ∩≡Φφ÷Φ∩Φαδⁿφ√∞Φ ± ≥ε≈ΩΦ τ≡σφΦ  ≡σµΦ∞εΓ ≡αßε≥√ sendmail. ╧σ≡Γ√Θ ∩α≡α∞σ≥≡ ε∩≡σΣσδ σ≥ ≥ε≥ ⌠αΩ≥, ≈≥ε ∩ε ∩ε≈≥σ ∞εµφε ∩σ≡σ±√δα≥ⁿ ±σ∞ΦßΦ≥εΓ≤■ Φφ⌠ε≡∞α÷Φ■. ╤επδα±φε RFC-822 Φφ⌠ε≡∞α÷Φ  Σεδµφα ß√≥ⁿ ±σ∞ΦßΦ≥εΓα , φε Σδ  ∩σ≡σΣα≈Φ ΩΦ≡ΦδδΦ÷√ ²≥ε τφα≈Φ≥ Φ±∩εδⁿτεΓα≥ⁿ ΩεΣΦ≡εΓαφΦσ, ≈≥ε αß±εδ■≥φε φσ ∩≡Φσ∞δσ∞ε. ╧ε²≥ε∞≤ Σαφφ√Θ ∩α≡α∞σ≥≡ Σεδµσφ ß√≥ⁿ ταΩε∞σφ≥α≡σφ. ┬ ±Φ±≥σ∞α⌡, πΣσ Φ±∩εδⁿτ≤σ≥±  ±σ≡Γσ≡ Σε∞σφφ√⌡ Φ∞σφ, ε∩÷Φ  I (OI) Σεδµφα ß√≥ⁿ ≤±≥αφεΓδσφα, ≈≥εß√ φσ ß√δε ε°ΦßεΩ ∩≡Φ ΦΣσφ≥Φ⌠ΦΩα÷ΦΦ Σε∞σφεΓ. ╧ε±δσΣφΦΘ ∩α≡α∞σ≥≡ φσ  Γδ σ≥±  ∩≡Φφ÷Φ∩Φαδⁿφ√∞, φε Σδ  ÷σδσΘ ßεδσσ ∩εφ ≥φεπε ∩≡σΣ±≥αΓδσφΦ  σπε ±δσΣ≤σ≥ ≤±≥αφεΓΦ≥ⁿ. ┼±δΦ ∩ε≈≥εΓ√Θ ΩδΦσφ≥ φσ ∩εΣΣσ≡µΦΓασ≥ MIME, ≥ε Σαφφ√Θ ∩α≡α∞σ≥≡ ±δσΣ≤σ≥ ταΩε∞σφ≥α≡Φ≥ⁿ.

╤δσΣ≤■∙Φσ ΣΓσ ±σΩ÷ΦΦ ε∩≡σΣσδ ■≥ ≤≡εΓσφⁿ ±εεß∙σφΦΘ εß ε°ΦßΩα⌡ Φ ΣεΓσ≡σφφ√⌡ ∩εδⁿτεΓα≥σδσΘ:

	###########################
	#   Message precedence
	#
	###########################
	Pfirst-class=0
	Pspecial-delivery=100
	Plist=-30
	Pbulk=-60
	Pjunk=-100
	#####################
	#   Trusted users   #
	#####################
	Troot
	Tdaemon
	Tuucp

╟α ²≥Φ∞Φ ΣΓ≤∞  ±σΩ÷Φ ∞Φ ±δσΣ≤σ≥ ±σΩ÷Φ  ε∩Φ±αφΦ  ∩εδσΘ ταπεδεΓΩα ∩ε≈≥εΓεπε ±εεß∙σφΦ , Ωε≥ε≡√Θ πσφσ≡Φ≡≤σ≥±  ∩≡επ≡α∞∞εΘ sendmail:

	#########################
	#   Format of headers
	#
	#########################
	H?P?Return-Path: $g
	HReceived: $?sfrom $s
	$.$?_($?s$|from $.$_) $.by $j ($v/$Z)$?r with $r$. id $i$?u for
	$u$.; $b
	H?D?Resent-Date: $a
	H?D?Date: $a
	H?F?Resent-From: $q
	H?F?From: $q
	H?x?Full-Name: $x
	HSubject:
	# HPosted-Date: $a
	# H?l?Received-Date: $b
	H?M?Resent-Message-Id:
	<$t.$i@$j>
	H?M?Message-Id: <$t.$i@$j>

╘ε≡∞α≥ Ωε∞αφΣ ΣαφφεΘ ±σΩ÷ΦΦ ε∩≡σΣσδ σ≥ ΩαΩΦσ ∩εδ  ΓΩδ■≈α■≥±  Γ ταπεδεΓεΩ, α ΩαΩΦσ φσ ΓΩδ■≈α■≥± . ─αφφα  ±σΩ÷Φ  ≥σ±φε ±Γ ταφα ± ±σΩ÷ΦσΘ ε∩≡σΣσδσφΦ  ∩≡επ≡α∞∞ ≡α±±√δΩΦ ∩ε≈≥√. ┼±δΦ ∩ε±δσ H φσ≥ τφαΩα Γε∩≡ε±α, ≥ε ∩εδσ ΓΩδ■≈ασ≥±  Γ ταπεδεΓεΩ ±εεß∙σφΦ  Σδ  δ■ßεΘ ∩≡επ≡α∞∞√ ≡α±±√δΩΦ, σ±δΦ ∩ε±δσ H ±Φ∞Γεδ "?" ∩≡Φ±≤≥±≥Γ≤σ≥, ≥ε Γ ±≥≡εΩσ α≡π≤∞σφ≥εΓ ∩≡επ≡α∞∞√ ≡α±±√δΩΦ Σαφφ√Θ ⌠δαπ Σεδµσφ ß√≥ⁿ ε∩≡σΣσδσφ Σδ  ≥επε, ≈≥εß√ Σαφφεσ ∩εδσ ß√δε ΓΩδ■≈σφε Γ ταπεδεΓεΩ. ╩αΩ ±δσΣ≤σ≥ Φτ ∩≡ΦΓσΣσφφεπε Γ√°σ ε∩Φ±αφΦ , Γ±σπΣα ΓΩδ■≈α■≥±  ≥εδⁿΩε ∩εδ  Received Φ Subject. ┬±σ ∩σ≡σ≈Φ±δσφφ√σ ∩εδ  φσ  Γδ ■≥±  εß τα≥σδⁿφ√∞Φ ∩εδ ∞Φ ταπεδεΓΩα.

╤δσΣ≤■∙α  ±σΩ÷Φ  - ∩≡αΓΦδα ∩≡σεß≡ατεΓαφΦ  αΣ≡σ±εΓ. ═ε ∩≡σµΣσ ≈σ∞ εß±≤µΣα≥ⁿ σσ ±εΣσ≡µαφΦσ ±δσΣ≤σ≥ ±Ωατα≥ⁿ ΩαΩ Φ ΩεπΣα sendmail ²≥Φ αΣ≡σ±α ∩≡σεß≡ατεΓ√Γασ≥.

╧≡σµΣσ Γ±σπε φσεß⌡εΣΦ∞ε ≡α±±∞ε≥≡σ≥ⁿ ±⌡σ∞≤ ∩≡σεß≡ατεΓαφΦ  (≡Φ±≤φεΩ 3.3).

╨Φ±. 3.3. ╧≡αΓΦδα

╧≡Φ ∩εδ≤≈σφΦΦ ∩ε≈≥εΓεπε ±εεß∙σφΦ  αΣ≡σ±α, ≤Ωαταφφ√σ Γ ∩εδ ⌡ To, From, Cc, ∩≡σεß≡ατ≤■≥±  Γ ±εε≥Γσ≥±≥ΓΦΦ ± ∩≡αΓΦδα∞Φ ∩≡σεß≡ατεΓαφΦ .

	######################################################################
	######################################################################
	#####
	#####   REWRITING RULES
	#####
	######################################################################
	######################################################################
	###########################################
	###  Rulset 3 - Name Canonicalization   ###
	###########################################
	S3
	# handle null input (translate to <@> special case)
	R$@   $@ <@>
	# basic textual canonicalization -- note RFC733 heuristic here
	R$*<$*>$*<$*>$* $2$3<$4>$5   strip multiple <> <>
	R$*<$*<$+>$*>$* <$3>$5    2-level <> nesting
	R$*<>$*   $@ <@>   MAIL FROM:<> case
	R$*<$+>$*  $2   basic RFC821/822 parsing
	# handle list:; syntax as special case
	R$*:;$*   $@ $1 :; <@>
	# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later
	R@ $+ , $+  @ $1 : $2 change all "," to ":"
	# localize and dispose of route-based addresses
	R@ $+ : $+  $@ $>96 < @$1 > : $2  handle <route-addr>
	# find focus for list syntax
	R $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax
	R $+ : $* ;  $@ $1 : $2;   list syntax
	# find focus for @ syntax addresses
	R$+ @ $+  $: $1 < @ $2 >   focus on domain
	R$+ < $+ @ $+ >  $1 $2 < @ $3 >   move gaze right
	R$+ < @ $+ >  $@ $>96 $1 < @ $2 >  already canonical
	# do some sanity checking
	R$* < @ $* : $* > $* $1 < @ $2 $3 > $4  nix colons in addrs
# convert old-style addresses to a domain-based address R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names R$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps R$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains # if we have % signs, take the rightmost one R$* % $* $1 @ $2 First make them all @s. R$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish # else we must be a local name ################################################ ### Ruleset 96 - bottom half of ruleset 3 ### ################################################ # At this point, everything should be in a "local_part<@domain>extra" format. S96 # handle special cases for local names R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all R$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr # pass UUCP addresses straight through R$* < @ $+ . UUCP > $* $@ $1 < @ $2 . UUCP . > $3 # pass to name server to make hostname canonical R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4 # local host aliases and pseudo-domains are always canonical R$* < @ $=w > $* $: $1 < @ $2 . > $3 R$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 R$* < @ $* . . > $* $1 < @ $2 . > $3 # if this is the local hostname, make sure we treat is as canonical R$* < @ $j > $* $: $1 < @ $j . > $2 ################################################## ### Ruleset 4 - Final Output Post-rewriting ### ################################################## S4 R$*<@> $@ $1 handle <> and list:; # strip trailing dot off possibly canonical name R$* < @ $+ . > $* $1 < @ $2 > $3 # externalize local domain info R$* < $+ > $* $1 $2 $3 defocus R@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical R@ $* $@ @ $1 ...and exit # UUCP must always be presented in old form R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u # delete duplicate local names R$+ % $=w @ $=w $1 @ $j u%host@host => u@host ############################################################## ### Ruleset 97 - recanonicalize and call ruleset zero ### ### (used for recursive calls) ### ############################################################## S97 R$* $: $>3 $1 R$* $@ $>0 $1 ###################################### ### Ruleset 0 - Parse Address ### ###################################### S0 R<@> $#local $: <> special case error msgs R$* : $* ; $#error $@ USAGE $: "list:; syntax illegal for recipient addresses" R<@ $+> $#error $@ USAGE $: "user address required" R<$* : $* > $#error $@ USAGE $: "colon illegal in host name part" # handle numeric address spec R$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec R$* < @ [ $+ ] > $* $#smtp $@ [$2] $: $1 < @ [$2] > $3 still numeric: send # now delete the local info -- note $=O to find characters that cause forwarding R$* < @ > $* $@ $>97 $1 user@ => user R< @ $=w . > : $* $@ $>97 $2 @here:... -> ... R$* $=O $* < @ $=w . > $@ $>97 $1 $2 $3 ...@here -> ...
# handle local hacks R$* $: $>98 $1 # short circuit local delivery so forwarded email works R$+ < @ $=w . > $: $1 < @ $2 . @ $H > first try hub R$+ < $+ @ $+ > $#local $: $1 yep .... R$+ < $+ @ > $#local $: @ $1 nope, local address # resolve remotely connected UUCP links (if any) # resolve fake top level domains by forwarding to other hosts R$*<@$+.BITNET.>$* $: $>95 < $B > $1 <@$2.BITNET.> $3 user@host.BITNET # forward non-local UUCP traffic to our UUCP relay R$*<@$*.UUCP.>$* $: $>95 < $Y > $1 <@$2.UUCP.> $3 uucp mail # pass names that still have a host to a smarthost (if defined) R$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name # deal with other remote names R$* < @$* > $* $#smtp $@ $2 $: $1 < @ $2 > $3 user@host.domain # if this is quoted, strip the quotes and try again R$+ $: $(dequote $1 $) strip quotes R$+ $=O $+ $@ $>97 $1 $2 $3 try again # handle locally delivered names R$=L $#local $: @ $1 special local names R$+ $#local $: $1 regular local names ########################################################################### ### Ruleset 5 - special rewriting after aliases have been expanded ### ### (new sendmail only) ### ########################################################################### S5 # see if we have a relay or a hub R$+ $: < $R > $1 try relay R< > $+ $: < $H > $1 try hub R< > $+ $@ $1 nope, give up R< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > R< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > ################################################################### ### Ruleset 95 - canonify mailer:host syntax to triple ### ################################################################### S95 R< > $* $@ $1 strip off null relay R< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer R< $=w > $* $@ $2 delete local host R< $+ > $* $#relay $@ $1 $: $2 use unqualified mailer ################################################################### ### Ruleset 98 - local part of ruleset zero (can be null) ### ################################################################### S98

╟α ±σΩ÷ΦσΘ ∩≡σεß≡ατεΓαφΦ  αΣ≡σ±εΓ ±δσΣ≤σ≥ ±σΩ÷Φ  ε∩≡σΣσδσφΦ  ∩≡επ≡α∞∞ ≡α±±√δΩΦ ∩ε≈≥√. ┬ φσΘ ε∩≡σΣσδ σ≥±  δεΩαδⁿφα  ∩≡επ≡α∞∞α ≡α±±√δΩΦ (mail), ∩≡επ≡α∞∞α ≡α±±√δΩΦ Σδ  Γ√∩εδφσφΦ  (sh) Φ ∩≡επ≡α∞∞α ≡α±±√δΩΦ ∩ε SMTP.

	##################################################
	###   Local and Program Mailer specification   ###
	##################################################
	Mlocal,  P=/usr/libexec/mail.local, F=lsDFMrmn, S=10, R=20/40,
	  A=mail -d $u
	Mprog,  P=/bin/sh, F=lsDFMeu, S=10, R=20/40, D=$z:/,
	  A=sh -c $u
	S10
	R<@>   $n   errors to mailer-daemon
	R$+   $: $>40 $1
	S20
	R$+ < @ $* >  $: $1   strip host part
	S40
	#####################################
	###   SMTP Mailer specification   ###
	#####################################
	Msmtp,  P=[IPC], F=mDFMuX, S=11/31, R=21, E=\r\n,
	  L=990, A=IPC $h
	Mesmtp,  P=[IPC], F=mDFMuXa, S=11/31, R=21, E=\r\n,
	  L=990, A=IPC $h
	Mrelay,  P=[IPC], F=mDFMuXa, S=11/31, R=61, E=\r\n,
	  L=2040, A=IPC $h

╟α≥σ∞ ΦΣ≤≥ ∩≡αΓΦδα ε∩≡σΣσδσφΦ  δεΩαδⁿφεπε ∩≡σεß≡ατεΓαφΦ  αΣ≡σ±εΓ Σδ  ΩεφΩ≡σ≥φ√⌡ ∩≡επ≡α∞∞ ≡α±±√δΩΦ, Γ ≈α±≥φε±≥Φ φαßε≡ ∩≡αΓΦδ S11.

	#  envelope sender and masquerading recipient rewriting
	#
	S11
	R$+   $: $>51 $1  sender/recipient common
	R$* :; <@>  $@ $1:;   list:; special case
	R$*   $@ $>61 $1  qualify unqual'ed names

┬ ±σΩ÷ΦΦ ∩≡επ≡α∞∞ ≡α±±√δΩΦ ∞√ Γ φα°σ∞ ∩≡Φ∞σ≡σ φσ ≤ΩαταδΦ σ∙σ εΣφ≤ Γαµφ≤■ Γετ∞εµφε±≥ⁿ - ≡α±±√δΩ≤ ∩ε ∩≡ε≥εΩεδ≤ UUCP:

	╠uucp, P=/usr/bin/uux, F=DFMhuU, S=13, R=23, M=100000,
	  A=uux - -r -z -a$f -gC $h!rmail

┼±≥σ±≥Γσφφε, ≈≥ε ∩≡αΓΦδα ∩≡σεß≡ατεΓαφΦ  αΣ≡σ±εΓ S13 Φ R23 Σεδµφ√ ß√≥ⁿ ε∩Φ±αφ√ Γ ⌠αΘδσ φα±≥≡εσΩ sendmail.

═αταΣ | ╤εΣσ≡µαφΦσ | ┬∩σ≡σΣ