C++ Отправка писем через Защищенное соединение SSL SMTP Yandex с использованием libcurl

test
cURL
Ну вот, добрался я таки до своего любимого C++. Разное использовал: PHP, JS, JQuery, C#, Asterisk и прочее с ними взятое. Все это в большей степени под Debian GNU\Linux. Но больше всего люблю именно C++. И вот стала задача, переписать воркеры(самостоятельные демоны для сайта), которые висят в фоне в определенном количестве, получают задачу от Gearman и выполняют ее. Вот один из них просто отправляет почту. Используем для этих целей smtp Yandex.ru. Все удобно и стабильно. До этого роль воркера выполняли PHP+Swiftmailer, но PHP не язык для подобных целей. Итак, хватит введения.
Можно подключаться через 25-й порт на smtp:://smtp.yandex.ru:25, но много провайдеров которые блокируют 25 порт и тем самым вы увидите сообщение:
Immediate connect fail for ####:###::##: Network is unreachable
Trying ####:###::##...


По этому же поводу я общался со своим провайдером.

Комментариев особо не будет. Все достаточно просто. Сам код я взял отсюда, попутно поправив пару моментов.
Итак, сам код:
#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_me @ gmail.com";
  string from = "from_me @ yandex.ru";
  string subject = "Test";
  string message = "Test message";

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

  if( curl ){
    curl_easy_setopt(curl, CURLOPT_URL, "smtps://smtp. yandex. ru:465");
    curl_easy_setopt(curl, CURLOPT_USERNAME, "from_me @ yandex.ru");
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "mypassword");
    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);
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);

    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;
}
Это только база для создания воркера. И пример для тех кому понадобиться.
Категория: 
Share/Save

Делитесь с друзьями в социальных сетях! Оставляйте комментарии!

Share/Save

Это Вам так же может быть интересно!