Отправка Email на C++: библиотеки и реализация

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка Email на C++: обзор библиотек и практические примеры

Отправка электронных писем — одна из ключевых задач для многих приложений: от систем мониторинга и уведомлений до полноценных почтовых клиентов. В языке C++ нет встроенной поддержки протокола SMTP, однако существуют мощные сторонние библиотеки, которые позволяют легко интегрировать отправку email. В этой статье мы рассмотрим наиболее популярные инструменты, их установку и приведём рабочие примеры кода.

Основные способы отправки Email на C++

Существует три основных подхода к отправке писем на C++:

  • Использование libcurl — самая популярная и гибкая библиотека. Поддерживает SMTP, SMTP-SSL, SMTP-STARTTLS.
  • Использование VMime — специализированная библиотека для работы с MIME-сообщениями, шифрованием и вложениями.
  • Прямая работа с сокетами — низкоуровневый подход, требующий ручной реализации протокола SMTP.

В этом руководстве мы сосредоточимся на libcurl как на самом универсальном и широко используемом решении.

Установка libcurl

Для работы с SMTP через libcurl вам потребуется установить саму библиотеку и её заголовочные файлы. Примеры для разных операционных систем:

# Ubuntu / Debian
sudo apt-get install libcurl4-openssl-dev

# CentOS / Fedora
sudo yum install libcurl-devel

# macOS (через Homebrew)
brew install curl

# Windows (через vcpkg)
vcpkg install curl

Убедитесь, что ваша сборка curl включает поддержку протоколов SMTP и SSL. Проверить это можно командой:

curl --version | grep -i smtp

Простой пример: отправка текстового письма

Рассмотрим базовый пример отправки email через SMTP-сервер Gmail с использованием libcurl. Для успешной отправки вам понадобится пароль приложения (App Password) для Gmail.

#include <stdio.h>
#include <string.h>
#include <curl/curl.h>

// Структура для передачи данных письма
struct upload_status {
    int lines_read;
    const char **payload_text;
};

// Функция обратного вызова для чтения тела письма
static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) {
    struct upload_status *upload_ctx = (struct upload_status *)userp;
    const char *data;

    if (upload_ctx->lines_read < 5) {
        data = upload_ctx->payload_text[upload_ctx->lines_read];
        if (data) {
            size_t len = strlen(data);
            memcpy(ptr, data, len);
            upload_ctx->lines_read++;
            return len;
        }
    }
    return 0;
}

int main(void) {
    CURL *curl;
    CURLcode res = CURLE_OK;
    struct curl_slist *recipients = NULL;
    struct upload_status upload_ctx;

    // Текст письма (каждая строка — отдельный элемент)
    const char *payload_text[] = {
        "From: Ваше Имя <youremail@gmail.com>\r\n",
        "To: Получатель <recipient@example.com>\r\n",
        "Subject: Привет из C++!\r\n",
        "\r\n", // пустая строка — разделитель заголовков и тела
        "Это тестовое письмо, отправленное с помощью libcurl на C++.\r\n",
        NULL
    };

    upload_ctx.lines_read = 0;
    upload_ctx.payload_text = payload_text;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if (curl) {
        // Настройка SMTP-сервера Gmail
        curl_easy_setopt(curl, CURLOPT_URL, "smtp://smtp.gmail.com:587");
        curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
        curl_easy_setopt(curl, CURLOPT_USERNAME, "youremail@gmail.com");
        curl_easy_setopt(curl, CURLOPT_PASSWORD, "ваш_пароль_приложения");

        // Указываем отправителя и получателя
        curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "<youremail@gmail.com>");
        recipients = curl_slist_append(recipients, "<recipient@example.com>");
        curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);

        // Передаём функцию для чтения данных письма
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
        curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
        curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);

        // Выполняем отправку
        res = curl_easy_perform(curl);

        if (res != CURLE_OK) {
            fprintf(stderr, "Ошибка отправки: %s\n", curl_easy_strerror(res));
        } else {
            printf("Письмо успешно отправлено!\n");
        }

        // Очистка                    

Рекомендаций