Отправка email на C++: libcurl и SMTP-клиенты

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

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

Начать курс

Отправка email на C++: обзор библиотек и инструментов

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

Почему C++ для отправки email?

C++ даёт полный контроль над сетевыми соединениями, производительностью и памятью. Однако стандартная библиотека C++ не содержит встроенных средств для работы с почтовыми протоколами (SMTP, POP3, IMAP). Поэтому разработчики используют либо сторонние библиотеки, либо реализуют протокол вручную через сокеты. Мы сосредоточимся на готовых решениях, которые экономят время и обеспечивают стабильность.

Основные библиотеки для отправки email на C++

  • libcurl — самая популярная кроссплатформенная библиотека для передачи данных. Поддерживает SMTP, SMTP с SSL/TLS, аутентификацию и MIME-вложения.
  • VMime — специализированная библиотека для работы с email. Полная поддержка MIME, шифрования S/MIME, кастомных заголовков и всех почтовых протоколов.
  • c-icap и libESMTP — более низкоуровневые библиотеки, ориентированные на SMTP-сессии.
  • Boost.Asio + собственная реализация SMTP — для тех, кто хочет минимум зависимостей и готов писать протокол вручную.

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

Установка libcurl

Для начала работы с libcurl её необходимо установить:

  • Linux (Ubuntu/Debian): sudo apt install libcurl4-openssl-dev
  • macOS: brew install curl
  • Windows: скачайте предварительно собранные бинарники с официального сайта или используйте vcpkg: vcpkg install curl

Пример 1: Отправка простого email через Gmail (SSL)

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

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

int main(void) {
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

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

        // Отправитель и получатель
        curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "<ваш.email@gmail.com>");
        struct curl_slist *recipients = NULL;
        recipients = curl_slist_append(recipients, "<получатель@example.com>");
        curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);

        // Текст письма
        const char *payload_text = 
            "From: Ваше Имя <ваш.email@gmail.com>\r\n"
            "To: Получатель <получатель@example.com>\r\n"
            "Subject: Тестовое письмо из C++\r\n"
            "\r\n"
            "Привет! Это письмо отправлено с помощью libcurl на C++.\r\n";

        curl_easy_setopt(curl, CURLOPT_READDATA, payload_text);
        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");

        curl_slist_free_all(recipients);
        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();
    return 0;
}

Важно: Для Gmail используйте пароль приложения, а не основной пароль. Включите двухфакторную аутентификацию в настройках аккаунта.

Пример 2: Отправка письма с вложением (MIME)

libcurl поддерживает MIME-сообщения. Создадим письмо с текстом и файлом.

#include <curl/curl.h>                    

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