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

Anónimo ha dicho que…
Que tal, muchas veces en algunos servidores tenemos problemas con las clases como phpmailer, ya que los servidores no nos permiten hacer algunos tipos de conexiones. En mi caso recurrí a FPDF y la función mail directamente. Es más laborioso pero igual de efectivo. Me ha funcionado correctamente.
bit ha dicho que…
Hola estoy haciendo esto exactamente con las mismas librerías, pero tengo un problema, cuando son pocos registros me genera el pdf y me lo envía ok, pero el problema es que cuando son unos 7 registros me sale este error:

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.
Reynier ha dicho que…
Pues yo cuando la utilizé no me preocupé mucho de los saltos de página pues estos lo hace actualmente este error que me comentas parece más bien un bug de la propia clase.
Unknown ha dicho que…
No entiendo qué datos se deben poner aquí:

$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
Reynier ha dicho que…
Hola Pedro, son los datos para acceder a tu correo electrónico, la variable From es tu correo, From Name puede estar vacío o es lo que quieres que aparezca en el correo como nombre del remitente. Los otros datos son los datos de acceso y te los debe proveer tu proveedor de servicios de correo.