Ошибка отправки в 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" в программе не используется.