aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/curl/curl.h3
-rw-r--r--lib/smtp.c36
-rw-r--r--lib/url.c5
-rw-r--r--lib/urldata.h1
4 files changed, 39 insertions, 6 deletions
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 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";
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 <username> */