diff --git a/include/curl/curl.h b/include/curl/curl.h index 3c9c41d8a..f2501cd2b 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -1518,6 +1518,9 @@ typedef enum { /* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */ CINIT(SSL_OPTIONS, LONG, 216), + /* set the SMTP auth originator */ + CINIT(MAIL_AUTH, OBJECTPOINT, 217), + CURLOPT_LASTENTRY /* the last unused */ } CURLoption; diff --git a/lib/smtp.c b/lib/smtp.c index 95e71d75a..c02c9bdd4 100644 --- a/lib/smtp.c +++ b/lib/smtp.c @@ -893,6 +893,7 @@ static CURLcode smtp_state_auth_resp(struct connectdata *conn, static CURLcode smtp_mail(struct connectdata *conn) { char *from = NULL; + char *auth = NULL; char *size = NULL; CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; @@ -909,26 +910,49 @@ static CURLcode smtp_mail(struct connectdata *conn) if(!from) return CURLE_OUT_OF_MEMORY; - /* calculate the optional SIZE parameter */ - if(conn->data->set.infilesize > 0) { - size = aprintf("%" FORMAT_OFF_T, data->set.infilesize); + /* calculate the optional AUTH parameter */ + if(data->set.str[STRING_MAIL_AUTH] && conn->proto.smtpc.authused) { + if(data->set.str[STRING_MAIL_AUTH][0] == '<') + auth = aprintf("%s", data->set.str[STRING_MAIL_AUTH]); + else + auth = aprintf("<%s>", data->set.str[STRING_MAIL_AUTH]); - if(!size) { + if(!auth) { Curl_safefree(from); return CURLE_OUT_OF_MEMORY; } } - /* send MAIL FROM */ - if(!size) - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "MAIL FROM:%s", from); - else - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "MAIL FROM:%s SIZE=%s", - from, size); + /* calculate the optional SIZE parameter */ + if(conn->data->set.infilesize > 0) { + size = aprintf("%" FORMAT_OFF_T, data->set.infilesize); + + if(!size) { + Curl_safefree(from); + Curl_safefree(auth); + + return CURLE_OUT_OF_MEMORY; + } + } + + /* send MAIL FROM */ + if(!auth && !size) + result = Curl_pp_sendf(&conn->proto.smtpc.pp, + "MAIL FROM:%s", from); + else if(auth && !size) + result = Curl_pp_sendf(&conn->proto.smtpc.pp, + "MAIL FROM:%s AUTH=%s", from, auth); + else if(auth && size) + result = Curl_pp_sendf(&conn->proto.smtpc.pp, + "MAIL FROM:%s AUTH=%s SIZE=%s", from, auth, size); + else + result = Curl_pp_sendf(&conn->proto.smtpc.pp, + "MAIL FROM:%s SIZE=%s", from, size); - Curl_safefree(size); Curl_safefree(from); + Curl_safefree(auth); + Curl_safefree(size); if(result) return result; @@ -1308,7 +1332,7 @@ static CURLcode smtp_connect(struct connectdata *conn, pp->conn = conn; if(!*path) { - if(!Curl_gethostname(localhost, sizeof localhost)) + if(!Curl_gethostname(localhost, sizeof(localhost))) path = localhost; else path = "localhost"; diff --git a/lib/url.c b/lib/url.c index 277078ebf..c4e84550f 100644 --- a/lib/url.c +++ b/lib/url.c @@ -2402,6 +2402,11 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, va_arg(param, char *)); break; + case CURLOPT_MAIL_AUTH: + result = setstropt(&data->set.str[STRING_MAIL_AUTH], + va_arg(param, char *)); + break; + case CURLOPT_MAIL_RCPT: /* get a list of mail recipients */ data->set.mail_rcpt = va_arg(param, struct curl_slist *); diff --git a/lib/urldata.h b/lib/urldata.h index 0463006c6..1f3853dc7 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1335,6 +1335,7 @@ enum dupstring { STRING_SOCKS5_GSSAPI_SERVICE, /* GSSAPI service name */ #endif STRING_MAIL_FROM, + STRING_MAIL_AUTH, #ifdef USE_TLS_SRP STRING_TLSAUTH_USERNAME, /* TLS auth */