Recientemente he creado una plantilla en línea para crear ofertas de trabajo para nuestro sitio web. Todo está hecho, se formatea correctamente en un navegador y se publica automáticamente en nuestro sitio web, bla bla bla.Envío por correo electrónico de un PDF creado dinámicamente a través de PHP
La última pieza que estoy creando es para darle al administrador algunas opciones para distribuir la publicación en varios lugares (por correo electrónico) de una manera consistente y conveniente. Creé una página PHP que crea un documento PDF sobre la marcha, utilizando la biblioteca TCPDF. Al cargar pdf.php? Id = X, la página muestra un PDF con el contenido de la publicación de trabajo X. Esto significa que nunca guardo el archivo PDF en el servidor, simplemente lo creo sobre la marcha cada vez que se lo llama.
Pero quiero adjuntar este PDF a un correo electrónico, y enviarlo a varias universidades, listas de correo internas, etc. Si adjunto el pdf.php? Id = x al correo electrónico, no se adjunta el PDF, adjunta lo que parece ser un archivo en blanco, con el nombre anterior.
¿Es posible adjuntar esto al correo electrónico sin guardarlo en el servidor?
Debajo se agregó en función de la respuesta de JM4 para más problemas. Puse la creación del archivo PDF en una función y lo puse en un archivo de inclusión, solo para facilitar la administración.
// random hash necessary to send mixed content
$separator = md5(time());
$eol = PHP_EOL;
// attachment name
$filename = "_Desiredfilename.pdf";
include_once('pdf.php');
// encode data (puts attachment in proper format)
$pdfdoc = job_posting_to_pdf($posting_id);
$attachment = chunk_split(base64_encode($pdfdoc));
///////////HEADERS INFORMATION////////////
// main header (multipart mandatory) message
$headers = "From: Sender_Name<[email protected]>".$eol;
//$headers .= "Bcc: [email protected]".$eol;
$headers .= "MIME-Version: 1.0".$eol;
$headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"".$eol.$eol;
$headers .= "Content-Transfer-Encoding: 7bit".$eol;
$headers .= "This is a MIME encoded message.".$eol.$eol;
// message
$headers .= "--".$separator.$eol;
$headers .= "Content-Type: text/html; charset=\"iso-8859-1\"".$eol;
$headers .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$headers .= $message.$eol.$eol;
// attachment
$headers .= "--".$separator.$eol;
$headers .= "Content-Type: application/octet-stream; name=\"".$filename."\"".$eol;
$headers .= "Content-Transfer-Encoding: base64".$eol;
$headers .= "Content-Disposition: attachment".$eol.$eol;
$headers .= $attachment.$eol.$eol;
$headers .= "--".$separator."--";
//Email message
if(mail('[email protected]', 'test job posting', 'message body goes here', $headers)) {
echo 'mail sent';
} else {
echo 'error in email';
}
Aquí es una versión simplificada de pdf.php:
function job_posting_to_pdf($job_id) {
require_once(ROOT . 'assets/libs/tcpdf/config/lang/eng.php');
require_once(ROOT . 'assets/libs/tcpdf/tcpdf.php');
// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('');
$pdf->SetTitle('OPL Job Posting');
$pdf->SetSubject('Job Posting');
$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
// remove default header/footer
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
//set margins
$pdf->SetMargins(11, PDF_MARGIN_TOP, 11);
//set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
//set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
//set some language-dependent strings
$pdf->setLanguageArray($l);
// ---------------------------------------------------------
$pdf->SetFont('times', 'I', 9);
$pdf->AddPage();
$left_cell_width = 60;
$row_height = 6;
$pdf->Image(ROOT . 'assets/gfx/logos/OPL-Logo.jpg', 0, 5, null, 16, null, null, 'N', false, null,'R');
$pdf->Ln('3');
if(!$row['internal']) {
$pdf->Cell(0,0,'This position will be posted internally and externally, concurrently.',0,2,'C');
} else {
$pdf->Cell(0,0,'Internal posting only.',0,2,'C');
}
//Remainder of actual PDF creation removed to keep things simple
return $pdf->Output("", "S");
}
Muéstranos el código (o preferiblemente un esqueleto muy cortado). Parece que el método que está utilizando para convertir la URL en un archivo adjunto es incorrecto. ¿Por qué estás tan preocupado por no escribir un archivo, incluso temporalmente? – symcbean
http://api.joomla.org/com-tecnick-tcpdf/TCPDF.html#methodOutput Estoy usando la opción 'I' para dest. Me pregunto si la opción S es lo que debería estar usando. –
¿Alguna de las respuestas aquí te ayudó? – JM4