Guía definitiva para enviar correos electrónicos con el cliente PHP de SendGrid

Instalación y configuración rápida

Requisitos del entorno

  • Versión de PHP 7.3, 7.4, 8.0 o 8.1
  • Herramienta de gestión de dependencias Composer
  • Clave API de SendGrid (disponible en el panel de control de SendGrid)

Método de instalación

Instalación mediante Composer:

composer require sendgrid/sendgrid

Opcionalmente, declare la depenedncia en su archivo composer.json:

{
"require": {
"sendgrid/sendgrid": "~7"
}
}

Configuración de la clave API

Establezca la clave API como variable de entorno:

export SENDGRID_API_KEY='SU_CLAVE_API'

Acceda a la clave desde el código PHP:

$claveAPI = getenv('SENDGRID_API_KEY');
$clienteSendGrid = new \SendGrid($claveAPI);

Ejemplo básico de envío de correo

<?php
require 'vendor/autoload.php';
use SendGrid\Mail\Mail;

$correo = new Mail();
$correo->setFrom("test@example.com", "Remitente");
$correo->setSubject("Asunto de prueba");
$correo->addTo("destinatario@example.com", "Destinatario");
$correo->addContent("text/plain", "Contenido en texto plano");
$correo->addContent("text/html", "<strong>Contenido HTML</strong>");

$cliente = new \SendGrid(getenv('SENDGRID_API_KEY'));

try {
$response = $cliente->send($correo);
echo "Código de estado: " . $response->statusCode() . "\n";
echo "Respuesta: " . $response->body() . "\n";
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage() . "\n";
}

Funcionalidades avanzadas

Personalización de correos

$correo = new Mail();
$correo->setFrom("empresa@example.com", "Tu Empresa");

// Destinatarios múltiples
$correo->addTo("cliente1@example.com", "Cliente 1");
$correo->addTo("cliente2@example.com", "Cliente 2");

// Copias y copias ocultas
$correo->addCc("copia@example.com", "Copia");
$correo->addBcc("copiaoculta@example.com", "Copia Oculta");

Envío con archivos adjuntos

$archivoCodificado = base64_encode(file_get_contents('informe.pdf'));
$correo->addAttachment(
$archivoCodificado,
"application/pdf",
"informe.pdf",
"attachment"
);

Plantillas dinámicas

$correo->setTemplateId("d-plantilla-001");
$correo->addDynamicTemplateData("nombre", "Juan Pérez");
$correo->addDynamicTemplateData("pedido", "PED-2023-001");

Configuraciones técnicas

Modo de pruebas (sandbox)

$configuracionCorreo = new MailSettings();
$modoPruebas = new SandBoxMode(true);
$configuracionCorreo->setSandboxMode($modoPruebas);
$correo->setMailSettings($configuracionCorreo);

Seguimiento de interacciones

$seguimiento = new TrackingSettings();

// Seguimiento de clics
$seguimientoClics = new ClickTracking();
$seguimientoClics->setEnable(true);
$seguimiento->setClickTracking($seguimientoClics);

// Seguimiento de aperturas
$seguimientoAperturas = new OpenTracking();
$seguimientoAperturas->setEnable(true);
$seguimiento->setOpenTracking($seguimientoAperturas);

$correo->setTrackingSettings($seguimiento);

Envío masivo de correos

try {
$response = $cliente->client->mail()->batch()->post();
$idLote = json_decode($response->body())->batch_id;

$correo->setBatchId($idLote);
$response = $cliente->send($correo);
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage() . "\n";
}

Prácticas de seguridad

  • Evite almacenar claves API en el código
  • Utilice variables de entorno o servicios de gestión de secretos
  • Valide direcciones de correo con FILTER_VALIDATE_EMAIL
  • Actualice regularmente la biblioteca y sus claves API

Manejo de errores y depuración

try {
$response = $cliente->send($correo);
if ($response->statusCode() >= 200 && $response->statusCode() < 300) {
echo "Correo enviado exitosamente\n";
} else {
echo "Fallo en envío. Código: " . $response->statusCode() . "\n";
echo "Detalles: " . $response->body() . "\n";
}
} catch (\Exception $e) {
echo "Excepción: " . $e->getMessage() . "\n";
}

Optimización de rendimiento

Conexiones persistentes

$opciones = [
'curl' => [
CURLOPT_TCP_KEEPALIVE => 1,
CURLOPT_TCP_KEEPIDLE => 120,
CURLOPT_TCP_KEEPINTVL => 60
]
];
$cliente = new \SendGrid($claveAPI, $opciones);

Envío asíncrono

// Cola de tareas
$cola->push(new TareaCorreo($datosCorreo));

// Procesamiento en segundo plano
class TareaCorreo {
public function handle() {
$cliente = new \SendGrid(getenv('SENDGRID_API_KEY'));
$cliente->send($this->correo);
}
}

Escenarios de uso comunes

Confirmación de rgeistro

$correo = new Mail();
$correo->setFrom("no-responder@app.com", "Mi Aplicación");
$correo->setSubject("Confirme su dirección de correo");
$correo->addTo($emailUsuario, $nombreUsuario);
$correo->addContent("text/html", $this->generarCorreoConfirmacion($usuario, $enlace));

Restablecimiento de contraseña

$correo = new Mail();
$correo->setFrom("soporte@app.com", "Equipo de Soporte");
$correo->setSubject("Solicitud de restablecimiento");
$correo->addTo($emailUsuario);
$correo->addContent("text/html", $this->generarCorreoRestablecer($enlace));

Monitoreo y registro

Estadísticas de envío

$response = $cliente->client->mail()->send()->get();
$estadisticas = json_decode($response->body());
echo "Éxitos: " . $estadisticas->success . "\n";
echo "Errores: " . $estadisticas->errors . "\n";

Integración con sistema de logs

$logger = new Logger('sendgrid');
$logger->pushHandler(new StreamHandler('logs/sendgrid.log', Logger::INFO));

try {
$response = $cliente->send($correo);
$logger->info('Correo enviado', [
'to' => $destinatario,
'id' => $response->headers()['X-Message-Id'] ?? null
]);
} catch (\Exception $e) {
$logger->error('Fallo en envío', [
'to' => $destinatario,
'error' => $e->getMessage()
]);
}

Prácticas recomendadas

  • Almaceen claves API en variables de entorno
  • Valide todas las entradas críticas
  • Use plantillas para mayor eficiencia
  • Implemente manejo de errores y registros
  • Monitoree estadísticas de envío
  • Mantenga actualizada la biblioteca

Etiquetas: PHP sendgrid correo electrónico API Twilio

Publicado el 10-4 09:54