Cómo enviar email transaccional en PHP (guía 2026)
Enviar un correo desde PHP es fácil. Que ese correo llegue a la bandeja de entrada y no a spam es lo difícil. Esta guía te lleva del enfoque antiguo (mail()) a la forma correcta en 2026.
El problema de mail() y SMTP casero
La función mail() de PHP entrega el mensaje al servidor local y se desentiende. No firma con DKIM, no alinea SPF, no gestiona rebotes ni quejas, y en hostings compartidos el puerto 25 suele estar bloqueado. Resultado: tus correos de registro y recuperación de contraseña no llegan, y ni te enteras.
Montar tu propio servidor SMTP tampoco resuelve el problema de fondo: la reputación de IP. Una IP nueva o compartida sin historial va directa a la carpeta de spam de Gmail y Outlook.
La forma correcta: una API de email transaccional
Un proveedor de email transaccional se encarga de la reputación, la firma DKIM, la supresión de rebotes y el seguimiento de entregas. Tú solo haces una llamada HTTP. Con una API como la de Zend24 el envío queda así:
// Enviar un email con cURL (sin dependencias) $ch = curl_init("https://zend24.com/api/v1/emails"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer sk_live_TU_API_KEY", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode([ "from" => "Facturación <facturas@tudominio.com>", "to" => "cliente@ejemplo.com", "subject" => "Tu factura de octubre", "html" => "<h1>Gracias por tu compra</h1>", ]), ]); $res = json_decode(curl_exec($ch), true); echo $res["id"]; // 01J2ZK7QW9...
Sin librerías, sin Composer, sin configurar SMTP. La respuesta incluye un id con el que puedes consultar el estado (entregado, rebotado, abierto) o recibir webhooks firmados en tiempo real.
Paso a paso
- Verifica tu dominio. Añades unos registros DNS (DKIM, SPF, DMARC) una sola vez. Con Zend24 puedes conectar Cloudflare, OVH o GoDaddy y se crean solos.
- Crea una API key. Usa
sk_test_para desarrollar sin enviar nada real, ysk_live_en producción. - Envía. Una petición POST a
/api/v1/emailscomo la de arriba. - Escucha eventos. Configura un webhook para reaccionar a rebotes y quejas, y limpiar tu lista.
Plantillas y variables
No metas el HTML en el código. Guarda la plantilla una vez y envía solo las variables:
{
"from": "App <noreply@tudominio.com>",
"to": "ana@ejemplo.com",
"template": "bienvenida",
"variables": { "nombre": "Ana" }
}El escapado de variables es automático para evitar inyección de HTML.
Checklist de entregabilidad
- Dominio verificado con DKIM y SPF alineados.
- Registro DMARC publicado (empieza con
p=noney sube aquarantine). - Un
From:de tu propio dominio, nunca@gmail.com. - Cabecera
List-Unsubscribecuando aplique. - Gestión de rebotes y supresión automática.
Si quieres entender el porqué de DKIM, SPF y DMARC, lee nuestra guía sobre autenticación de email.
Zend24 es una API de email transaccional con infraestructura europea, DKIM automático y 3.000 emails gratis al mes. Crea tu cuenta gratis y envía tu primer correo en 10 segundos.
Preguntas frecuentes
¿Puedo usar la función mail() de PHP en producción?
No es recomendable. mail() no firma con DKIM, no gestiona rebotes ni reintentos y suele acabar en spam o bloqueada por el proveedor de hosting. Para producción usa una API o SMTP autenticado de un proveedor con buena reputación.
¿Qué diferencia hay entre email transaccional y de marketing?
El transaccional lo dispara una acción del usuario (registro, factura, recuperación de contraseña) y va a una persona. El de marketing es masivo y promocional. Se envían por rutas y reputaciones distintas: mézclarlos daña la entregabilidad de los importantes.