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

Ошибка отправки в C++

Если на хосте никто не слушает выбранный SMTP-порт, передача не завершится успешно.

Типичный учебный случай - соединение с 127.0.0.1 на порту 1: ОС отклоняет подключение, потому что служба не принимает клиентов. Зададим короткий таймаут, вызовем perform и выведем строку из curl_easy_strerror без сообщения об успешной отправке:

#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: Will fail\r\n" "\r\n" "No listener on port 1.\r\n"; curl_global_init(CURL_GLOBAL_DEFAULT); CURL* curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "smtp://127.0.0.1:1"); 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); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1L); UploadCtx ctx{&message, 0}; curl_easy_setopt(curl, CURLOPT_READFUNCTION, readCallback); curl_easy_setopt(curl, CURLOPT_READDATA, &ctx); CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { std::cout << curl_easy_strerror(res) << "\n"; } curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; }

Письмо в ящик не попадает: отказ порта прерывает SMTP-диалог. В консоли - описание кода CURLcode, а не метка об успешной доставке.

Повторите вызов perform на smtp://127.0.0.1:1 с CURLOPT_TIMEOUT равным 1. Выведите результат curl_easy_strerror.

После неудачного perform выведите "done". Убедитесь, что метка печатается, а строка "sent" в программе не используется.

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