Enviar archivos PDF creados dinámicamente
Gracias a las clases DOMPDF y PHPMailer podemos crear un archivo PDF dinámicamente y enviarlo como adjunto en un correo electrónico. Actualmente el método que utilizo es crear el archivo PDF, adjuntarle al mail y borrarlo. Reconozco que lo ideal sería crear el archivo en memoria y enviarlo así evitamos tener que crearlo y borrarlo, pero aún no he encontrado una función que me tome al archivo como cadena lo convierta en un documento sin crearlo físicamente en el disco duro, o sea que sea todo
temporal; por ello si alguien lo sabe que lo comparta.
// incluyo las dos clases dompdf y php mailer
include_once '../class/class.phpmailer.php';
include_once '../dompdf/dompdf_config.inc.php';
// creo el objeto phpmailer
$mail = new phpmailer();
// asigno el envío por SMTP mucho más rápido y fiable
$mail->Mailer = "smtp";
// mi servidor requiere autentificación
$mail->SMTPAuth = true;
// utilizo constantes almacenadas fuera del script para darle más seguridad a los datos, aparte de así poder reutilizar los mismos
$mail->Username = USERNAME_CORREO;
$mail->Host = HOST_CORREO;
$mail->Password = PASSW_CORREO;
$mail->From = REMITENTE_EMAIL;
$mail->FromName = REMITENTE;
// aumentar el timeout es recomendable si estas en un hosting gratuito
$mail->Timeout=30;
// creo el objeto DOMPDF
$dompdf = new DOMPDF();
$dompdf->set_paper('a4','landscape');
$dompdf->load_html($cuerpo_mensaje);
$dompdf->render();
$nombre_archivo = "miarchivo.pdf";
if (!$gestor = fopen($nombre_archivo, 'w')) {
echo "No se puede abrir el archivo ($nombre_archivo)";
exit;
}
if (fwrite($gestor, $dompdf->output()) === FALSE) {
echo "No se puede escribir al archivo ($nombre_archivo)";
exit;
}
echo "Éxito, se escribió al archivo ($nombre_archivo)";
fclose($gestor);
// las siguientes 2 lineas son imprescindibles si envias varios correos a la vez, por ejemplo dentro de un bucle while, así garantizas que solo se envíe este fichero al recipiente de correo destinatario
$mail->ClearAllRecipients();
$mail->ClearAttachments();
// añado el usuario de destino y otras configuraciones
$mail->AddAddress($usuario_obj->email);
$mail->Subject = "Prueba de phpmailer";
$mail->Body = $cuerpo_mensaje;
// nombre_adjunto es el nombre que verá el usuario cuando reciba el mail como nombre del archivo
$mail->AddAttachment($nombre_archivo,"nombre_adjunto.pdf");
// texto alternativo por si el usuario no admite html
$mail->AltBody = "Mensaje de prueba mandado con phpmailer en formato solo texto";
$exito = $mail->Send();
// borro el fichero real
unlink($nombre_archivo);
if(!$exito){
echo "Problemas enviando correo electrónico";
echo "
".$mail->ErrorInfo;
}
else
echo "Mensaje enviado correctamente";
Fin del código!!!!
Comentarios
Fatal error: Uncaught exception 'DOMPDF_Internal_Exception' with message 'Frame not found in cellmap'
Sabes si hay algo para que te lo ponga en varias páginas, que creo que es el problema. gracias saludos.
$mail->Username = USERNAME_CORREO;
$mail->Host = HOST_CORREO;
$mail->Password = PASSW_CORREO;
$mail->From = REMITENTE_EMAIL;
$mail->FromName = REMITENTE;
¿Será que me explcias con un ejemplo?
Gracias