|
|
1.1 ! root 1: ALL command line arguments that are addresses will be !-format: ! 2: !-format addresses: h1!h2!u ! 3: means route to host h1, from there to h2, and user u there. ! 4: a "uucp" as host means the bangs on the right will remain ! 5: after translation to %@-format. ! 6: ! 7: 822-format: @h1,@h2:u%h5%h4@h3 ! 8: means h1!h2!h3!h4!h5!u ! 9: ! 10: %@-format addresses: u%h3%h2@h1 ! 11: 822-format without using the source-routing list at the beginning. ! 12: We understand the full 822-format coming in, but send out ! 13: only %@-format. ! 14: ! 15: remote-from-line: From fpath date remote from sys ! 16: where fpath, date, and sys are non-whitespace. fpath in !-format ! 17: ! 18: local-from-line: From fpath date ! 19: ! 20: Unix-mail-format: a remote-from-line followed by message ! 21: ! 22: 822-mail-format: group of headers (format "tag: stuff", stuff can go ! 23: over multiple lines), including at least "From:" and "Date:", ! 24: then blank line, then message. Addresses in headers are in ! 25: 822-format. ! 26: ! 27: rmail [-#] [-d] to1 to2 ... ! 28: ! 29: -# means just print action ! 30: -d means print rewrite actions ! 31: to1 to2 etc. are in !-format ! 32: stdin has Unix-mail-format ! 33: ! 34: reads stdin into message structure *mp ! 35: parses first line as remote-from-line ! 36: sets mp->sender=sys!fpath (or just fpath, if "remote from ") ! 37: and mp->date to date ! 38: if fails, uses "upasname" environment var, else ! 39: logname of caller, else Liz.Bimmler ! 40: (the send program is just like rmail, but doesn't expect a first ! 41: remote-from-line, so mp->sender is upasname or logname of caller) ! 42: gateway code changes a sender like a!b!c!d!u to c!d!u if ! 43: a and b are in /usr/lib/upas/equivlist or are equal ! 44: to the local system, and c is not. Then, if remainder ! 45: (say c!d!u) is such that rewriting u gives c!d!u, then ! 46: mp->sender will just be u. ! 47: mp->replyaddr set to copy of mp->sender, unless there ! 48: are shell characters in it: then "postmaster" ! 49: bind(to1, to2, ...) follows rewrite rules (see man 8 upas and ! 50: man 7 mail). \s in rules replaced by mp->sender. ! 51: forwarding allowed only if all machines on mp->sender ! 52: or all machines on dest are in /usr/lib/upas/forwardlist ! 53: (or if that file doesn't exist) ! 54: for each bound address, one of: ! 55: cat it to mbox, with local-from-line (fpath=mp->sender) ! 56: or pipe message (with remote-from-line, fpath=mp->sender, ! 57: sys=sysname_read(), changing "^From " to ">From ") ! 58: to a command ! 59: or complain about mail (if ontty, report error, else ! 60: make a message to mp->replyaddr from "postmaster" ! 61: with appropriate error message ! 62: ! 63: ! 64: fromsmtp [-h host] [-s defaultsender] [-d] to1 to2 ... ! 65: ! 66: -d means just print the command that will be piped to, and ! 67: the standard input that will be given to it ! 68: if no -h, host is NULL ! 69: if no -s, defaultsender is NULL ! 70: to1, to2, ... in !-format (shouldn't have cur host at beginning, ! 71: unless have upas rewrite rules to handle that) ! 72: stdin in 822-mail-format ! 73: ! 74: starts up ! 75: /bin/rmail to1 to2 ... ! 76: calls from822(host, pointer to rmail pipe, defaultsender) to filter the ! 77: stdin message into Unix-mail-format, and ! 78: into the rmail command ! 79: ! 80: from822(net, file pointer, defsender) ! 81: stdin in 822-mail-format or Unix-mail-format ! 82: ! 83: if first line is "From x y remote from z", then ! 84: unixfrom=z!x, unixdate=y ! 85: if it is "From x y" then unixfrom=x, unixdate=y ! 86: reads header lines (have ':' after only non-whitespace) from stdin ! 87: from is first non-null in this list: ! 88: unixfrom, Reply-To:-header', From:-header', Sender:-header', ! 89: defsender, "unknown" ! 90: (where header' means the value of the field modified as follows: ! 91: take first whitespace delimited token or the first thing ! 92: enclosed in <...>, and convert it to !-format from 822-format, ! 93: then prepend "net!" if net is non-NULL (i.e., if -h net was ! 94: given on command line to fromsmtp) ! 95: date is Date:-header (with juggled field order) or unixdate ! 96: write remote-from-line, with fpath=from, date=date, sys="" ! 97: write header lines, in order they were gotten, with no change ! 98: copy out the rest of stdin ! 99: ! 100: tosmtp [-d domain] [-H helohost] [-f] [-n] [-u] [tohost from to1 to2 ...] ! 101: ! 102: Pass -d, -H along along to smtp (if no -f) ! 103: if -f, just act as filter to stdout ! 104: from, to1, to2 in !-format (with current host, tohost respect.) ! 105: stdin in Unix-mail-format ! 106: ! 107: sender=from, or if from has no ! in it, then sysname_read()!from ! 108: if not -f, starts up ! 109: smtp [-d domain] [-H helohost] sender tohost from to1 to2 ... ! 110: if -u (unixformat) then copy stdin to smtp or stdout ! 111: else call to822(pointer to smtp pipe or stdout, sender, domain, rcvrs) ! 112: (where domain is NULL if no -d, and rcvrs is NULL if -n ! 113: else rcvrs is "to1', to2', ... ton'" and to1' is the ! 114: conversion of to1 to %@-format, etc.) ! 115: ! 116: to822(file pointer, sender, domain, rcvrs) ! 117: stdin in Unix-mail-format ! 118: output goes to file pointer ! 119: ! 120: read first line, parse as remote-from-line (fpath, date, sys) ! 121: (exit if couldn't parse as such) ! 122: read any 822 headers ! 123: caddr=sender converted to %@-format, with .domain added to end ! 124: if domain is non-NULL and sender's last component has ! 125: not '.' in it ! 126: if there's a From:-header, let faddr be the first token or ! 127: thing enclosed in <...>. If faddr ends doesn't end in ! 128: .domain (if domain!=NULL) and faddr isn't the same as caddr, ! 129: then print "From: caddr" and turn original into >From: ! 130: else (there's not From:-header) ! 131: print "From: caddr" ! 132: [we ignore fpath] ! 133: if there's no Date:-header, use date from above, juggled order ! 134: if there's no To:-header and rcvrs is non-NULL, use that ! 135: write the headers, in original order (perhaps changing From: to >From:) ! 136: write a newline ! 137: write rest of stdin ! 138: ! 139: smtpqer [-g] [-H helohost] [-d domain] [-u] from tohost to... ! 140: ! 141: from, to in !-format ! 142: stdin in Unix-mail-format ! 143: ! 144: unless -g, add HOSTNAME! to from address (HOSTNAME= this host) ! 145: unless -u, run ! 146: tosmtp [-H helohost] [-d domain] from tohost to... ! 147: > /usr/spool/smtpq/x.y.msg (x, y are numbers) ! 148: (to convert message into 822 format) ! 149: make a shell script called /usr/spool/smtpq/x.y.sh that: ! 150: runs smtp [-H helohost] [-d domain] from tohost to... ! 151: removes files if ok ! 152: runs returnsmtpmail if no such user or host ! 153: start runsmtpq to run all shell scripts in spool directory ! 154: ! 155: smtp [-H helohost] [-d domain] [-D] sender targethost to1 to2 ... ! 156: ! 157: if no -H, use sysname_read() is used for helohost ! 158: if no -d domain, use 0 ! 159: -D for debugging ! 160: sender !-format (with cur host) ! 161: to1, to2, ... in !-format (with targethost) ! 162: stdin in any format that receiver can understand ! 163: ! 164: convert sender to %@-format, adding .domain if it is non-NULL and ! 165: the last component has no '.' ! 166: convert to1, to2, ... to %@-format ! 167: connect to smtp port on targethost ! 168: sends ! 169: HELO helohost ! 170: MAIL FROM:<sender'> ! 171: RCPT TO:<to1'> ! 172: RCPT TO:<to2'> ! 173: ... ! 174: DATA ! 175: stdin, adding \r after \n and making . transparent ! 176: . ! 177: QUIT ! 178: ! 179: smtpd [-d] [-H helohost] [-h thishost] ! 180: ! 181: -d sets socket debugging ! 182: if no -H, use sysname_read() ! 183: if no -h, NULL ! 184: ! 185: listens on smtp port for connections, forking when get one ! 186: expect send ! 187: HELO 250 helohost ! 188: MAIL FROM:<sender> 250 OK ! 189: RCPT TO:<to1> 250 OK ! 190: RCPT TO:<to2> 250 OK ! 191: ... ! 192: DATA 354 Start mail input; end with . ! 193: message in 822-format, with hidden dots ! 194: . ! 195: message gets put into a tmp file ! 196: sender and to's should be in 822-format ! 197: then runs ! 198: fromsmtp [-s sender] [-h thishost] to1' to2' ... < tmp file ! 199: and sends either 250 OK or 554 Transaction failed ! 200: where to1' to2' are gotten from to1 to2 by converting to ! 201: !-format, with the first machine stripped off ! 202: (since it should be the local machine) ! 203: the -s usually appears (unless there's an error parsing MAIL FROM) ! 204: [MISTAKE? should convert to !-format??] ! 205: the -h appears if it appeared in command line ! 206: ! 207:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.