aboutsummaryrefslogtreecommitdiff
path: root/lib/smtp.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/smtp.c')
-rw-r--r--lib/smtp.c36
1 files changed, 30 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";