*/
#endif
-#define TRUE 1
-#define FALSE 0
-
#define NBITS ((sizeof (int)) * 8)
/*
if (sm_mts == MTS_SMTP)
return smtp_init (client, server, port, watch, verbose,
debug, sasl, saslmech, user, oauth_svc, tls);
- else
- return sendmail_init (client, watch, verbose, debug, sasl,
- saslmech, user);
+
+ return sendmail_init (client, watch, verbose, debug, sasl,
+ saslmech, user);
}
static int
} else {
client = LocalName(1); /* no clientname -> LocalName */
}
- }
-
- /*
- * Last-ditch check just in case client still isn't set to anything
- */
- if (client == NULL || *client == '\0')
- client = "localhost";
+ /*
+ * Last-ditch check just in case client still isn't set to anything
+ */
+ if (client == NULL || *client == '\0')
+ client = "localhost";
+ }
nsc = netsec_init();
if (user)
netsec_set_userid(nsc, user);
+ netsec_set_hostname(nsc, server);
+
if (sm_debug)
netsec_set_snoop(nsc, 1);
if (sasl) {
- if (netsec_set_sasl_params(nsc, server, "smtp", saslmech,
- sm_sasl_callback, &errstr) != OK)
+ if (netsec_set_sasl_params(nsc, "smtp", saslmech, sm_sasl_callback,
+ &errstr) != OK)
return sm_nerror(errstr);
}
netsec_set_fd(nsc, sd1, sd1);
- if (tls) {
- if (netsec_set_tls(nsc, 1, &errstr) != OK)
+ if (tls & S_TLSENABLEMASK) {
+ if (netsec_set_tls(nsc, 1, tls & S_NOVERIFY, &errstr) != OK)
return sm_nerror(errstr);
}
/*
- * If tls == 2, that means that the user requested "initial" TLS,
- * which happens right after the connection has opened. Do that
- * negotiation now
+ * If tls == S_INITTLS, that means that the user requested
+ * "initial" TLS, which happens right after the connection has
+ * opened. Do that negotiation now
*/
- if (tls == 2) {
+ if (tls & S_INITTLS) {
if (netsec_negotiate_tls(nsc, &errstr) != OK) {
sm_end(NOTOK);
return sm_nerror(errstr);
* restart the EHLO dialog after TLS negotiation is complete.
*/
- if (tls == 1) {
+ if (tls & S_STARTTLS) {
if (! EHLOset("STARTTLS")) {
sm_end(NOTOK);
return sm_ierror("SMTP server does not support TLS");
client = clientname;
else
client = LocalName(1); /* no clientname -> LocalName */
- }
-
- /*
- * Last-ditch check just in case client still isn't set to anything
- */
- if (client == NULL || *client == '\0')
- client = "localhost";
+ /*
+ * Last-ditch check just in case client still isn't set to anything
+ */
+ if (client == NULL || *client == '\0')
+ client = "localhost";
+ }
nsc = netsec_init();
if (user)
netsec_set_userid(nsc, user);
+ netsec_set_hostname(nsc, client);
+
if (sm_debug)
netsec_set_snoop(nsc, 1);
if (sasl) {
- if (netsec_set_sasl_params(nsc, client, "smtp", saslmech,
- sm_sasl_callback, &errstr) != OK)
+ if (netsec_set_sasl_params(nsc, "smtp", saslmech, sm_sasl_callback,
+ &errstr) != OK)
return sm_nerror(errstr);
}
}
int
-sm_winit (char *from, int smtputf8)
+sm_winit (char *from, int smtputf8, int eightbit)
{
- const char *const mail_parameters = smtputf8
- ? " BODY=8BITMIME SMTPUTF8"
- : "";
-
- /* Just for information, if an attempt is made to send to an 8-bit
- address without specifying SMTPUTF8, Gmail responds with
- 555 5.5.2 Syntax error.
- Gmail doesn't require the 8BITMIME, but RFC 6531 Sec. 1.2 does. */
- if (smtputf8 && (! EHLOset("8BITMIME") || ! EHLOset("SMTPUTF8"))) {
- sm_end (NOTOK);
- return RP_UCMD;
+ const char *mail_parameters = "";
+
+ if (smtputf8) {
+ /* Just for information, if an attempt is made to send to an 8-bit
+ address without specifying SMTPUTF8, Gmail responds with
+ 555 5.5.2 Syntax error.
+ Gmail doesn't require the 8BITMIME, but RFC 6531 Sec. 1.2 does. */
+ if (EHLOset ("8BITMIME") && EHLOset ("SMTPUTF8")) {
+ mail_parameters = " BODY=8BITMIME SMTPUTF8";
+ } else {
+ advise (NULL, "SMTP server does not support %s, not sending.\n"
+ "Rebuild message with 7-bit headers, WITHOUT -headerencoding utf-8.",
+ EHLOset ("SMTPUTF8") ? "8BITMIME" : "SMTPUTF8");
+ sm_end (NOTOK);
+ return RP_UCMD;
+ }
+ } else if (eightbit) {
+ /* Comply with RFC 6152, for messages that have any 8-bit characters
+ in their body. */
+ if (EHLOset ("8BITMIME")) {
+ mail_parameters = " BODY=8BITMIME";
+ } else {
+ advise (NULL, "SMTP server does not support 8BITMIME, not sending.\n"
+ "Suggest encoding message for 7-bit transport by setting your\n"
+ "locale to C, and/or specifying *b64 in mhbuild directives.");
+ sm_end (NOTOK);
+ return RP_UCMD;
+ }
}
switch (smtalk (SM_MAIL, "MAIL FROM:<%s>%s", from, mail_parameters)) {
&errstr)) != NULL ; ) {
if (doingEHLO
- && strncmp (buffer, "250", sizeof("250") - 1) == 0
+ && HasPrefix(buffer, "250")
&& (buffer[3] == '-' || doingEHLO == 2)
&& buffer[4]) {
if (doingEHLO == 2) {
continue;
if (sm_reply.code < 100) {
if (sm_verbose) {
- printf ("%s\n", sm_reply.text);
+ puts(sm_reply.text);
fflush (stdout);
}
goto again;
for (ehlo = EHLOkeys; *ehlo; ehlo++) {
ep = *ehlo;
- if (strncmp (ep, s, len) == 0) {
+ if (HasPrefix(ep, s)) {
for (ep += len; *ep == ' '; ep++)
continue;
return ep;
return NOTOK;
}
- if (strncmp(line, "334 ", 4) != 0) {
+ if (!HasPrefix(line, "334 ")) {
netsec_err(errstr, "Improper SASL protocol response: %s", line);
return NOTOK;
}
if (line == NULL)
return NOTOK;
- if (strncmp(line, "235 ", 4) != 0) {
+ if (!HasPrefix(line, "235 ")) {
if (len > 4)
netsec_err(errstr, "Authentication failed: %s", line + 4);
else