How to Send Email Through Gmail Using Libcurl

I needed to send an e-mail through my C++ program and was able to do it using Libcurl. Since I had a hard time initially, I decided to share the following with you.

Download libcurl


First download libcurl. I found binaries for my OS, Mac OSX, with some instructions on how to unpackage it making installation a breeze.

Compiling a Sample SMTP Program with Authentication and Transport Security


I found a sample smtp-tls program in which I simply saved and compiled to make sure libcurl was linking properly. If it isn’t, try compiling it in the following manner:

g++ smtp-tls.c -o smtp-tls -lcurl

Modifying the Sample to Work with GMail


I found the configuration instructions in the following support page: Configuring Other Mail Clients.

I modified the following lines in the smtp-tls program to make it work with GMail.

First, I changed the following FROM, TO, CC variables from

#define FROM    "<sender@example.org>"
#define TO      "<addressee@example.net>"
#define CC      "<info@example.org>"

to the following.

#define FROM    "<myemailaddress@gmail.com>"
#define TO      "<myemailaddress@gmail.com>"
#define CC      "<myemailaddress@gmail.com>"

Then I changed the following line setting the URL from

curl_easy_setopt(curl, CURLOPT_URL, "smtp://mainserver.example.net:587");

to the following.

curl_easy_setopt(curl, CURLOPT_URL, "smtp://smtp.gmail.com:587");

I then commented out the following line

//curl_easy_setopt(curl, CURLOPT_CAINFO,"/path/to/certificate.pem");

since I kept receiving errors about certificates and wasn’t sure how to fix this. (If this isn’t done properly, please let me know otherwise!)

Afterwards, I simply put my e-mail address and password

    curl_easy_setopt(curl, CURLOPT_USERNAME, "myemailaddress@gmail.com");
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "PASSWORD123");

The console looked in the following manner:

* About to connect() to smtp.gmail.com port 587 (#0)
*   Trying 74.125.53.109... * connected
* Connected to smtp.gmail.com (74.125.53.109) port 587 (#0)
< 220 mx.google.com ESMTP q10sm8033678pbb.10
> EHLO unknownc42c0304eee8
< 250-mx.google.com at your service, [99.53.224.80]
< 250-SIZE 35882577
< 250-8BITMIME
< 250-STARTTLS
< 250 ENHANCEDSTATUSCODES
> STARTTLS
< 220 2.0.0 Ready to start TLS
* SSL connection using RC4-SHA
* Server certificate:
* 	 subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=smtp.gmail.com
* 	 start date: 2011-11-18 01:57:17 GMT
* 	 expire date: 2012-11-18 02:07:17 GMT
* 	 common name: smtp.gmail.com (matched)
* 	 issuer: C=US; O=Google Inc; CN=Google Internet Authority
* 	 SSL certificate verify ok.
> EHLO unknownc42c0304eee8
< 250-mx.google.com at your service, [99.53.224.80]
< 250-SIZE 35882577
< 250-8BITMIME
< 250-AUTH LOGIN PLAIN XOAUTH
< 250 ENHANCEDSTATUSCODES
> AUTH PLAIN a3VyaXlha2lAA21haWwuY291AGt1cml5YWtpQGdtYWlsLmNvbQBHTUF0b3MyNzEzdB==
< 235 2.7.0 Accepted
> MAIL FROM:<myemailaddress@gmail.com>
< 250 2.1.0 OK q10sm8033678pbb.10
> RCPT TO:<myemailaddress@gmail.com>
< 250 2.1.5 OK q10sm8033678pbb.10
> RCPT TO:<myemailaddress@gmail.com>
< 250 2.1.5 OK, duplicate recipients will be consolidated. q10sm8033678pbb.10
> DATA
< 354  Go ahead q10sm8033678pbb.10
< 250 2.0.0 OK 1329280154 q10sm8033678pbb.10
* Connection #0 to host smtp.gmail.com left intact
> QUIT
< 221 2.0.0 closing connection q10sm8033678pbb.10
* Closing connection #0

I checked my e-mail, and there it was! If you wish to modify the contents of the e-mail, simply modify the payload.

Let me know if you encountered any problems.

  • SGH

    May be useful to you, but you tried to send your email twice via Recipients. Notice this line:

    > RCPT TO:
    RCPT TO:
    < 250 2.1.5 OK, duplicate recipients will be consolidated. q10sm8033678pbb.10

    "duplicate recipients will be consolidated." means you have a duplicate email destination address.
    With gmail it only sent once, with other email providers it may send it multiple times.