+++ /dev/null
-.\"
-.\" %nmhwarning%
-.\" $Id$
-.\"
-.TH MH-MTS %manext8% "%nmhdate%" MH.6.8 [%nmhversion%]
-.SH NAME
-mh-mts \- the nmh interface to the message transport system
-.SH SYNOPSIS
-.in +.5i
-.ti -.5i
-SendMail
-
-.ti .5i
-Zmailer
-
-.ti .5i
-MMDF (any release)
-
-.ti .5i
-stand\-alone
-.in -.5i
-.SH DESCRIPTION
-THIS IS OUT OF DATE AND NEEDS REWORKING.
-
-\fInmh\fR can use a wide range of message transport systems to deliver
-mail. Although the \fInmh\fR administrator usually doesn't get to choose
-which MTS to use (since it's already in place), this document briefly
-describes the interfaces.
-
-When communicating with \fISendMail\fR, \fInmh\fR always uses the SMTP to
-post mail. Depending on the \fInmh\fR configuration, \fISendMail\fR may
-be invoked directly (via a \fIfork\fR and an \fIexec\fR), or \fInmh\fR
-may open a TCP/IP connection to the SMTP server on the localhost.
-
-When communicating with \fIzmailer\fP, the \fISendMail\fP compatibility
-program is required to be installed in /usr/lib. \fInmh\fP communicates
-with \fIzmailer\fP by using the SMTP. It does this by invoking the
-\fB/usr/lib/sendmail\fP compatibility program directly, with the
-`\-bs' option.
-
-When communicating with \fIMMDF\fR, normally \fInmh\fR uses the
-\*(lqmm\(ru\*(rq routines to post mail. However, depending on the
-\fInmh\fR configuration, \fInmh\fR instead may open a TCP/IP connection
-to the SMTP server on the localhost.
-
-If you are running a UNIX system with TCP/IP networking, then it is
-felt that the best interface is achieved by using either \fISendMail\fR
-or \fIMMDF\fR with the SMTP option. This gives greater flexibility.
-To enable this option you append the /smtp suffix to the mts option
-in the \fInmh\fR configuration. This yields two primary advantages:
-First, you don't have to know where \fIsubmit\fR or \fISendMail\fR live.
-This means that \fInmh\fR binaries (e.g., \fIpost\fR\0) don't have to have
-this information hard\-coded, or can run different programs altogether;
-and, second, you can post mail with the server on different systems, so
-you don't need either \fIMMDF\fR or \fISendMail\fR on your local host.
-Big win in conserving cycles and disk space. Since \fInmh\fR supports
-the notion of a server search\-list in this respect, this approach can
-be tolerant of faults. Be sure to set \*(lqservers:\*(rq as described
-in mh\-tailor(8) if you use this option.
-
-There are four disadvantages to using the SMTP option: First, only UNIX
-systems with TCP/IP are supported. Second, you need to have an SMTP
-server running somewhere on any network your local host can reach.
-Third, this bypasses any authentication mechanisms in \fIMMDF\fR
-or \fISendMail\fR. Fourth, the file \fB/etc/hosts\fR is used for
-hostname lookups (although there is an exception file). In response
-to these disadvantages though: First, there's got to be an SMTP server
-somewhere around if you're in the Internet or have a local network.
-Since the server search\-list is very general, a wide\-range of options
-are possible. Second, SMTP should be fixed to have authentication
-mechanisms in it, like POP. Third, \fInmh\fR won't choke on mail to
-hosts whose official names it can't verify, it'll just plug along (and
-besides if you enable the DUMB configuration options, \fInmh\fR
-ignores the hosts file altogether).
-.Fi
-^%etcdir%/mts.conf~^nmh mts configuration file
-.Pr
-None
-.Sa
-\fIMMDF\-II: A Technical Review\fR,
-Proceedings, Usenix Summer '84 Conference
-.br
-\fISENDMAIL \-\- An Internetwork Mail Router\fR
-.br
-mh\-tailor(8), post(8)
-.De
-None
-.Co
-None
-.Bu
-The %etcdir%/mts.conf file ignores the information in the \fIMMDF\-II\fR
-tailoring file.
-.En
# endif
#endif
-#ifdef MMDFMTS
-# include <mts/mmdf/util.h>
-# include <mts/mmdf/mmdf.h>
-#endif
-
#ifdef SMTPMTS
# include <mts/smtp/smtp.h>
#endif
-#ifndef MMDFMTS
-# define uptolow(c) ((isalpha(c) && isupper (c)) ? tolower (c) : (c))
-#endif
-
#ifndef CYRUS_SASL
# define SASLminc(a) (a)
#else /* CYRUS_SASL */
{ "Resent-Fcc", HFCC, 0 },
{ "Reply-To", HADR, 0 },
{ "From", HADR|HNGR, MFRM },
-#ifdef MMDFI
- { "Sender", HADR|HNGR|HMNG, 0 },
-#else
{ "Sender", HADR|HNGR, 0 },
-#endif
{ "Date", HNOP, MDAT },
{ "To", HADR|HNIL, 0 },
{ "cc", HADR|HNIL, 0 },
static struct mailname uuaddrs={NULL}; /* uucp addrs */
static struct mailname tmpaddrs={NULL}; /* temporary queue */
-#ifdef MMDFMTS
-static char *submitmode = "m"; /* deliver to mailbox only */
-static char submitopts[6] = "vl"; /* initial options for submit */
-#endif /* MMDFMTS */
-
#ifdef SMTPMTS
static int snoop = 0;
static int smtpmode = S_MAIL;
arguments = getarguments (invo_name, argc, argv, 0);
argp = arguments;
-#if defined(MMDFMTS) && defined(MMDFII)
- mmdf_init (invo_name);
-#endif /* MMDFMTS and MMDFII */
-
while ((cp = *argp++)) {
if (*cp == '-') {
switch (smatch (++cp, switches)) {
adios (NULL, "bad argument %s %s", argp[-2], cp);
continue;
-#ifdef MMDFMTS
- case MAILSW:
- submitmode = "m";
- continue;
- case SOMLSW: /* for right now, sigh... */
- case SAMLSW:
- submitmode = "b";
- continue;
- case SENDSW:
- submitmode = "y";
- continue;
-#endif /* MMDFMTS */
-
case DLVRSW:
if (!(cp = *argp++) || *cp == '-')
adios (NULL, "missing argument to %s", argp[-2]);
done (0);
}
-#ifdef MMDFMTS
- strcat (submitopts, submitmode);
- if (watch)
- strcat (submitopts, "nw");
-#endif /* MMDFMTS */
-
if (msgflags & MINV) {
make_bcc_file (dashstuff);
if (msgflags & MVIS) {
if (whomsw && !fill_up)
break;
-#ifdef MMDFI /* sigh */
- fprintf (out, "Sender: %s\n", from);
-#endif /* MMDFI */
-
fprintf (out, "Resent-Date: %s\n", dtime (&tclock, 0));
if (msgid)
fprintf (out, "Resent-Message-ID: <%d.%ld@%s>\n",
chkadr ();
-#ifdef MMDFMTS
- if (rp_isbad (retval = mm_waend ()))
- die (NULL, "problem ending addresses [%s]\n", rp_valstr (retval));
-#endif /* MMDFMTS */
-
#ifdef SMTPMTS
if (rp_isbad (retval = sm_waend ()))
die (NULL, "problem ending addresses; %s", rp_string (retval));
#endif /* SMTPMTS */
-/*
- * MMDF routines
- */
-
-#ifdef MMDFMTS
-
-static void
-post (char *file, int bccque, int talk)
-{
- int fd, onex;
- int retval;
-#ifdef RP_NS
- int len;
- struct rp_bufstruct reply;
-#endif /* RP_NS */
-
- onex = !(msgflags & MINV) || bccque;
- if (verbose) {
- if (msgflags & MINV)
- printf (" -- Posting for %s Recipients --\n",
- bccque ? "Blind" : "Sighted");
- else
- printf (" -- Posting for All Recipients --\n");
- }
-
- sigon ();
-
- if (rp_isbad (retval = mm_init ())
- || rp_isbad (retval = mm_sbinit ())
- || rp_isbad (retval = mm_winit (NULL, submitopts, from)))
- die (NULL, "problem initializing MMDF system [%s]",
- rp_valstr (retval));
-#ifdef RP_NS
- if (rp_isbad (retval = mm_rrply (&reply, &len)))
- die (NULL, "problem with sender address [%s]",
- rp_valstr (retval));
-#endif /* RP_NS */
-
- do_addresses (bccque, talk && verbose);
- if ((fd = open (file, O_RDONLY)) == NOTOK)
- die (file, "unable to re-open");
- do_text (file, fd);
- close (fd);
- fflush (stdout);
-
- mm_sbend ();
- mm_end (OK);
- sigoff ();
-
- if (verbose)
- if (msgflags & MINV)
- printf (" -- %s Recipient Copies Posted --\n",
- bccque ? "Blind" : "Sighted");
- else
- printf (" -- Recipient Copies Posted --\n");
- fflush (stdout);
-}
-
-
-/* Address Verification */
-
-static void
-verify_all_addresses (int talk)
-{
- int retval;
- struct mailname *lp;
-
-#ifdef RP_NS
- int len;
- struct rp_bufstruct reply;
-#endif /* RP_NS */
-
- sigon ();
-
- if (!whomsw || checksw) {
- if (rp_isbad (retval = mm_init ())
- || rp_isbad (retval = mm_sbinit ())
- || rp_isbad (retval = mm_winit (NULL, submitopts, from)))
- die (NULL, "problem initializing MMDF system [%s]",
- rp_valstr (retval));
-#ifdef RP_NS
- if (rp_isbad (retval = mm_rrply (&reply, &len)))
- die (NULL, "problem with sender address [%s]", rp_valstr (retval));
-#endif /* RP_NS */
- }
-
- if (talk && !whomsw)
- printf (" -- Address Verification --\n");
- if (talk && localaddrs.m_next)
- printf (" -- Local Recipients --\n");
- for (lp = localaddrs.m_next; lp; lp = lp->m_next)
- do_an_address (lp, talk);
-
- if (talk && uuaddrs.m_next)
- printf (" -- UUCP Recipients --\n");
- for (lp = uuaddrs.m_next; lp; lp = lp->m_next)
- do_an_address (lp, talk);
-
- if (talk && netaddrs.m_next)
- printf (" -- Network Recipients --\n");
- for (lp = netaddrs.m_next; lp; lp = lp->m_next)
- do_an_address (lp, talk);
-
- chkadr ();
- if (talk && !whomsw)
- printf (" -- Address Verification Successful --\n");
-
- if (!whomsw || checksw)
- mm_end (NOTOK);
-
- fflush (stdout);
- sigoff ();
-}
-
-
-static void
-do_an_address (struct mailname *lp, int talk)
-{
- int len, retval;
- char *mbox, *host, *text, *path;
- char addr[BUFSIZ];
- struct rp_bufstruct reply;
-
- switch (lp->m_type) {
- case LOCALHOST:
- mbox = lp->m_mbox;
- host = LocalName ();
- strncpy (addr, mbox, sizeof(addr));
- break;
-
- case UUCPHOST:
- fprintf (talk ? stdout : stderr, " %s!%s: %s\n",
- lp->m_host, lp->m_mbox, "not supported; UUCP address");
- unkadr++;
- fflush (stdout);
- return;
-
- default: /* let MMDF decide if the host is bad */
- mbox = lp->m_mbox;
- host = lp->m_host;
- snprintf (addr, sizeof(addr), "%s at %s", mbox, host);
- break;
- }
-
- if (talk)
- printf (" %s%s", addr, whomsw && lp->m_bcc ? "[BCC]" : "");
-
- if (whomsw && !checksw) {
- putchar ('\n');
- return;
- }
- if (talk)
- printf (": ");
- fflush (stdout);
-
-#ifdef MMDFII
- if (lp->m_path)
- path = concat (lp->m_path, mbox, "@", host, NULL);
- else
-#endif /* MMDFII */
- path = NULL;
- if (rp_isbad (retval = mm_wadr (path ? NULL : host, path ? path : mbox))
- || rp_isbad (retval = mm_rrply (&reply, &len)))
- die (NULL, "problem submitting address [%s]", rp_valstr (retval));
-
- switch (rp_gval (reply.rp_val)) {
- case RP_AOK:
- if (talk)
- printf ("address ok\n");
- fflush (stdout);
- return;
-
-#ifdef RP_DOK
- case RP_DOK:
- if (talk)
- printf ("nameserver timeout - queued for checking\n");
- fflush (stdout);
- return;
-#endif /* RP_DOK */
-
- case RP_NO:
- text = "you lose";
- break;
-
-#ifdef RP_NS
- case RP_NS:
- text = "temporary nameserver failure";
- break;
-
-#endif /* RP_NS */
-
- case RP_USER:
- case RP_NDEL:
- text = "not deliverable";
- break;
-
- case RP_AGN:
- text = "try again later";
- break;
-
- case RP_NOOP:
- text = "nothing done";
- break;
-
- default:
- if (!talk)
- fprintf (stderr, " %s: ", addr);
- text = "unexpected response";
- die (NULL, "%s;\n [%s] -- %s", text,
- rp_valstr (reply.rp_val), reply.rp_line);
- }
-
- if (!talk)
- fprintf (stderr, " %s: ", addr);
- fprintf (talk ? stdout : stderr, "%s;\n %s\n", text, reply.rp_line);
- unkadr++;
-
- fflush (stdout);
-}
-
-
-static void
-do_text (char *file, int fd)
-{
- int retval, state;
- char buf[BUFSIZ];
- struct rp_bufstruct reply;
-
- lseek (fd, (off_t) 0, SEEK_SET);
-
- while ((state = read (fd, buf, sizeof(buf))) > 0) {
- if (rp_isbad (mm_wtxt (buf, state)))
- die (NULL, "problem writing text [%s]\n", rp_valstr (retval));
- }
-
- if (state == NOTOK)
- die (file, "problem reading from");
-
- if (rp_isbad (retval = mm_wtend ()))
- die (NULL, "problem ending text [%s]\n", rp_valstr (retval));
-
- if (rp_isbad (retval = mm_rrply (&reply, &state)))
- die (NULL, "problem getting submission status [%s]\n",
- rp_valstr (retval));
-
- switch (rp_gval (reply.rp_val)) {
- case RP_OK:
- case RP_MOK:
- break;
-
- case RP_NO:
- die (NULL, "you lose; %s", reply.rp_line);
-
- case RP_NDEL:
- die (NULL, "no delivery occurred; %s", reply.rp_line);
-
- case RP_AGN:
- die (NULL, "try again later; %s", reply.rp_line);
-
- case RP_NOOP:
- die (NULL, "nothing done; %s", reply.rp_line);
-
- default:
- die (NULL, "unexpected response;\n\t[%s] -- %s",
- rp_valstr (reply.rp_val), reply.rp_line);
- }
-}
-
-#endif /* MMDFMTS */
-
/*
* SIGNAL HANDLING
if (msgflags & MINV)
unlink (bccfil);
-#ifdef MMDFMTS
- if (!whomsw || checksw)
- mm_end (NOTOK);
-#endif /* MMDFMTS */
-
#ifdef SMTPMTS
if (!whomsw || checksw)
sm_end (NOTOK);
if (msgflags & MINV)
unlink (bccfil);
-#ifdef MMDFMTS
- if (!whomsw || checksw)
- mm_end (NOTOK);
-#endif /* MMDFMTS */
-
#ifdef SMTPMTS
if (!whomsw || checksw)
sm_end (NOTOK);
va_end(ap);
done (1);
}
-
-
-#ifdef MMDFMTS
-/*
- * err_abrt() is used by the mm_ routines
- * do not, under *ANY* circumstances, remove it from post,
- * or you will lose *BIG*
- */
-
-void
-err_abrt (int code, char *fmt, ...)
-{
- char buffer[BUFSIZ];
- va_list ap;
-
- snprintf (buffer, sizeof(buffer), "[%s]", rp_valstr (code));
-
- va_start(ap, fmt);
- advertise (buffer, NULL, fmt, ap);
- va_end(ap);
-
- done (1);
-}
-#endif /* MMDFMTS */