Письмо с разметкой в C++
Текстовое письмо и HTML различаются типом содержимого.
Для HTML в заголовках сообщения задают
Content-Type: text/html; charset=utf-8 -
эта строка входит в std::string письма, а не
в отдельный HTTP-заголовок 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: ann@example.com\r\n"
"Subject: HTML memo\r\n"
"MIME-Version: 1.0\r\n"
"Content-Type: text/html; charset=utf-8\r\n"
"\r\n"
"<p>Order is <b>confirmed</b>.</p>\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;
}
В выводе остаются теги <p> и <b> -
сырое HTML-содержимое части письма, а не страница
в браузере.
Соберите HTML с заголовком <h1>News</h1>
и абзацем "Weekly digest.". Выведите
строку сообщения целиком.
Сформируйте разметку со списком из двух пунктов
"A" и "B" через <ul>.
Проверьте по выводу, что оба пункта присутствуют
в теле.