diff options
-rw-r--r-- | CHANGES | 6 | ||||
-rw-r--r-- | RELEASE-NOTES | 1 | ||||
-rw-r--r-- | docs/libcurl/curl_easy_setopt.3 | 4 | ||||
-rw-r--r-- | lib/smtp.c | 46 | ||||
-rw-r--r-- | tests/data/test802 | 4 | ||||
-rw-r--r-- | tests/data/test803 | 2 | ||||
-rw-r--r-- | tests/ftpserver.pl | 4 |
7 files changed, 42 insertions, 25 deletions
@@ -7,6 +7,12 @@ Changelog Daniel Stenberg (20 Feb 2010) +- Fixed the SMTP compliance by making sure RCPT TO addresses are specified + properly in angle brackets. Recipients provided with CURLOPT_MAIL_RCPT now + get angle bracket wrapping automatically by libcurl unless the recipient + starts with an angle bracket as then the app is assumed to deal with that + properly on its own. + - I made the SMTP code expect a 250 response back from the server after the full DATA has been sent, and I modified the test SMTP server to also send that response. As usual, the DONE operation that is made after a completed diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 43380c2a0..1d32f380a 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -18,6 +18,7 @@ This release includes the following bugfixes: o fixed the CURL_FORMAT_* defines when building with cmake o missing quote in libcurl.m4 o SMTP: now waits for 250 after the DATA transfer + o SMTP: use angle brackets in RCPT TO This release includes the following known bugs: diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3 index cbbbefe31..07c4c0a22 100644 --- a/docs/libcurl/curl_easy_setopt.3 +++ b/docs/libcurl/curl_easy_setopt.3 @@ -1092,6 +1092,10 @@ SMTP mail request. The linked list should be a fully valid list of \fBstruct curl_slist\fP structs properly filled in. Use \fIcurl_slist_append(3)\fP to create the list and \fIcurl_slist_free_all(3)\fP to clean up an entire list. +Each recipient in SMTP lingo is specified with angle brackets (<>), but should +you not use an angle bracket as first letter libcurl will assume you provide a +single email address only and enclose that with angle brackets for you. + (Added in 7.20.0) .SH TFTP OPTIONS .IP CURLOPT_TFTP_BLKSIZE diff --git a/lib/smtp.c b/lib/smtp.c index f879651c6..238fc2dbb 100644 --- a/lib/smtp.c +++ b/lib/smtp.c @@ -330,6 +330,25 @@ static CURLcode smtp_mail(struct connectdata *conn) return result; } +static CURLcode smtp_rcpt_to(struct connectdata *conn) +{ + CURLcode result = CURLE_OK; + struct smtp_conn *smtpc = &conn->proto.smtpc; + + /* send RCPT TO */ + if(smtpc->rcpt) { + if(smtpc->rcpt->data[0] == '<') + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s", + smtpc->rcpt->data); + else + result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:<%s>", + smtpc->rcpt->data); + if(!result) + state(conn, SMTP_RCPT); + } + return result; +} + /* for MAIL responses */ static CURLcode smtp_state_mail_resp(struct connectdata *conn, int smtpcode, @@ -346,19 +365,11 @@ static CURLcode smtp_state_mail_resp(struct connectdata *conn, } else { struct smtp_conn *smtpc = &conn->proto.smtpc; - - /* send RCPT TO */ smtpc->rcpt = data->set.mail_rcpt; - if(smtpc->rcpt) { - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s", - smtpc->rcpt->data); - if(result) - return result; - } - - state(conn, SMTP_RCPT); + result = smtp_rcpt_to(conn); } + return result; } @@ -379,16 +390,13 @@ static CURLcode smtp_state_rcpt_resp(struct connectdata *conn, else { struct smtp_conn *smtpc = &conn->proto.smtpc; - /* one RCPT is done, but if there's one more to send go on */ - smtpc->rcpt = smtpc->rcpt->next; if(smtpc->rcpt) { - result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s", - smtpc->rcpt->data); - if(result) - return result; + smtpc->rcpt = smtpc->rcpt->next; + result = smtp_rcpt_to(conn); - state(conn, SMTP_RCPT); - return CURLE_OK; + /* if we failed or still is in RCPT sending, return */ + if(result || smtpc->rcpt) + return result; } /* send DATA */ @@ -432,8 +440,6 @@ static CURLcode smtp_state_postdata_resp(struct connectdata *conn, smtpstate instate) { CURLcode result = CURLE_OK; - struct SessionHandle *data = conn->data; - struct FTP *smtp = data->state.proto.smtp; (void)instate; /* no use for this yet */ diff --git a/tests/data/test802 b/tests/data/test802 index d3114137d..7027c802d 100644 --- a/tests/data/test802 +++ b/tests/data/test802 @@ -36,8 +36,8 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 802@foo --mail-rcpt 802@foobar.example <protocol> EHLO user
MAIL FROM:802@from
-RCPT TO:802@foo
-RCPT TO:802@foobar.example
+RCPT TO:<802@foo>
+RCPT TO:<802@foobar.example>
DATA
QUIT
</protocol> diff --git a/tests/data/test803 b/tests/data/test803 index f445e69cb..24ff0d001 100644 --- a/tests/data/test803 +++ b/tests/data/test803 @@ -42,7 +42,7 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 803@foo --mail-from 803@from -T - <protocol> EHLO user
MAIL FROM:803@from
-RCPT TO:803@foo
+RCPT TO:<803@foo>
DATA
QUIT
</protocol> diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl index 8c1692464..a97af17a4 100644 --- a/tests/ftpserver.pl +++ b/tests/ftpserver.pl @@ -482,12 +482,12 @@ sub DATA_smtp { return; # failure } - if($testno eq "verifiedserver") { + if($testno eq "<verifiedserver>") { sendcontrol "554 WE ROOLZ: $$\r\n"; return 0; # don't wait for data now } else { - $testno =~ s/^([0-9]*).*/$1/; + $testno =~ s/^([^0-9]*)([0-9]+).*/$2/; sendcontrol "354 Show me the mail\r\n"; } |