Search code examples
clibcurl

SMTP mail using libcurl


I compiled the c example the ships with libcurl.

The source file is smtp-tls.c

Tried to use it to send mail through gmail and this is the response that I got

* About to connect() to smtp.gmail.com port 465 (#0)
*   Trying 74.125.115.109... * connected
* Server auth using Basic with user '[email protected]'
> GET / HTTP/1.1 Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Host: smtp.gmail.com:465
> Accept: */*

* Empty reply from server
* Connection #0 to host smtp.gmail.com left intact
* Server returned nothing (no headers, no data)
* Closing connection #0

What did I miss? I did not modify the code in any way except for the variable inputs. On this machine I am able to send and receive mail using Outlook 2003.
EDIT
Tried a different port. This is the result

* About to connect() to smtp.gmail.com port 587 (#0)
*   Trying 74.125.93.109... * connected
* Server auth using Basic with user '[email protected]'
> GET / HTTP/1.1 Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Host: smtp.gmail.com:587
> Accept: */*

220 mx.google.com ESMTP ew54y2x5of95qdz.12 502 5.5.1 Unrecognized command. ew54y2x5of95qdz.12
* Connection #0 to host smtp.gmail.com left intact
* Closing connection #0<br>

EDIT

Main looks like this

int main()
{
 CURL *curl;
  CURLcode res;
  struct curl_slist *recipients = NULL;
  struct upload_status upload_ctx;

  upload_ctx.lines_read = 0;

  curl = curl_easy_init();
  if (curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "smtp://gmail.com:587");
    curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
    curl_easy_setopt(curl, CURLOPT_USERNAME, "[email protected]");
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "xxxxxxxx");
    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM);
    recipients = curl_slist_append(recipients, TO);
    recipients = curl_slist_append(recipients, CC);
    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
    curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
    res = curl_easy_perform(curl);
    curl_slist_free_all(recipients);
    curl_easy_cleanup(curl);
  }
  return 0;
}

EDIT

Looks like the correct URL should be smtp://smtp.gmail.com:587
This gets me further, now I am getting

* About to connect() to smtp.gmail.com port 587 (#0)
*   Trying 74.125.45.108... * connected
< 220 mx.google.com ESMTP j26srtuiopnann.7
> EHLO my_computer_name
< 250-mx.google.com at your service, 
< 250-SIZE 35882577
< 250-8BITMIME
< 250-STARTTLS
< 250 ENHANCEDSTATUSCODES
* No known auth mechanisms supported!
> QUIT
< 221 2.0.0 closing connection j26srtuiopnann.7
* Closing connection #0
* Login denied

EDIT

Libcurl was not built with SSL support


Solution

  • The first output there looks like you're feeding libcurl a HTTP URL.

    With your edited question the problem now turned into something completely different. Now it rather looks like you perhaps don't have SSL enabled in your built libcurl?