* This is a simpler, faster, replacement for "post" for use
* when "sendmail" is the transport system.
*
- * $Id$
+ * This code is Copyright (c) 2002, by the authors of nmh. See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
*/
#include <h/mh.h>
#include <h/addrsbr.h>
#include <h/aliasbr.h>
#include <h/dropsbr.h>
-#include <zotnet/tws/tws.h>
-
-#define uptolow(c) ((isalpha(c) && isupper (c)) ? tolower (c) : c)
+#include <h/tws.h>
+#include <h/mts.h>
+#include <h/utils.h>
#define MAX_SM_FIELD 1476 /* < largest hdr field sendmail will accept */
#define FCCS 10 /* max number of fccs allowed */
#define VERSIONSW 15
{ "version", 0 },
#define HELPSW 16
- { "help", 4 },
+ { "help", 0 },
#define DEBUGSW 17
{ "debug", -5 },
#define DISTSW 18
extern char *getfullname (void);
extern char *getusername (void);
+extern boolean draft_from_masquerading; /* defined in mts.c */
+
/*
* static prototypes
*/
static int get_header (char *, struct headers *);
static void putadr (char *, struct mailname *);
static int putone (char *, int, int);
-static void insert_fcc (struct headers *, char *);
+static void insert_fcc (struct headers *, unsigned char *);
static void file (char *);
static void fcc (char *, char *);
}
else {
#ifdef HAVE_MKSTEMP
- mkstemp (tmpfil);
+ if ((out = fdopen( mkstemp (tmpfil), "w" )) == NULL )
+ adios (tmpfil, "unable to create");
#else
mktemp (tmpfil);
-#endif
if ((out = fopen (tmpfil, "w")) == NULL)
adios (tmpfil, "unable to create");
chmod (tmpfil, 0600);
+#endif
}
hdrtab = (msgstate == normal) ? NHeaders : RHeaders;
f = mp->m_next; mp->m_next = 0;
putadr( name, f );
} else {
+ /* The author(s) of spost decided that alias substitution wasn't
+ necessary for the non-HTRY headers. Unfortunately, one of those
+ headers is "From:", and having alias substitution work on that is
+ extremely useful for someone with a lot of POP3 email accounts or
+ aliases. post supports aliasing of "From:"...
+
+ Since "From:"-processing is incompletely implemented in this
+ unsupported and undocumented spost backend, I'm not going to take
+ the time to implement my new draft-From:-based email address
+ masquerading. If I do ever implement it here, I'd almost
+ certainly want to implement "From:" line alias processing as
+ well. -- Dan Harkless <dan-nmh@dilvish.speed.net> */
fprintf (out, "%s: %s", name, str );
}
}
case normal:
if (!(msgflags & MDAT))
fprintf (out, "Date: %s\n", dtimenow (0));
- if (msgflags & MFRM)
- fprintf (out, "Sender: %s\n", from);
+
+ if (msgflags & MFRM) {
+ /* There was already a From: in the draft. Don't add one. */
+ if (!draft_from_masquerading)
+ /* mts.conf didn't contain "masquerade:[...]draft_from[...]"
+ so we'll reveal the user's actual account@thismachine
+ address in a Sender: header (and use it as the envelope
+ From: later). */
+ fprintf (out, "Sender: %s\n", from);
+ }
else
fprintf (out, "From: %s\n", signature);
+
#ifdef notdef
if (!(msgflags & MVIS))
fprintf (out, "Bcc: Blind Distribution List: ;\n");
case resent:
if (!(msgflags & MRDT))
fprintf (out, "Resent-Date: %s\n", dtimenow(0));
- if (msgflags & MRFM)
- fprintf (out, "Resent-Sender: %s\n", from);
+ if (msgflags & MRFM) {
+ /* There was already a Resent-From: in draft. Don't add one. */
+ if (!draft_from_masquerading)
+ /* mts.conf didn't contain "masquerade:[...]draft_from[...]"
+ so we'll reveal the user's actual account@thismachine
+ address in a Sender: header (and use it as the envelope
+ From: later). */
+ fprintf (out, "Resent-Sender: %s\n", from);
+ }
else
+ /* Construct a Resent-From: header. */
fprintf (out, "Resent-From: %s\n", signature);
#ifdef notdef
if (!(msgflags & MVIS))
struct headers *h;
for (h = table; h->value; h++)
- if (!strcasecmp (header, h->value))
+ if (!mh_strcasecmp (header, h->value))
return (h - table);
return NOTOK;
static void
-insert_fcc (struct headers *hdr, char *pp)
+insert_fcc (struct headers *hdr, unsigned char *pp)
{
- char *cp;
+ unsigned char *cp;
for (cp = pp; isspace (*cp); cp++)
continue;
char *vec[6];
FILE * in, *out;
+#ifdef HAVE_MKSTEMP
+ fd = mkstemp(bccfil);
+ if (fd == -1 || (out = fdopen(fd, "w")) == NULL)
+ adios (bccfil, "unable to create");
+#else
mktemp (bccfil);
if ((out = fopen (bccfil, "w")) == NULL)
adios (bccfil, "unable to create");
+#endif
chmod (bccfil, 0600);
fprintf (out, "Date: %s\n", dtimenow (0));
- fprintf (out, "From: %s\n", signature);
+ if (msgflags & MFRM) {
+ /* There was already a From: in the draft. Don't add one. */
+ if (!draft_from_masquerading)
+ /* mts.conf didn't contain "masquerade:[...]draft_from[...]"
+ so we'll reveal the user's actual account@thismachine
+ address in a Sender: header (and use it as the envelope
+ From: later). */
+ fprintf (out, "Sender: %s\n", from);
+ }
+ else
+ /* Construct a From: header. */
+ fprintf (out, "From: %s\n", signature);
if (subject)
fprintf (out, "Subject: %s", subject);
fprintf (out, "BCC:\n\n------- Blind-Carbon-Copy\n\n");