Несколько получателей в C++
Заголовок To может перечислять несколько адресов
через запятую.
В libcurl каждый получатель для SMTP добавляют через
curl_slist_append, а указатель списка передают
в CURLOPT_MAIL_RCPT. Запишем письмо для двух
адресатов, выведем текст и настроим curl:
#include <iostream>
#include <string>
#include <cstring>
#include <curl/curl.h>
struct UploadCtx {
const std::string* data;
std::size_t offset;
};
std::size_t readCallback(
char* ptr,
std::size_t size,
std::size_t nmemb,
void* userdata
) {
UploadCtx* ctx = static_cast<UploadCtx*>(userdata);
if (ctx->offset >= ctx->data->size()) {
return 0;
}
std::size_t room = size * nmemb;
std::size_t left = ctx->data->size() - ctx->offset;
std::size_t copy = std::min(room, left);
std::memcpy(ptr, ctx->data->data() + ctx->offset, copy);
ctx->offset += copy;
return copy;
}
int main() {
std::string message =
"From: writer@example.com\r\n"
"To: alpha@example.com, beta@example.com\r\n"
"Subject: Shared bulletin\r\n"
"\r\n"
"One send, two inboxes.\r\n";
std::cout << message;
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl = curl_easy_init();
if (curl) {
struct curl_slist* rcpt = nullptr;
rcpt = curl_slist_append(rcpt, "alpha@example.com");
rcpt = curl_slist_append(rcpt, "beta@example.com");
curl_easy_setopt(curl, CURLOPT_URL, "smtp://127.0.0.1:2525");
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "writer@example.com");
curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt);
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
UploadCtx ctx{&message, 0};
curl_easy_setopt(curl, CURLOPT_READFUNCTION, readCallback);
curl_easy_setopt(curl, CURLOPT_READDATA, &ctx);
curl_slist_free_all(rcpt);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
В строке To перечислены оба учебных адреса.
Список curl_slist дублирует их для команды
RCPT на сервере, когда SMTP действительно слушает порт.
Добавьте третьего получателя gamma@example.com
в заголовок и в три вызова curl_slist_append.
Выведите строку To из сообщения.
Оставьте только alpha@example.com
и beta@example.com с темой "Pair".
Выведите тему из заголовков собранной строки.