E-Mail-Versand in C++: Überblick über Bibliotheken und praktische Beispiele
Das Versenden von E-Mails ist eine der Kernaufgaben für viele Anwendungen: von Überwachungs- und Benachrichtigungssystemen bis hin zu vollwertigen E-Mail-Clients. Die Sprache C++ bietet keine integrierte Unterstützung für das SMTP-Protokoll, aber es gibt leistungsstarke Drittanbieter-Bibliotheken, die eine einfache Integration des E-Mail-Versands ermöglichen. In diesem Artikel betrachten wir die gängigsten Werkzeuge, ihre Installation und geben funktionierende Codebeispiele.
Hauptmethoden zum Versenden von E-Mails in C++
Es gibt drei Hauptansätze zum Versenden von E-Mails in C++:
- Verwendung von libcurl – die beliebteste und flexibelste Bibliothek. Unterstützt SMTP, SMTP-SSL, SMTP-STARTTLS.
- Verwendung von VMime – eine spezialisierte Bibliothek für die Arbeit mit MIME-Nachrichten, Verschlüsselung und Anhängen.
- Direkte Arbeit mit Sockets – ein Low-Level-Ansatz, der eine manuelle Implementierung des SMTP-Protokolls erfordert.
In dieser Anleitung konzentrieren wir uns auf libcurl als die vielseitigste und am weitesten verbreitete Lösung.
Installation von libcurl
Um mit SMTP über libcurl zu arbeiten, müssen Sie die Bibliothek selbst und ihre Header-Dateien installieren. Beispiele für verschiedene Betriebssysteme:
# Ubuntu / Debiansudo apt-get install libcurl4-openssl-dev
# CentOS / Fedorasudo yum install libcurl-devel
# macOS (über Homebrew)brew install curl
# Windows (über vcpkg)vcpkg install curlStellen Sie sicher, dass Ihr curl-Build die Unterstützung für die Protokolle SMTP und SSL enthält. Überprüfen können Sie dies mit dem Befehl:
curl --version | grep -i smtpEinfaches Beispiel: Senden einer Text-E-Mail
Betrachten wir ein grundlegendes Beispiel für das Senden einer E-Mail über einen Gmail-SMTP-Server mit libcurl. Für einen erfolgreichen Versand benötigen Sie ein App-Passwort (App Password) für Gmail.
#include <stdio.h>#include <string.h>#include <curl/curl.h>
// Struktur zur Übergabe der E-Mail-Datenstruct upload_status { int lines_read; const char **payload_text;};
// Callback-Funktion zum Lesen des E-Mail-Textkörpersstatic 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;
// E-Mail-Text (jede Zeile ist ein separates Element) const char *payload_text[] = { "From: Ihr Name <youremail@gmail.com>\\r", "To: Empfänger <recipient@example.com>\\r", "Subject: Hallo aus C++!\\r", "\\r", // Leerzeile – Trenner zwischen Kopfzeilen und Textkörper "Dies ist eine Test-E-Mail, gesendet mit libcurl in C++.\\r", NULL };
upload_ctx.lines_read = 0; upload_ctx.payload_text = payload_text;
curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init();
if (curl) { // Konfiguration des Gmail-SMTP-Servers 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, "ihr_app_passwort");
// Absender und Empfänger angeben curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "<youremail@gmail.com>"); recipients = curl_slist_append(recipients, "<recipie Auch in der Bibliothek
Überwachung von Go-Anwendungen (Golang): Bibliotheken und Tools
CLI-Frameworks für Go (Golang): Ein vollständiger Überblick über Tools zur Erstellung von Konsolenanwendungen
ORM für Rust: Vergleich von Diesel, SeaORM, SQLx und Codebeispiele