Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpMlHtm 671 of 696 menu
◀ ▶

Письмо с разметкой в 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>. Проверьте по выводу, что оба пункта присутствуют в теле.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить