Envío de email en C++: resumen de bibliotecas y ejemplos prácticos
El envío de correo electrónico es una de las tareas estándar en aplicaciones de servidor y de escritorio. A pesar de que C++ no tiene soporte integrado para trabajar con protocolos de correo, existen varias bibliotecas maduras que permiten integrar el envío de email (incluyendo adjuntos y cifrado TLS/SSL) en su proyecto. En este artículo, analizaremos tres enfoques principales: el uso de libcurl, las bibliotecas VMime y POCO C++ Libraries.
1. Envío de email con libcurl
libcurl es una potente biblioteca multiplataforma para la transferencia de datos a través de varios protocolos, incluyendo SMTP, SMTPS y SMTP con STARTTLS. Forma parte del proyecto cURL y está disponible para prácticamente todos los sistemas operativos.
Instalación de libcurl
En Ubuntu/Debian:
sudo apt-get install libcurl4-openssl-devEn macOS (a través de Homebrew):
brew install curlEn Windows puede descargar DLL precompilados o compilarlo mediante vcpkg.
Ejemplo: correo simple sin adjuntos
El siguiente código se conecta a un servidor SMTP (Gmail SMTP con SSL), se autentica y envía un correo de texto.
#include <iostream>#include <string>#include <curl/curl.h>
int main() { CURL *curl = curl_easy_init(); if (!curl) return 1;
// Configuración SMTP Gmail curl_easy_setopt(curl, CURLOPT_URL, "smtps://smtp.gmail.com:465"); curl_easy_setopt(curl, CURLOPT_USERNAME, "su_email@gmail.com"); curl_easy_setopt(curl, CURLOPT_PASSWORD, "su_contraseña_de_aplicación");
// Datos del correo const char *payload_text = "To: destinatario@example.com\\r" "From: su_email@gmail.com\\r" "Subject: Correo de prueba desde C++\\r" "\\r" "¡Hola! Este correo fue enviado usando libcurl.\\r";
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "su_email@gmail.com"); struct curl_slist *recipients = NULL; recipients = curl_slist_append(recipients, "destinatario@example.com"); curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); curl_easy_setopt(curl, CURLOPT_READDATA, payload_text);
// Envío CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) std::cerr << "Error: " << curl_easy_strerror(res) << std::endl;
curl_slist_free_all(recipients); curl_easy_cleanup(curl); return 0;}Características de libcurl
- Soporte para SMTP, SMTPS (SSL/TLS) y STARTTLS.
- Posibilidad de enviar adjuntos mediante formato MIME (manual o con
curl_mime). - Control de bajo nivel: se redactan manualmente los encabezados y el cuerpo del correo.
- Excelente documentación y soporte de la comunidad.
2. Biblioteca VMime
VMime es una biblioteca especializada de C++ para trabajar con correo electrónico. Proporciona una API de alto nivel para crear, analizar y enviar mensajes con soporte para MIME, adjuntos y todos los protocolos de correo modernos.
Instalación de VMime
Se recomienda compilar desde el código fuente usando CMake:
git clone https://github.com/kisli/vmime.gitcd vmimemkdir build && cd buildcmake .. -DVMIME_BUILD_SAMPLES=ONmake -j4sudo make installPara trabajar con SSL se necesitan las bibliotecas libgsasl y libssl-dev.
Ejemplo: envío de correo con adjunto
#include <vmime/vmime.hpp>#include <iostream>
int main() { try { // Creamos una sesión vmime::shared_ptr<vmime::net::session> session = vmime::net::session::create();
// Configuración del transporte (SMTP con SSL) vmime::shared_ptr<vmime::net::transport> trans