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