Простое письмо в C++
Простое письмо состоит из одной текстовой части без HTML и вложений.
Тело кладут после пустой строки, которая отделяет
заголовки от содержимого. Запишем строку сообщения,
выведем ее и зададим опции curl для загрузки этой
строки на учебный адрес smtp://127.0.0.1:2525:
#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: ann@example.com\r\n"
"Subject: Plain sample\r\n"
"\r\n"
"The shipment left the warehouse at noon.\r\n";
std::cout << message;
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl = curl_easy_init();
if (curl) {
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, "ann@example.com");
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_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
В консоли - полный текст письма с заголовками.
Колбэк readCallback отдает байты строки
порциями, если позже вызвать передачу на работающий
SMTP; здесь достаточно проверить формат и опции.
Сформируйте письмо с темой "Status" и текстом
"All items packed." для
ann@example.com. Выведите строку сообщения
целиком.
Задайте тело из двух строк: "Line one"
и "Line two" через символ перевода строки
в std::string. Выведите сообщение после
сборки.