Envío de Email en C++: resumen de bibliotecas y ejemplos prácticos
El envío de correos electrónicos es una de las tareas clave para muchas aplicaciones: desde sistemas de monitoreo y notificaciones hasta clientes de correo completos. El lenguaje C++ no tiene soporte incorporado para el protocolo SMTP, pero existen potentes bibliotecas de terceros que permiten integrar fácilmente el envío de email. En este artículo, revisaremos las herramientas más populares, su instalación y proporcionaremos ejemplos de código funcionales.
Formas principales de enviar Email en C++
Existen tres enfoques principales para enviar correos en C++:
- Uso de libcurl — la biblioteca más popular y flexible. Soporta SMTP, SMTP-SSL, SMTP-STARTTLS.
- Uso de VMime — biblioteca especializada para trabajar con mensajes MIME, cifrado y archivos adjuntos.
- Trabajo directo con sockets — enfoque de bajo nivel que requiere implementación manual del protocolo SMTP.
En esta guía nos centraremos en libcurl como la solución más versátil y ampliamente utilizada.
Instalación de libcurl
Para trabajar con SMTP a través de libcurl, necesitará instalar la biblioteca y sus archivos de cabecera. Ejemplos para diferentes sistemas operativos:
# Ubuntu / Debiansudo apt-get install libcurl4-openssl-dev
# CentOS / Fedorasudo yum install libcurl-devel
# macOS (a través de Homebrew)brew install curl
# Windows (a través de vcpkg)vcpkg install curlAsegúrese de que su compilación de curl incluya soporte para los protocolos SMTP y SSL. Puede verificarlo con el comando:
curl --version | grep -i smtpEjemplo simple: envío de un correo de texto
Veamos un ejemplo básico de envío de email a través del servidor SMTP de Gmail usando libcurl. Para un envío exitoso, necesitará una contraseña de aplicación (App Password) para Gmail.
#include <stdio.h>#include <string.h>#include <curl/curl.h>
// Estructura para transmitir datos del correostruct upload_status { int lines_read; const char **payload_text;};
// Función de callback para leer el cuerpo del correostatic 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;
// Texto del correo (cada línea es un elemento separado) const char *payload_text[] = { "From: Su Nombre <youremail@gmail.com>\\r", "To: Destinatario <recipient@example.com>\\r", "Subject: ¡Saludos desde C++!\\r", "\\r", // línea vacía — separador entre encabezados y cuerpo "Este es un correo de prueba enviado con libcurl en 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) { // Configuración del servidor SMTP de 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, "su_contraseña_de_aplicación");
// Especificamos el remitente y el destinatario curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "<youremail@gmail.com>"); recipients = curl_slist_append(recipients, "<recipie También en la biblioteca
Generación de informes PDF en Go: revisión de bibliotecas y ejemplos de código
Trabajo con Kafka en PHP: bibliotecas, conexión y ejemplos de código
Symfony/Validator PHP: guía completa con ejemplos prácticos