Commit a4a60afa authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

- 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.
parent a434cb43
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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:

+4 −0
Original line number Diff line number Diff line
@@ -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
+26 −20
Original line number Diff line number Diff line
@@ -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;
    result = smtp_rcpt_to(conn);
  }

    state(conn, SMTP_RCPT);
  }
  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 */

+2 −2
Original line number Diff line number Diff line
@@ -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>
Loading