Возникла задачка на С++ отправлять 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 здесь подключена для того, чтобы в стандартном выводе для отладки можно было посмотреть как идет отправка.