En este post te mostraré cómo enviar un correo electrónico con adjunto en PHP, es decir, adjuntar un archivo a un correo electrónico que se enviará con PHP.
Para lograrlo vamos a usar la librería phpmailer; verás que es realmente sencillo y que no afecta en nada.
Instalación de phpmailer
Comenzamos instalando phpmailer en nuestro proyecto usando composer. Si no tienes un proyecto, por favor mira cómo comenzar con composer.
En caso de que ya uses composer o hayas seguido el tutorial que mencioné, ejecuta:
composer require phpmailer/phpmailer
Eso va a descargar la librería. Después, incluye el autoload en caso de que no sea incluido antes:
include "vendor/autoload.php";
Con eso estamos listos.
El servidor de correo de pruebas y el archivo
Para depurar de manera local, si usas Windows puedes usar la aplicación de smtp4dev para probar el envío de correos con PHP.
El archivo que enviaré adjunto con PHP será una factura PDF.
Enviar correo electrónico con adjunto en PHP
Es momento de preparar el correo. Voy a hacerlo simple, pero si quieres profundizar más en el tema, mira la documentación de phpmailer.
El código es tan simple como lo siguiente:
<?php
include_once "vendor/autoload.php";
use PHPMailer\PHPMailer\PHPMailer;
$phpMailer = new PHPMailer;
# Puede ser ruta relativa o absoluta
$nombreDelDocumento = "factura.pdf";
if (!file_exists($nombreDelDocumento)) {
exit("El archivo $nombreDelDocumento no existe");
}
try {
$phpMailer->setFrom("AQUÍ VA EL CORREO DEL REMITENTE", "AQUÍ VA EL REMITENTE"); # Correo y nombre del remitente
$phpMailer->addAddress("AQUÍ VA EL CORREO DEL DESTINATARIO"); # El destinatario
$phpMailer->Subject = "Archivo adjunto"; # Asunto
$phpMailer->Body = "Hola, amigo. Estamos probando los archivos adjuntos."; # Cuerpo en texto plano
// Aquí la magia:
$phpMailer->addAttachment($nombreDelDocumento);
if (!$phpMailer->send()) {
echo "Error enviando correo: " . $phpMailer->ErrorInfo;
}
# Opcionalmente podrías eliminar el archivo después de enviarlo, si quieres
// if (file_exists($nombreDelDocumento)) {
// unlink($nombreDelDocumento);
// }
echo "Enviado correctamente";
} catch (Exception $e) {
echo "Excepción: " . $e->getMessage();
}
Iniciamos incluyendo el autoload e indicando que vamos a usar el namespace de PHPMailer. Después definimos algunas variables, entre ellas el nombre del archivo que se adjunta.
En la línea 17 a la línea 20 configuramos cosas del correo como el remitente, destinatario, asunto, y cuerpo.
El archivo se adjunta en la línea 22, si quieres, puedes invocar al método addAttachment
varias veces para adjuntar varios archivos.
Se envía el correo en la línea 23 y al mismo tiempo se comprueba si hay un error. Todo lo anteriormente mencionado está dentro de un try catch para manejar las excepciones.
Si llegamos a la línea 30 es que todo está correcto y el correo se ha enviado.
Probando código para enviar correo electrónico con adjunto en PHP
Así que al ejecutar el script ya sea desde la terminal o con apache obtengo una salida exitosa. Si voy al servidor de correo de pruebas obtengo lo siguiente:
Problemas al enviar correos
Si tienes un problema verifica dos cosas:
- Que tu servidor tenga un servidor de correos (la mayoría lo tienen y si no, es fácil instalarlo. Además, phpmailer tiene uno integrado)
- Que tu dominio no sea marcado como spam y que tus mensajes tampoco lo sean. Esto es un poco complejo y depende de la reputación de tu web así como del contenido de los mensajes; si tu dominio no tiene buena reputación entonces no importa desde cuál lenguaje se envíe, el mensaje se irá a la bandeja de spam.
En el peor de los casos (y la mayoría) el correo se irá a spam.
Conclusión
Si quieres explorar el código completo o descargarlo, dejo el enlace del repositorio de GitHub.
También te invito a ver un ejemplo de formulario de contacto con PHP en donde se usa mail.