Отправка сообщения с SMTP аутентификацией в C++ через libcurl

Возникла задачка на С++ отправлять email сообщения из программы.
Удивительно, но libcurl, который есть практически на любой nix системе позволяет это делать, причем и используя SMTP аутентификацию.
В сети есть примеры реализации отправки сообщения в основном на Си, мой пример пригодится тем, кто использует С++.


#include <curl/curl.h>
#include <iostream>
#include <string.h>
#include <string>
#include <queue>

using namespace std;

queue<string> init_message( string to, string from, string subj, string message ){

  queue<string> msg;
  string s = "To: " + to + "\n";
  msg.push( s );
  s = "From: " + from + "\n";
  msg.push( s );
  s = "Subject: " + subj + "\n";
  msg.push( s );
  s = "\n";
  msg.push( s );
  msg.push( message );
  return msg;
}

static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp){

  queue<string> *msg = (queue<string>*)userp;
  string s;
  if( msg->empty()){
    return 0;
  }
  else{
    s = msg->front();
    msg->pop();
  }

  memcpy(ptr, s.c_str(), s.size() );
  return s.size();
}


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

  curl = curl_easy_init();
  string to = "<to@domain.com>";
  string from = "<from@domain.com>";
  string subject = "Test";
  string message = "Test message";

  queue<string> msg = init_message( to, from, subject, message );

  if( curl ){
    curl_easy_setopt(curl, CURLOPT_URL, "smtp://smtp.domain.com:25");
    curl_easy_setopt(curl, CURLOPT_USERNAME, "smtp_login");
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "smtp_pass");
    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, from.c_str() );
    recipients = curl_slist_append(recipients, to.c_str() );
    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);

    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
    curl_easy_setopt(curl, CURLOPT_READDATA, &msg );

    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);

    res = curl_easy_perform(curl);
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));
    
    curl_slist_free_all(recipients);
    curl_easy_cleanup(curl);

  }
  return 0;

}

Опция CURLOPT_VERBOSE здесь подключена для того, чтобы в стандартном выводе для отладки можно было посмотреть как идет отправка.