SMTPUTF8 if it finds any 8-bit characters in header field bodies.
# check with incompatible locale
# This is here as a place holder. We should either try to run the (8-bit) text
# through iconv, or refuse to display it if the locale is incompatible. In the
# check with incompatible locale
# This is here as a place holder. We should either try to run the (8-bit) text
# through iconv, or refuse to display it if the locale is incompatible. In the
-# cAse of EAI, that means not UTF-8.
+# case of EAI, that means not UTF-8.
# start_test 'incompatible locale'
# LC_ALL=C
# run_test "$mhl -form mhl.headers `mhpath last`" \
# start_test 'incompatible locale'
# LC_ALL=C
# run_test "$mhl -form mhl.headers `mhpath last`" \
http://www.computer.org/cms/computing-edge/ce-jun15-final.pdf, p. 50.
EOF
http://www.computer.org/cms/computing-edge/ce-jun15-final.pdf, p. 50.
EOF
-test_post "${testname}.actual" "${testname}.expected" -eai
+test_post "${testname}.actual" "${testname}.expected"
X("library directory", -7, LIBSW) /* interface from send, whom */ \
X("mime", 0, MIMESW) \
X("nomime", 0, NMIMESW) \
X("library directory", -7, LIBSW) /* interface from send, whom */ \
X("mime", 0, MIMESW) \
X("nomime", 0, NMIMESW) \
- X("eai", 0, EAISW) \
- X("noeai", 0, NEAISW) \
X("msgid", 0, MSGDSW) \
X("nomsgid", 0, NMSGDSW) \
X("verbose", 0, VERBSW) \
X("msgid", 0, MSGDSW) \
X("nomsgid", 0, NMSGDSW) \
X("verbose", 0, VERBSW) \
static int verbose = 0; /* spell it out */
static int format = 1; /* format addresses */
static int mime = 0; /* use MIME-style encapsulations for Bcc */
static int verbose = 0; /* spell it out */
static int format = 1; /* format addresses */
static int mime = 0; /* use MIME-style encapsulations for Bcc */
-static int eai = 0; /* use EAI (SMTPUTF8) */
static int msgid = 0; /* add msgid */
static int debug = 0; /* debugging post */
static int watch = 0; /* watch the delivery process */
static int msgid = 0; /* add msgid */
static int debug = 0; /* debugging post */
static int watch = 0; /* watch the delivery process */
/*
* static prototypes
*/
/*
* static prototypes
*/
-static void putfmt (char *, char *, FILE *);
+static void putfmt (char *, char *, int *, FILE *);
static void start_headers (void);
static void finish_headers (FILE *);
static int get_header (char *, struct headers *);
static void start_headers (void);
static void finish_headers (FILE *);
static int get_header (char *, struct headers *);
static int annoaux (struct mailname *);
static void insert_fcc (struct headers *, char *);
static void make_bcc_file (int);
static int annoaux (struct mailname *);
static void insert_fcc (struct headers *, char *);
static void make_bcc_file (int);
-static void verify_all_addresses (int, char *, int, char *);
+static void verify_all_addresses (int, int, char *, int, char *);
static void chkadr (void);
static void sigon (void);
static void sigoff (void);
static void p_refile (char *);
static void fcc (char *, char *);
static void die (char *, char *, ...);
static void chkadr (void);
static void sigon (void);
static void sigoff (void);
static void p_refile (char *);
static void fcc (char *, char *);
static void die (char *, char *, ...);
-static void post (char *, int, int, char *, int, char *);
+static void post (char *, int, int, int, char *, int, char *);
static void do_text (char *file, int fd);
static void do_an_address (struct mailname *, int);
static void do_addresses (int, int);
static void do_text (char *file, int fd);
static void do_an_address (struct mailname *, int);
static void do_addresses (int, int);
main (int argc, char **argv)
{
int state, compnum, dashstuff = 0, swnum, oauth_flag = 0;
main (int argc, char **argv)
{
int state, compnum, dashstuff = 0, swnum, oauth_flag = 0;
+ int eai = 0; /* use Email Address Internationalization (EAI) (SMTPUTF8) */
char *cp, *msg = NULL, **argp, **arguments, *envelope;
char buf[BUFSIZ], name[NAMESZ], *auth_svc = NULL;
FILE *in, *out;
char *cp, *msg = NULL, **argp, **arguments, *envelope;
char buf[BUFSIZ], name[NAMESZ], *auth_svc = NULL;
FILE *in, *out;
- case EAISW:
- eai = 1;
- continue;
- case NEAISW:
- eai = 0;
- continue;
-
case MSGDSW:
msgid++;
continue;
case MSGDSW:
msgid++;
continue;
if ((in = fopen (msg, "r")) == NULL)
adios (msg, "unable to open");
if ((in = fopen (msg, "r")) == NULL)
adios (msg, "unable to open");
- /* Support EAI. */
- if (eai) {
- /* Add eai profile entry, to pass utf-8 setting to getname()/getadrx(). */
- add_profile_entry ("eai", "utf-8");
- }
-
start_headers ();
if (debug) {
verbose++;
start_headers ();
if (debug) {
verbose++;
switch (state = m_getfld (&gstate, name, buf, &bufsz, in)) {
case FLD:
case FLDPLUS:
switch (state = m_getfld (&gstate, name, buf, &bufsz, in)) {
case FLD:
case FLDPLUS:
cp = add (buf, NULL);
while (state == FLDPLUS) {
bufsz = sizeof buf;
state = m_getfld (&gstate, name, buf, &bufsz, in);
cp = add (buf, cp);
}
cp = add (buf, NULL);
while (state == FLDPLUS) {
bufsz = sizeof buf;
state = m_getfld (&gstate, name, buf, &bufsz, in);
cp = add (buf, cp);
}
- putfmt (name, cp, out);
+ putfmt (name, cp, &eai, out);
/* If we are doing a "whom" check */
if (whomsw) {
/* This won't work with MTS_SENDMAIL_PIPE. */
/* If we are doing a "whom" check */
if (whomsw) {
/* This won't work with MTS_SENDMAIL_PIPE. */
- verify_all_addresses (1, envelope, oauth_flag, auth_svc);
+ verify_all_addresses (1, eai, envelope, oauth_flag, auth_svc);
verify_all_addresses with MTS_SENDMAIL_PIPE, but
that might require running sendmail as root. Note
that spost didn't verify addresses. */
verify_all_addresses with MTS_SENDMAIL_PIPE, but
that might require running sendmail as root. Note
that spost didn't verify addresses. */
- verify_all_addresses (verbose, envelope, oauth_flag, auth_svc);
+ verify_all_addresses (verbose, eai, envelope, oauth_flag,
+ auth_svc);
- post (tmpfil, 0, verbose, envelope, oauth_flag, auth_svc);
+ post (tmpfil, 0, verbose, eai, envelope, oauth_flag, auth_svc);
- post (bccfil, 1, verbose, envelope, oauth_flag, auth_svc);
+ post (bccfil, 1, verbose, eai, envelope, oauth_flag, auth_svc);
(void) m_unlink (bccfil);
} else {
(void) m_unlink (bccfil);
} else {
- post (tmpfil, 0, isatty (1), envelope, oauth_flag, auth_svc);
+ post (tmpfil, 0, isatty (1), eai, envelope, oauth_flag, auth_svc);
-putfmt (char *name, char *str, FILE *out)
+putfmt (char *name, char *str, int *eai, FILE *out)
{
int count, grp, i, keep;
char *cp, *pp, *qp;
{
int count, grp, i, keep;
char *cp, *pp, *qp;
+ if (! *eai) {
+ /* Check each header field value to see if it has any 8-bit characters.
+ If it does, enable EAI support. */
+ if (contains8bit(str, NULL)) {
+ if (verbose) {
+ printf ("EAI/SMTPUTF8 enabled\n");
+ }
+
+ /* Enable SMTPUTF8. */
+ *eai = 1;
+
+ /* Add eai profile entry, to pass utf-8 setting to
+ getname()/getadrx(). */
+ add_profile_entry ("eai", "utf-8");
+ }
+ }
+
if ((i = get_header (name, hdrtab)) == NOTOK) {
if ((i = get_header (name, hdrtab)) == NOTOK) {
- if (strncasecmp (name, "nmh-", 4)) {
+ if (strncasecmp (name, "nmh-", 4)) {
fprintf (out, "%s: %s", name, str);
} else {
/* Filter out all Nmh-* headers, because Norm asked. They
fprintf (out, "%s: %s", name, str);
} else {
/* Filter out all Nmh-* headers, because Norm asked. They
}
tmpaddrs.m_next = NULL;
}
tmpaddrs.m_next = NULL;
- for (count = 0; (cp = getname (str)); count++)
+
+ for (count = 0; (cp = getname (str)); count++) {
if ((mp = getm (cp, NULL, 0, error, sizeof(error)))) {
if (tmpaddrs.m_next)
np->m_next = mp;
if ((mp = getm (cp, NULL, 0, error, sizeof(error)))) {
if (tmpaddrs.m_next)
np->m_next = mp;
if (count < 1) {
if (hdr->flags & HNIL)
if (count < 1) {
if (hdr->flags & HNIL)
-post (char *file, int bccque, int talk, char *envelope, int oauth_flag,
- char *auth_svc)
+post (char *file, int bccque, int talk, int eai, char *envelope,
+ int oauth_flag, char *auth_svc)
/* Address Verification */
static void
/* Address Verification */
static void
-verify_all_addresses (int talk, char *envelope, int oauth_flag, char *auth_svc)
+verify_all_addresses (int talk, int eai, char *envelope, int oauth_flag,
+ char *auth_svc)
{
int retval;
struct mailname *lp;
{
int retval;
struct mailname *lp;
X("noforward", 0, NFORWSW) \
X("mime", 0, MIMESW) \
X("nomime", 0, NMIMESW) \
X("noforward", 0, NFORWSW) \
X("mime", 0, MIMESW) \
X("nomime", 0, NMIMESW) \
- X("eai", 0, EAISW) \
- X("noeai", 0, NEAISW) \
X("msgid", 0, MSGDSW) \
X("nomsgid", 0, NMSGDSW) \
X("push", 0, PUSHSW) \
X("msgid", 0, MSGDSW) \
X("nomsgid", 0, NMSGDSW) \
X("push", 0, PUSHSW) \
vec[vecp++] = --cp;
continue;
vec[vecp++] = --cp;
continue;
- case EAISW:
- vec[vecp++] = --cp;
- continue;
- case NEAISW:
- vec[vecp++] = --cp;
- continue;
-
case SNOOPSW:
snoop++;
vec[vecp++] = --cp;
case SNOOPSW:
snoop++;
vec[vecp++] = --cp;
by longjmp. */
volatile int nvecs = vecp;
int *nvecsp = (int *) &nvecs;
by longjmp. */
volatile int nvecs = vecp;
int *nvecsp = (int *) &nvecs;
/*
* Run the mimebuildproc (which is by default mhbuild) on the message
* with the addition of the "-auto" flag
*/
/*
* Run the mimebuildproc (which is by default mhbuild) on the message
* with the addition of the "-auto" flag
*/
- /* Make sure that EAI support is set up before calling buildmimeproc. */
- for (i = 0; i < vecp; ++i) {
- if (strcasecmp (vec[i], "-eai") == 0) {
- eai = 1;
- } else if (strcasecmp (vec[i], "-noeai") == 0) {
- eai = 0;
- }
- }
-
switch (child = fork()) {
case NOTOK:
adios("fork", "unable to");
switch (child = fork()) {
case NOTOK:
adios("fork", "unable to");
if (distfile)
buildvec[i++] = "-dist";
buildvec[i++] = (char *) drft;
if (distfile)
buildvec[i++] = "-dist";
buildvec[i++] = (char *) drft;
- if (eai) {
- /* Add eai profile entry, to pass utf-8 setting to
- getname()/getadrx(). This doesn't seem to be necessary
- now, but it's here just in case the code changes
- later. */
- add_profile_entry("eai", "utf-8");
-
- /* Add mhbuild switch to enable UTF-8 headers. */
- buildvec[i++] = "-headerencoding";
- buildvec[i++] = "utf-8";
- }
buildvec[i] = NULL;
execvp(buildprogram, buildvec);
fprintf(stderr, "unable to exec ");
buildvec[i] = NULL;
execvp(buildprogram, buildvec);
fprintf(stderr, "unable to exec ");
X("noforward", 0, NFORWSW) \
X("mime", 0, MIMESW) \
X("nomime", 0, NMIMESW) \
X("noforward", 0, NFORWSW) \
X("mime", 0, MIMESW) \
X("nomime", 0, NMIMESW) \
- X("eai", 0, EAISW) \
- X("noeai", 0, NEAISW) \
X("msgid", 0, MSGDSW) \
X("nomsgid", 0, NMSGDSW) \
X("push", 0, SPSHSW) \
X("msgid", 0, MSGDSW) \
X("nomsgid", 0, NMSGDSW) \
X("push", 0, SPSHSW) \
case NBITSTUFFSW:
case MIMESW:
case NMIMESW:
case NBITSTUFFSW:
case MIMESW:
case NMIMESW:
- case EAISW:
- case NEAISW:
case MSGDSW:
case NMSGDSW:
case WATCSW:
case MSGDSW:
case NMSGDSW:
case WATCSW:
X("tls", TLSminc(-3), TLSSW) \
X("initialtls", TLSminc(-10), INITTLSSW) \
X("notls", TLSminc(-5), NTLSSW) \
X("tls", TLSminc(-3), TLSSW) \
X("initialtls", TLSminc(-10), INITTLSSW) \
X("notls", TLSminc(-5), NTLSSW) \
- X("eai", 0, EAISW) \
- X("noeai", 0, NEAISW) \
X("mts smtp|sendmail/smtp|sendmail/pipe", 0, MTSSW) \
#define X(sw, minchars, id) id,
X("mts smtp|sendmail/smtp|sendmail/pipe", 0, MTSSW) \
#define X(sw, minchars, id) id,
case TLSSW:
case INITTLSSW:
case NTLSSW:
case TLSSW:
case INITTLSSW:
case NTLSSW:
- case EAISW:
- case NEAISW:
vec[vecp++] = --cp;
continue;
vec[vecp++] = --cp;
continue;