aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSteve Holme <steve_holme@hotmail.com>2011-10-05 22:22:29 +0100
committerDaniel Stenberg <daniel@haxx.se>2012-02-14 22:50:49 +0100
commit0cf0ab6f3008aaad0bb5e3291539e80123028864 (patch)
tree4d4e57b2e1aa0305eb4697eae27115fc341f81a1 /lib
parentee7e4fc1d1d45713e9e67a955e78f0d9ed1a6059 (diff)
smtp_mail: Added support to MAIL FROM for the optional AUTH parameter
Added a new CURLOPT_MAIL_AUTH option that allows the calling program to set the optional AUTH parameter in the MAIL FROM command. When this option is specified and an authentication mechanism is used to communicate with the mail server then the AUTH parameter will be included in the MAIL FROM command. This is particularly useful when the calling program is acting as a relay in a trusted environment and performing server to server communication, as it allows the relaying server to specify the address of the mailbox that was used to authenticate and send the original email.
Diffstat (limited to 'lib')
-rw-r--r--lib/smtp.c36
-rw-r--r--lib/url.c5
-rw-r--r--lib/urldata.h1
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";
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> */