From 7f304ab84f560c9ddcd3ed1887bb4aa99a90bd6a Mon Sep 17 00:00:00 2001 From: Steve Holme Date: Mon, 26 Sep 2011 14:07:54 +0100 Subject: [PATCH] smtp_mail: Added support to MAIL FROM for the optional SIZE parameter The size of the email can now be set via CURLOPT_INFILESIZE. This allows the email to be rejected by the server, if supported, and the maximum size has been configured on the server. --- lib/smtp.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/lib/smtp.c b/lib/smtp.c index bf48e28..68b05f2 100644 --- a/lib/smtp.c +++ b/lib/smtp.c @@ -787,24 +787,36 @@ static CURLcode smtp_state_auth_resp(struct connectdata *conn, /* start the DO phase */ static CURLcode smtp_mail(struct connectdata *conn) { + char *from = NULL; + char *size = NULL; CURLcode result = CURLE_OK; struct SessionHandle *data = conn->data; - /* send MAIL FROM */ + /* calculate the FROM parameter */ if(!data->set.str[STRING_MAIL_FROM]) /* null reverse-path, RFC-2821, sect. 3.7 */ - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "MAIL FROM:<>"); - + from = "<>"; else if(data->set.str[STRING_MAIL_FROM][0] == '<') - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "MAIL FROM:%s", - data->set.str[STRING_MAIL_FROM]); + from = aprintf("%s", data->set.str[STRING_MAIL_FROM]); + else + from = aprintf("<%s>", data->set.str[STRING_MAIL_FROM]); + + /* calculate the optional SIZE parameter */ + if(conn->data->set.infilesize > 0) + size = aprintf("%" FORMAT_OFF_T, data->set.infilesize); + + /* send MAIL FROM */ + if(size == NULL) + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "MAIL FROM:%s", from); else - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "MAIL FROM:<%s>", - data->set.str[STRING_MAIL_FROM]); + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "MAIL FROM:%s SIZE=%s", + from, size); + if(result) return result; state(conn, SMTP_MAIL); + return result; } -- 2.7.4