diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-26 16:38:00 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-26 16:38:00 -0400 |
| commit | 97d5c458cfa039d857301e1ca7d5af3beb37131d (patch) | |
| tree | b460cd850d0537eb71806ba30358840377b27688 /static/unix-v10/man4/mailsurr.4 | |
| parent | b89dc2331a50c63f8b33272a5c4c61ab98abdaa3 (diff) | |
build: Better Build System
Diffstat (limited to 'static/unix-v10/man4/mailsurr.4')
| -rw-r--r-- | static/unix-v10/man4/mailsurr.4 | 517 |
1 files changed, 517 insertions, 0 deletions
diff --git a/static/unix-v10/man4/mailsurr.4 b/static/unix-v10/man4/mailsurr.4 new file mode 100644 index 00000000..2caef904 --- /dev/null +++ b/static/unix-v10/man4/mailsurr.4 @@ -0,0 +1,517 @@ +'\"macro stdmacro +.if n .pH g4.mailsurr %W% of %G% +.\" Emphasis +.de Em +\f2\\$1\fP\\$2 +.. +.nr X +.if \nX=0 .ds x} mailsurr 4 "Essential Utilities" "\&" +.if \nX=1 .ds x} mailsurr 4 "Essential Utilities" +.if \nX=2 .ds x} mailsurr 4 "" "\&" +.if \nX=3 .ds x} mailsurr "" "" "\&" +.TH \*(x} +.SH NAME +\f4mailsurr\f1 \- surrogate commands for routing and transport of mail +.SH DESCRIPTION +The \f4mailsurr\f1 file contains routing and transport surrogate +commands used by the \f4mail\fP command. +Each entry in \f4mailsurr\f1 has three whitespace-separated, +single quote delimited fields: +.P +.RS +.ft 4 +\&'\f2sender\fP' '\f2recipient\fP' '\f2command\fP' +.ft 1 +.RE +.P +or a line that begins +.P +.RS +.ft 4 +Defaults: +.ft 1 +.RE +.P +Entries and fields may span multiple lines, +but leading whitespace on field continuation lines is ignored. +Fields must be less than 1024 characters long after expansion (see +below). +.PP +The sender and recipient fields are regular expressions. +If the sender and recipient fields match those of the message currently +being processed, the associated command is invoked. +.PP +The \f2command\fP field may have one of the following five forms: +.P +.RS +.ft 4 +.nf +\f4A\f1[\f4ccept\f1] +\f4D\f1[\f4eny\f1] +\f4T\f1[\f4ranslate\f1] \f4R=\f1[\f4\(bv\f1]\f2string\f1 +\f4< S=...;C=...;F=...;\f2 command\f1 +\f4>\fP \f2command\f1 +.fi +.ft 1 +.RE +.SS "Regular Expressions" +The sender and recipient fields are composed of regular +expressions (REs) which are digested by the \f4regexp\fP(5) +\f4compile\fP and \f4advance\fP procedures +in the C library. +The regular expressions matched are those from \f4ed\fP(1), with simple +parentheses \f4()\fP playing the role of \f4\e(\e)\fP and the addition of +the \f4+\fP and \f4?\fP operators from \f4egrep\fP(1). +Any single quotes embedded within the REs +.Em must +be escaped by prepending them with a backslash or +the RE is not interpreted properly. +.PP +The \f4mail\fP command prepends a circumflex (\f4^\f1) +to the start and appends a dollar sign (\f4$\f1) to the +end of each RE so that it matches the entire string. +Therefore it would be an error +to use \f4^\f2RE\f4$\f1 in the sender and recipient fields. +To provide case insensitivity, all REs are +converted to lower case before compilation, +and all sender and recipient information is converted to +lower case before comparison. +This conversion is done only for the purposes of RE pattern matching; +the information contained within the +message's header is +.Em not +modified. +.PP +The sub-expression pattern matching capabilities of \f4regexp\fP may be used +in the command field, +that is, \f4(\f1...\f4)\f1, where 1 \(<= \f2n\fP \(<= 9. +Any occurrences of \f4\e\e\f2n\f1 in the +replacement string are themselves replaced by the corresponding \f4(\f1...\f4)\f1 +substring in the matched pattern. +The sub-expression fields from both the sender and recipient fields are +accessible, with the fields numbered 1 to 9 from left to right. +.SS "Accept and Deny Commands" +\f4Accept\fP instructs \f4rmail\fP to continue its processing with the \f4mailsurr\f1 +file, +but to ignore any subsequent matching \f4Deny\fP. +That is, unconditionally accept this message for delivery processing. +\f4Deny\fP instructs \f4rmail\fP to stop processing the \f4mailsurr\f1 file +and to send a negative delivery notification to the originator of the message. +Whichever is encountered first takes precedence. +.SS "Translate Command" +\f4Translate\fP allows optional on-the-fly translation of recipient address +information. +The \f2recipient\fP replacement string is specified as \f4R=\f2string\f1. +.PP +For example, given a command line of the form +.P +.RS 2 +.nf +\f4\&'.+' '([^!]+)@(.+)\e.EUO\e.ATT\e.com' 'Translate R=attmail!\e\e2!\e\e1'\f1 +.fi +.RE +.P +and a recipient address of \f4rob@sysa.EUO.ATT.COM\fP +the resulting recipient address would be \f4attmail!sysa!rob\fP. +.PP +Should the first character after the equal sign be a `\(bv', +the remainder of the string is taken as a command line +to be directly executed by \f4rmail\fP. +If any \f4sh\fP(1) syntax is required +(metacharacters, redirection, etc.), +then the surrogate command must be of the form: +.P +.RS +\f4sh \-c "\f2shell command line...\f4"\f1 +.RE +.P +Special care must be taken to escape properly any embedded back-slashes +and single or double quotes, +since \f4rmail\fP uses double quoting to group +whitespace delimited fields that are meant to be considered as a single +argument to \f4execl\fP(2). +It is assumed that the executed command will write one or more replacement +strings on \f4stdout\fP, one per line. +If more than one line is returned, +each is assumed to be a different recipient for the message. +This mechanism is useful for mailing list expansions. +As stated above, any occurrences of \f4\e\e\f2n\f1 are replaced by the +appropriate substring +.Em before +the command is executed. +If the invoked command does not return at least one replacement string +(no output or just a newline), +the original string is +.Em not +modified. +For example, the command line +.P +.RS +\f4\&'.+' '(.+)' 'Translate R=\(bv/usr/bin/findpath \e\e1'\fP +.RE +.P +allows local routing decisions to be made. +.PP +If the recipient address string is modified, \f4mailsurr\fP +is rescanned from the beginning with the new address(es), +and any prior determination of \f4Accept\fP (see above) is discarded. +.SS "\f4<\fP \f2command\fP" +The intent of a \f4<\fP command is that it is invoked as part of the transport +and delivery mechanism, +with the ready-for-delivery message available to the command +at its standard input. +As such, there are three conditions possible when the command exits: +.RS +.TP 10 +Success +The command successfully delivered the message. +What actually constitutes successful delivery may be different +within the context of different surrogates. +The \f4rmail\fP process assumes that no more processing +is required for the message for the current recipient. +.TP 10 +Continue +The command performed some function +(logging remote message traffic, for example) +but did not do what would be considered message delivery. +The \f4rmail\fP process continues to scan the +\f4mailsurr\f1 file looking for some +other delivery mechanism. +.TP 10 +Failure +The command encountered some catastrophic failure. +The \f4rmail\fP process +stops processing the message and sends to the originator of the message +a non-delivery notification that includes any \f4stdout\fP and \f4stderr\fP +output generated by the command. +.RE +.PP +The semantics of the \f4<\fP command field in the \f4mailsurr\fP file allow +the specification of exit codes that constitute success, continue, and +failure for each surrogate command individually. +The syntax of the exit state specification is: +.P +.RS +.nf +\f4<\f1 WS [\f2exit_state_id\f4=\f2ec\f1[\f4,\f2ec\f1[,...]]\f4;\f1][\f2exit_state_id\f4=\f2ec\f1[,\f2ec\f1[,...]]\f4;\f1 + [...]]] WS\0\f2surrogate_cmd_line\f1 +.fi +.RE +.P +.SM +.I WS +is whitespace. +\f2exit_state_id\fP can have the value \f4S\fP, \f4C\fP, or \f4F\fP. +\f2exit_state_id\fPs can be specified in any order. +\f2ec\fP can +be: +.IP +any integer 0 \(<= \f2n\fP \(<= 255 +[Negative exit values are not possible. +See \f4exit\fP(2) and \f4wait\fP(2).] +.IP +a range of integers of the form \f2lower_limit\f1\-\f2upper_limit\f1 +where the limits are \(>= 0 and \(<= 255, and +.IP +\f4\(**\fP, which implies \f2anything\fP +.PP +For example, a command field of the form: +.P +.RS +\&'\f4< S=1-5,99;C=0,12;F=\(**; \f2command\fP %R'\f1 +.RE +.P +indicates that exit values of 1 through 5, and 99, +are to be considered success, +values of 0 (zero) and 12 indicate continue, +and that anything else implies failure. +If not explicitly supplied, default settings are \f4S=0;C=\(**;\fP. +.PP +It may be possible for ambiguous entries to exist +if two exit states have the same +value, for example, \f4S=12,23;C=\(**;F=23,52\fP; or \f4S=\(**;C=9;F=\(**;\fP. +To account for this, \f4rmail\fP looks for +.Em explicit +exit +values (that is, +.Em not +\&``\(**'') in +order of success, continue, failure. +Not finding an explicit match, +\f4rmail\fP then scans for ``\(**'' in the same order. +.PP +It is possible to eliminate an exit state completely by setting that +state's value to an impossible number. +Since exit values must be between 0 and 255 (inclusive), +a value of 256 is a good one to use. +For example, if you had a surrogate command that was to log all message +traffic, a \f4mailsurr\f1 entry of +.P +.RS 2 +.nf +\f4\&'(.+)'\0'(.+)'\0'\f4<\fPS=256;C=*;\0/usr/lib/mail/surrcmd/logger \e\e1 \e\e2'\f1 +.fi +.RE +.P +would always indicate continue. +.PP +Surrogate commands are executed by \f4rmail\fP directly. +If any shell syntax is required +(metacharacters, redirection, etc.), +then the surrogate command must be of the form: +.P +.RS +\f4sh \-c "\f2shell command line...\f4"\f1 +.RE +.P +Special care must be taken to properly escape any embedded +back-slashes and other characters special to the shell +as stated in the ``Translate'' section above. +.PP +If there are no matching \f4<\fP commands, +or all matching \f4<\fP commands exit with a continue indication, +\f4rmail\fP attempts to deliver the message itself by assuming +that the recipient is local and delivering +the message to \f4/var/mail/\fP\f2recipient\fP. +.SS "\f4>\f1 command" +The intent of a \f4>\fP command is that it is invoked +.Em after +a successful delivery to do any post-delivery processing that may be required. +Matching \f4>\fP commands are executed only if some \f4<\fP command indicates a +successful delivery (see the previous section) +or local delivery processing is successful. +The \f4mailsurr\f1 file is rescanned and +all matching \f4>\fP commands, +not just those following the successful \f4<\fP command, +are executed in order. +The exit status of an \f4>\fP command is ignored. +.SS "Defaults: Line" +The default settings may be redefined by creating a separate +line in the \f4mailsurr\f1 file of the form +.P +.RS +.nf +\f4Defaults: \f1[\f4S=\f1...\f4;\f1][\f4C=\f1...\f4;\f1][\f4F\f1=...\f4;\f1] +.fi +.ft 1 +.RE +.P +\f4Defaults:\fP lines are honored and the indicated default values +redefined when the line is encountered during the normal processing +of the \f4mailsurr\f1 file. +Therefore, to redefine the defaults globally, the \f4Defaults:\fP +line should be the first line in the file. +It is possible to have multiple \f4Defaults:\fP lines in the \f4mailsurr\f1 file, +where each subsequent line overrides the previous one. +.SS "Surrogate Command Keyword Replacement." +Certain special sequences are textually-substituted +in surrogate commands before they are invoked: +.P +.RS +.PD 0 +.TP 11 +\f4%n\f1 +the recipient's full name. +.TP +\f4%R\f1 +the full return path to the originator (useful for sending replies, +delivery failure notifications, etc.) +.TP +\f4%c\f1 +value of the \f5Content-Type:\fP header line if present. +.TP +\f4%C\f1 +\&``\f5text\fP'' or ``\f5binary\fP'', depending on an actual scan of the content. +This is independent of the value of any \f5Content-Type\fP header line encountered +(useful when calling \f4ckbinarsys\fP.) +.TP +\f4%S\f1 +the value of the \f5Subject:\fP header line, if present. +.TP +\f4%l\f1 +value of the \f5Content-Length:\fP header line. +.TP +\f4%L\f1 +the local system name. +This will be either \f4CLUSTER\fP from \f4mailcnfg\fP or the value returned +by \f4uname\fP. +.TP +\f4%U\f1 +the local system name, as returned by \f4uname\fP. +.TP +\f4%X\f1 +the value of \f4SMARTERHOST\fP in \f4mailcnfg\fP. +.TP +\f4%D\f1 +the local domain name. +This will be either \f4DOMAIN\fP from \f4mailcnfg\fP, or the value returned by +\f4getdomainame\fP. +.TP +\f4\e\e\f2n\f1 +as described above, the corresponding (...) +substring in the matched patterns. +This implies that the \f4regexp\fP limitation of 9 substrings is applied +to the sender and recipient REs collectively. +.TP +\f4%\f2keywords\f1 +Other keywords as specified in \f4/etc/mail/mailcnfg\fP. +See \f4mailcnfg\fP(4). +.RE +The sequences \f4%L\fP, \f4%U\fP, \f4%D\fP, and \f4%\f2keywords\f1 are +permitted within the sender and recipient fields as well as in the command +fields. +.PD +.PP +An example of the \f4mailsurr\f1 entry that replaces the +\f4uux\fP ``built-in'' of previous versions of \f4rmail\fP is: +.P +.RS +.nf +\f4\&'.+' '([^@!]+)!(.+)' '< /usr/bin/uux \- \e\e1!rmail (\e\e2)'\fP +.fi +.RE +.SS "Mail Surrogate Examples" +Some examples of mail surrogates include the distribution of message-waiting +notifications to LAN-based recipients and lighting Message-Waiting Lamps, +the ability to mail output to printers, +and the logging of all \f4rmail\fP requests between remote systems +(messages passing through the local system). +The following is a sample \f4mailsurr\f1 file: +.P +.nf +.ft 4 +\s-1# +# Some common remote mail surrogates follow. To activate any +# or all of them, remove the `#' (comment indicators) from +# the beginning of the appropriate lines. Remember that they +# will be tried in the order they are encountered in the file, +# so put preferred surrogates first. + +# Prevent all shell meta-characters +\&'.+' '.*[`;&|^<>()].*' 'Deny' + +# Map all names of the form local-machine!user -> user +\&'.+' '%L!(.+)' 'Translate R=\\1' + +# Map all names of the form uname!user -> user +# Must be turned on when using mail in a cluster environment. +#'.+' '%U!(.+)' 'Translate R=\\1' + +# Map all names of the form user@host -> host!user +\&'.+' '([^!@]+)@(.+)' 'Translate R=\\2!\\1' + +# Map all names of the form host.uucp!user -> host!user +\&'.+' '([^!@]+)\\.uucp!(.+)' 'Translate R=\\1!\\2' + +# Map all names of the form host.local-domain!user -> host!user +# DOMAIN= within /etc/mail/mailcnfg will override getdomainame(3). +\&'.+' '([^!@]+)%D!(.+)' 'Translate R=\\1!\\2' + +# Allow access to `attmail' from remote system `sysa' +\&'sysa!.*' 'attmail!.+' 'Accept' + +# Deny access to `attmail' from all other remotes +\&'.+!.+' 'attmail!.+' 'Deny' + +# Send mail for `laser' to attached laser printer +# Make certain that failures are reported via return mail. +\&'.+' 'laser' '\f4<\fP S=0;F=*; lp \-dlaser' + +# Run all local names through the mail alias processor +# +\&'.+' '[^!@]+' 'Translate R=|/usr/bin/mailalias %n' + +# For remote mail via nusend +#'.+' '([^!]+)!(.+)' '\f4<\fP /usr/bin/nusend \-d \e\e1 \-s \-e \-!"rmail \e\e2" \-' + +# For remote mail via usend +\&'.+' '([^!]+)!(.+)' + '\f4<\fP /usr/bin/usend \-s \-d\e\e1 \-uNoLogin \-!"rmail \e\e2" \- ' + +# For remote mail via uucp +\&'.+' '([^!@]+)!.+' '\f4<\fPS=256;C=0; + /usr/lib/mail/surrcmd/ckbinarsys \-t %C \-s \e\e1' +\&'.+' '([^!@]+)!(.+)' '\f4<\fP /usr/bin/uux \- \e\e1!rmail (\e\e2)' + +# For remote mail via smtp +#'.+' '([^!@]+)!(.+)' '< /usr/lib/mail/surrcmd/smtpqer %R %n' + +# If none of the above work, then let a router change the address. +#'.+' '.*[!@].*' 'Translate R=| /usr/lib/mail/surrcmd/smail -A %n' + +# If none of the above work, then ship remote mail off to a smarter host. +# Make certain that SMARTERHOST= is defined within /etc/mail/mailcnfg. +#'.+' '.*[!@].*' 'Translate R=%X!%n' + +# Log successful message deliveries +\&'(.+)' '(.+)' '\f4>\fP/usr/lib/mail/surrcmd/logger \\1 \\2'\s0 +.ft 1 +.fi +.PP +Note that invoking \f4mail\fP to read mail does not +involve the \f4mailsurr\f1 file or any surrogate processing. +.SS "Security" +Surrogate commands execute +with the permissions of \f4rmail\fP (user \s-1ID\s+1 of the invoker, +group \s-1ID\s+1 of mail). +This allows surrogate commands to validate themselves, +checking that their effective group \s-1ID\s+1 was \f4mail\fP at invocation time. +This requires that all additions to \f4mailsurr\f1 be scrutinized before +insertion to prevent any unauthorized access to users' mail files. +All surrogate commands are executed with the path +\f4/usr/lib/mail/surrcmd:/usr/bin\fP. +.SS "Debugging New \f4mailsurr\f1 Entries" +To debug \f4mailsurr\fP files, +use the \f4\-T\fP option of the \f4mail\fP command. +The \f4\-T\fP option requires an argument that is taken as the +pathname of a test \f4mailsurr\fP file. +If null (as in \f4\-T ""\fP), +the system \f4mailsurr\f1 file is used. +Enter +.P +.RS +.nf +\f4mail\ \-T \f2test_file\0recipient\f1 +.fi +.RE +.P +and some trivial message (like ``\f4testing\fP''), +followed by a line with either just a dot (``\f4.\fP'') or a cntl-D. +The result of using the \f4\-T\fP option is displayed on standard output and +shows the inputs and resulting transformations as \f4mailsurr\f1 is +processed by the \f4mail\fP command for the indicated \f2recipient\fP. +.PP +Mail messages will never be sent or delivered when using the \f4\-T\fP option. +.SH "FILES" +.PD 0 +.TP 27 +\f4/etc/mail/mailsurr\fP +.TP 27 +\f4/usr/lib/mail/surrcmd/\(**\fP +surrogate commands +.TP 27 +\f4/etc/mail/mailcnfg\fP +initialization information for \f4mail\fP +.PD +.SH SEE ALSO +\f4ckbinarsys\fP(1M), +\f4mailcnfg\fP(4) +.br +\f4mail\fP(1), +\f4sh\fP(1), +\f4uux\fP(1), +\f4ed\fP(1), +\f4egrep\fP(1), +in the \f2User's Reference Manual\f1 +.br +\f4exec\fP(2), +\f4exit\fP(2), +\f4wait\fP(2), +\f4popen\fP(3), +\f4regexp\fP(5), +\f4getdomainname\f1(3) +in the \f2Programmer's Reference Manual\f1 +.SH "NOTES" +It would be unwise to install new entries into the system +\f4mailsurr\f1 file without verifying at least their syntactical +correctness via `\f4mail\fP \f4\-\T\fP \f2...\fP' as described above. |
