summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2010-02-20 22:29:59 +0000
committerDaniel Stenberg <daniel@haxx.se>2010-02-20 22:29:59 +0000
commita4a60afabbd65e674222a6df6ccd09c1b358ab77 (patch)
tree82dffbc3278c15912092c662c735972bef8d5dc2
parenta434cb43e807753730d815096464c9c7cb3f1596 (diff)
downloadcurl-a4a60afabbd65e674222a6df6ccd09c1b358ab77.tar.gz
- 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.
-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";
}