summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES6
-rw-r--r--RELEASE-NOTES1
-rw-r--r--docs/libcurl/curl_easy_setopt.34
-rw-r--r--lib/smtp.c46
-rw-r--r--tests/data/test8024
-rw-r--r--tests/data/test8032
-rw-r--r--tests/ftpserver.pl4
7 files changed, 42 insertions, 25 deletions
diff --git a/CHANGES b/CHANGES
index 28f20475c..99c93dc9e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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";
}