Commit 0cf0ab6f authored by Steve Holme's avatar Steve Holme Committed by Daniel Stenberg
Browse files

smtp_mail: Added support to MAIL FROM for the optional AUTH parameter

Added a new CURLOPT_MAIL_AUTH option that allows the calling program to
set the optional AUTH parameter in the MAIL FROM command.

When this option is specified and an authentication mechanism is used
to communicate with the mail server then the AUTH parameter will be
included in the MAIL FROM command. This is particularly useful when the
calling program is acting as a relay in a trusted environment and
performing server to server communication, as it allows the relaying
server to specify the address of the mailbox that was used to
authenticate and send the original email.
parent ee7e4fc1
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1518,6 +1518,9 @@ typedef enum {
  /* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */
  CINIT(SSL_OPTIONS, LONG, 216),

  /* set the SMTP auth originator */
  CINIT(MAIL_AUTH, OBJECTPOINT, 217),

  CURLOPT_LASTENTRY /* the last unused */
} CURLoption;

+30 −6
Original line number Diff line number Diff line
@@ -893,6 +893,7 @@ static CURLcode smtp_state_auth_resp(struct connectdata *conn,
static CURLcode smtp_mail(struct connectdata *conn)
{
  char *from = NULL;
  char *auth = NULL;
  char *size = NULL;
  CURLcode result = CURLE_OK;
  struct SessionHandle *data = conn->data;
@@ -909,26 +910,49 @@ static CURLcode smtp_mail(struct connectdata *conn)
  if(!from)
    return CURLE_OUT_OF_MEMORY;

  /* calculate the optional AUTH parameter */
  if(data->set.str[STRING_MAIL_AUTH] && conn->proto.smtpc.authused) {
    if(data->set.str[STRING_MAIL_AUTH][0] == '<')
      auth = aprintf("%s", data->set.str[STRING_MAIL_AUTH]);
    else
      auth = aprintf("<%s>", data->set.str[STRING_MAIL_AUTH]);

    if(!auth) {
      Curl_safefree(from);

      return CURLE_OUT_OF_MEMORY;
    }
  }

  /* calculate the optional SIZE parameter */
  if(conn->data->set.infilesize > 0) {
    size = aprintf("%" FORMAT_OFF_T, data->set.infilesize);

    if(!size) {
      Curl_safefree(from);
      Curl_safefree(auth);

      return CURLE_OUT_OF_MEMORY;
    }
  }

  /* send MAIL FROM */
  if(!size)
    result = Curl_pp_sendf(&conn->proto.smtpc.pp, "MAIL FROM:%s", from);
  if(!auth && !size)
    result = Curl_pp_sendf(&conn->proto.smtpc.pp,
                           "MAIL FROM:%s", from);
  else if(auth && !size)
    result = Curl_pp_sendf(&conn->proto.smtpc.pp,
                           "MAIL FROM:%s AUTH=%s", from, auth);
  else if(auth && size)
    result = Curl_pp_sendf(&conn->proto.smtpc.pp,
                           "MAIL FROM:%s AUTH=%s SIZE=%s", from, auth, size);
  else
    result = Curl_pp_sendf(&conn->proto.smtpc.pp, "MAIL FROM:%s SIZE=%s",
                           from, size);
    result = Curl_pp_sendf(&conn->proto.smtpc.pp,
                           "MAIL FROM:%s SIZE=%s", from, size);

  Curl_safefree(size);
  Curl_safefree(from);
  Curl_safefree(auth);
  Curl_safefree(size);

  if(result)
    return result;
@@ -1308,7 +1332,7 @@ static CURLcode smtp_connect(struct connectdata *conn,
  pp->conn = conn;

  if(!*path) {
    if(!Curl_gethostname(localhost, sizeof localhost))
    if(!Curl_gethostname(localhost, sizeof(localhost)))
      path = localhost;
    else
      path = "localhost";
+5 −0
Original line number Diff line number Diff line
@@ -2402,6 +2402,11 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
                       va_arg(param, char *));
    break;

  case CURLOPT_MAIL_AUTH:
    result = setstropt(&data->set.str[STRING_MAIL_AUTH],
                       va_arg(param, char *));
    break;

  case CURLOPT_MAIL_RCPT:
    /* get a list of mail recipients */
    data->set.mail_rcpt = va_arg(param, struct curl_slist *);
+1 −0
Original line number Diff line number Diff line
@@ -1335,6 +1335,7 @@ enum dupstring {
  STRING_SOCKS5_GSSAPI_SERVICE,  /* GSSAPI service name */
#endif
  STRING_MAIL_FROM,
  STRING_MAIL_AUTH,

#ifdef USE_TLS_SRP
  STRING_TLSAUTH_USERNAME,     /* TLS auth <username> */