Multiple submissions modes
Response and error handling modes
set sendmail='/usr/mmdf/bin/submit -mlnre'
Address modes
Option | Value | Literal | ||
---|---|---|---|---|
1. | Relay source | a. | none | (default) |
for the ``Via'' or | b. | source channel | i... | |
``Received'' field | c. | source host | h... | |
2. | From/Sender | a. | reject on error | (default) |
authentication | b. | trust, disclaim on error | t | |
c. | no trust (disclaim) | u | ||
d. | add Sender: field | S | ||
3. | ``Source-Info'' field | a. | not included | (default) |
b. | disclaim author | u | ||
c. | user text | f... | ||
4. | Address list source | a. | explicit list | (default) |
b. | extract from components | x... | ||
c. | both (extract and | g... | ||
explicit) | ||||
5. | Address verification | a. | abort on invalid | (default) |
b. | report on each address | v | ||
6. | Delivery destination | a. | mailbox | m (default) |
7. | Delivery attempt | a. | leave for daemon | (default) |
(combinable) | b. | deliver local now | l | |
c. | deliver netmail now | n | ||
8. | Observation of | a. | none | (default) |
immediate | b. | user will watch | w | |
attempts | ||||
9. | Return address | a. | send to submitter | r |
b. | send to ``Sender:'' | s | ||
c. | do not return | q | ||
d. | as specified | (next line) | ||
10. | Returned mail | a. | entire original | (default) |
contents | b. | citation only | c | |
11. | Warnings | a. | send warnings | (default) |
b. | do not send warnings | z | ||
12. | Delay channel | a. | enable delay channel | (default) |
usage | b. | don't use delay | d | |
13. | Delay channel | a. | not delay channel | (default) |
indicator | b. | delay channel | j | |
14. | Nameserver | a. | short timeouts | (default) |
timeouts | b. | as specified | k... | |
15. | Submission | a. | not shown | (default) |
tracing | b. | watch submission | W | |
16. | Logging file | a. | as per msglog | (default) |
b. | as specified | L... | ||
17. | Logging level | a. | as per msglog | (default) |
b. | as specified | V... | ||
18. | User id | a. | invoker's uid | (default) |
b. | as specified | U... |
Specific comments on each option:
The determination of whether a message correctly identifies its sender is based on the most authoritative From or Sender field. For the purpose of this test, a plain Sender is taken to be more authoritative than a plain From. If a Resent-, Remailed-, or Redistributed- version of either a From or Sender field is given, it is taken to be more authoritative than the plain version of either. All such "Re" headers are taken to be equally authoritative, and the last one seen in the header (the one furthest down in the header) is taken to be most authoritative. To determine whether a message correctly identifies its sender, the local-address part of the most authoritative sender is looked up in the password file to map it to a uid, and that uid is compared to the invoking user's uid. If the uids match and the hostname part of the address is a name for the local system, the message correctly identifies its sender.
The S setting tells MMDF to use a Sender: field instead of a Source-Info: field, and also causes conflicting Sender: fields in the submitted header to be elided. This allows submission programs to send mail with a 'From:' field that does not match the identity of the invoking user without having to be privileged and without having a Source-Info: field added.
In addition to those in RFC 822, the following address
delimiters are recognized within the local part of addresses
(in order of precedence):
@ % ! .
The ``!'' delimiter is interpreted as ``host!user'' while the others are interpreted as ``user?host''. For example, the address ``a.b!user%c@localhost'' would be queued for ``a.b!user@c''. The address ``a.b!user@localhost'' would be queued for ``user@a.b''. The address ``user.a@localhost'' would be queued for ``user@a''. Note that recognition of the ``.'' delimiter is a site-selectable option.
Also, addresses may be indirectly referenced, through a file
specification of the form:
``<filename'' or ``:include:filename''
where the angle-bracket must be the first non-blank character of the specification (to distinguish it from the ``<...>'' usage, above).
Addresses in the file may be separated by commas or newlines.
/* Reply Codes for MMDF* Based on: "Revised FTP Reply Codes", by Jon Postel & Nancy Neigus Arpanet * RFC 640 / NIC 30843, in the "Arpanet Protocol Handbook", E. Feinler * and J. Postel (eds.), NIC 7104, Network Information Center, SRI * International: Menlo Park, CA. (NTIS AD-A0038901) * * Actual values are different, but scheme is same. Codes must fit into * 8-bits (to pass on exit() calls); fields are packed 2-3-3 and interpreted * as octal numbers. * * Basic format: * * 0yz: positive completion; entire action done * 1yz: positive intermediate; only part done * 2yz: Transient negative completion; may work later * 3yz: Permanent negative completion; you lose forever * * x0z: syntax * x1z: general; doesn't fit any other category * x2z: connections; truly transfer-related * x3z: user/authentication/account * x4x: mail * x5z: file system * * 3-bit z field is unique to the reply. In the following, * the RP_xVAL defines are available for masking to obtain a field. */ /*************** FIELD DEFINITIONS & BASIC VALUES ***************** */
/* Field 1: Basic degree of success (2-bits) */
/* * Octal constant values are used for this field to avoid problems with sign * extension of char constant values with high bit set. */
#define RP_BTYP 0200 /* good vs. bad; on => bad */
#define RP_BVAL 0300 /* basic degree of success */
#define RP_BOK 0000 /* went fine; all done */ #define RP_BPOK 0100 /* only the first part got done */ #define RP_BTNO 0200 /* temporary failure; try later */ #define RP_BNO 0300 /* not now, nor never; you lose */
/* Field 2: Basic domain of discourse (3-bits) */
#define RP_CVAL ' 70') /* basic category (domain of reply) */
#define RP_CSYN ' 00' /* purely a matter of form */ #define RP_CGEN ' 10' /* couldn't find anywhere else for it */ #define RP_CCON ' 20' /* data-transfer-related issue */ #define RP_CUSR ' 30' /* pertaining to the user */ #define RP_CMAI ' 40' /* specific to mail semantics */ #define RP_CFIL ' 50' /* file system */ #define RP_CLIO ' 60' /* local i/o system */
/* Field 3: Specific value for this reply (3-bits) */
#define RP_SVAL ' 07' /* specific value of reply */ /********************* SPECIFIC SUCCESS VALUES ******************** */
/* Complete Success */
#define RP_DONE (RP_BOK | RP_CGEN | ' 00') /* done (e.g., w/transaction) */ #define RP_OK (RP_BOK | RP_CGEN | ' 01') /* general-purpose OK */
#define RP_MOK (RP_BOK | RP_CMAI | ' 00') /* message is accepted (w/text */ #define RP_DOK (RP_BOK | RP_CGEN | ' 03') /* accepted for the delayed submission channel */
/* Partial Success */
#define RP_MAST (RP_BPOK| RP_CGEN | ' 00') /* you are the requestor */ #define RP_SLAV (RP_BPOK| RP_CGEN | ' 01') /* you are the requestee */ #define RP_AOK (RP_BPOK| RP_CMAI | ' 00') /* message address is accepted */ #define RP_HOK (RP_BPOK| RP_CMAI | ' 01') /* host processing completed */ /********************* SPECIFIC FALURE VALUES ********************* */
/* Partial Failure */
#define RP_AGN (RP_BTNO | RP_CGEN | ' 00') /* not now; maybe later */ #define RP_TIME (RP_BTNO | RP_CGEN | ' 01') /* timeout */ #define RP_NOOP (RP_BTNO | RP_CGEN | ' 02') /* no-op; nothing done, this time */ #define RP_EOF (RP_BTNO | RP_CGEN | ' 03') /* encountered an end of file */
#define RP_NET (RP_BTNO | RP_CCON | ' 00') /* channel went bad */ #define RP_BHST (RP_BTNO | RP_CCON | ' 01') /* foreign host screwed up */ #define RP_DHST (RP_BTNO | RP_CCON | ' 02') /* host went away */ #define RP_NIO (RP_BTNO | RP_CCON | ' 04') /* general net i/o problem */ #define RP_NS (RP_BTNO | RP_CCON | ' 05') /* temporary nameserver failure */
#define RP_FIO (RP_BTNO | RP_CFIL | ' 00') /* error reading/writing file */ #define RP_FCRT (RP_BTNO | RP_CFIL | ' 01') /* unable to create file */ #define RP_FOPN (RP_BTNO | RP_CFIL | ' 02') /* unable to open file */ #define RP_LIO (RP_BTNO | RP_CLIO | ' 00') /* general local i/o problem */ #define RP_LOCK (RP_BTNO | RP_CLIO | ' 01') /* resource currently locked */
/* Complete Failure */
#define RP_MECH (RP_BNO | RP_CGEN | ' 00') /* bad mechanism/path; try alternate? */ #define RP_NO (RP_BNO | RP_CGEN | ' 01') /* general-purpose NO */
#define RP_PROT (RP_BNO | RP_CCON | ' 00') /* general prototocol error */
#define RP_RPLY (RP_BNO | RP_CCON | ' 01') /* bad reply code (PERMANENT ERROR) */
#define RP_NDEL (RP_BNO | RP_CMAI | ' 00') /* couldn't deliver */
#define RP_HUH (RP_BNO | RP_CSYN | ' 00') /* couldn't parse the request */ #define RP_NCMD (RP_BNO | RP_CSYN | ' 01') /* no such command defined */ #define RP_PARM (RP_BNO | RP_CSYN | ' 02') /* bad parameter */ #define RP_UCMD (RP_BNO | RP_CSYN | ' 03') /* command not implemented */ #define RP_USER (RP_BNO | RP_CUSR | ' 00') /* unknown user */ #define RP_NAUTH ((RP_BNO | RP_CUSR | ' 01')) /* bad authorisation */ /* SEK this will be used for user checks*/ #define RP_TOOBIG (RP_BNO | RP_CUSR | ' 02') /* User exceeded storage allocation */ #define RP_NONESUCH (RP_BNO | RP_CUSR | ' 03') /* We deny the existence of this mailbox */
/* STRUCTURE OF A REPLY STRING */
struct rp_construct /* for constant reply conditions */ { ret_t rp_cval; char rp_cline[50]; };
#define RP_LINEBUF_MAX 4096
struct rp_bufstruct /* for reading reply strings */ { ret_t rp_val; char rp_line[RP_LINEBUF_MAX]; };
typedef struct rp_bufstruct RP_Buf;
#define rp_conlen(bufnam) (strlen (bufnam.rp_cline) + sizeof (bufnam.rp_cval))
/* PSEUDO-FUNCTIONS TO ACCESS REPLY INFO */
#define rp_gval(val) ((ret_t) (val)) /* get the entire return value */
/* The next three give the field's bits, within the whole value */
#define rp_gbval(val) (rp_gval (val) & RP_BVAL) /* get the basic part of return value */ #define rp_gcval(val) (rp_gval (val) & RP_CVAL) /* get the domain part of value */ #define rp_gsval(val) (rp_gval (val) & RP_SVAL) /* get the specific part of value */
/* The next three give the numeric value withing the field */
#define rp_gbbit(val) ((rp_gval (val) >> 6) & 03) /* get the basic part right-shifted */ #define rp_gcbit(val) ((rp_gval (val) >> 3 ) & 07) /* get the domain part right-shifted */ #define rp_gsbit(val) (rp_gval (val) & 07) /* get the specific part right-shifted */
/* The following works with SIGNED or UNSIGNED chars! */ #define rp_isgood(val) (! rp_isbad(val)) /* is return value positive? */ #define rp_isbad(val) (rp_gval(val) & 0200) /* is return value negative? */