/*
* 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 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 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);
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;
if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
- mts_init (invo_name);
+ mts_init ();
arguments = getarguments (invo_name, argc, argv, 0);
argp = arguments;
switch (state = m_getfld (&gstate, name, buf, &bufsz, in)) {
case FLD:
case FLDPLUS:
- compnum++;
+ compnum++;
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);
free (cp);
continue;
/* 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);
done (0);
}
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 {
- post (tmpfil, 0, isatty (1), envelope, oauth_flag, auth_svc);
+ post (tmpfil, 0, isatty (1), eai, envelope, oauth_flag, auth_svc);
}
p_refile (tmpfil);
*/
static void
-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;
return;
}
+ 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;
+
+ /* Enable passing of utf-8 setting to getname()/getadrx(). */
+ enable_eai();
+ }
+ }
+
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
}
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;
else
badmsg++;
}
+ }
if (count < 1) {
if (hdr->flags & HNIL)
*/
static void
-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)
{
int fd;
int retval, i;
break;
}
} else {
- if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch,
- verbose, snoop, sasl, saslmech, user,
+ if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch,
+ verbose, snoop, sasl, saslmech, user,
oauth_flag ? auth_svc : NULL, tls))
- || rp_isbad (retval = sm_winit (envelope)))
+ || rp_isbad (retval = sm_winit (envelope, eai))) {
die (NULL, "problem initializing server; %s", rp_string (retval));
+ }
do_addresses (bccque, talk && verbose);
if ((fd = open (file, O_RDONLY)) == NOTOK)
/* 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;
sigon ();
- if (!whomsw || checksw)
+ if (!whomsw || checksw) {
if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch,
verbose, snoop, sasl, saslmech, user,
oauth_flag ? auth_svc : NULL, tls))
- || rp_isbad (retval = sm_winit (envelope)))
+ || rp_isbad (retval = sm_winit (envelope, eai))) {
die (NULL, "problem initializing server; %s", rp_string (retval));
+ }
+ }
if (talk && !whomsw)
printf (" -- Address Verification --\n");