diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/smtp.c | 36 | ||||
-rw-r--r-- | lib/url.c | 5 | ||||
-rw-r--r-- | lib/urldata.h | 1 |
3 files changed, 36 insertions, 6 deletions
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 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(!auth) { + Curl_safefree(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); if(!size) { Curl_safefree(from); + Curl_safefree(auth); return CURLE_OUT_OF_MEMORY; } } /* send MAIL FROM */ - if(!size) - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "MAIL FROM:%s", 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); + 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"; @@ -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 <username> */ |