отправка вложения электронной почты с помощью TCPDF

PHP У меня есть простая форма заявки на курс, которая при заполнении электронной почты отправляется заявителю с расценками за курсы, которые он выбрал в качестве вложения pdf.

Я использую TCPDF и передаю данные из формы в библиотеку, используя переменные сеанса. Содержимое находится в формате html.

PDF создается и отправляется в виде вложения по мере необходимости, проблема в том, что он пуст … только верхний и нижний колонтитулы находятся в документе. Это особенно верно в Linux. В окнах документ pdf создается, как ожидается при загрузке. Однако, когда вы нажимаете «просмотр» перед загрузкой документа, отображаются только верхний и нижний колонтитулы.

Вот мой код. Пожалуйста, помогите кому-нибудь. Спасибо.

<?php session_start(); require_once('../config/lang/eng.php'); require_once('../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('Josiah Njuki'); $pdf->SetTitle('Quotation Request'); $pdf->SetSubject('TCPDF Tutorial'); $pdf->SetKeywords('TCPDF, PDF, example, test, guide'); // set default header data $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, '', PDF_HEADER_STRING); // set header and footer fonts $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); // set default monospaced font $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); //set margins $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); $pdf->SetHeaderMargin(PDF_MARGIN_HEADER); $pdf->SetFooterMargin(PDF_MARGIN_FOOTER); //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); // --------------------------------------------------------- // set default font subsetting mode $pdf->setFontSubsetting(true); // Set font // dejavusans is a UTF-8 Unicode font, if you only need to // print standard ASCII chars, you can use core fonts like // helvetica or times to reduce file size. $pdf->SetFont('dejavusans', '', 14, '', true); // Add a page // This method has several options, check the source code documentation for more information. $pdf->AddPage(); // Set some content to print $html = '<span style="font-size:7pt;">' . $_SESSION['content'] . '</span>'; $html .= <<<EOD EOD; // Print text using writeHTMLCell() $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $html, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true); // --------------------------------------------------------- // Close and output PDF document // This method has several options, check the source code documentation for more information. //$pdf->Output('example_001.pdf', 'I'); $doc = $pdf->Output('quotation.pdf', 'S'); //define the receiver of the email $name = "Name goes here"; $email = "jnjuki103@gmail.com"; $to = "$name <{$_SESSION['email']}>"; $from = "John-Smith "; $subject = "Here is your attachment"; $fileatt = $pdf->Output('quotation.pdf', 'S'); //$fileatt = "./test.pdf"; $fileatttype = "application/pdf"; $fileattname = "newname.pdf"; $headers = "From: $from"; $file = fopen($fileatt, 'rb'); $data = fread($file, filesize($fileatt)); fclose($file); $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; $message = "This is a multi-part message in MIME format.\n\n" . "-{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message .= "\n\n"; $data = chunk_split(base64_encode($data)); $message .= "–{$mime_boundary}\n" . "Content-Type: {$fileatttype};\n" . " name=\"{$fileattname}\"\n" . "Content-Disposition: attachment;\n" . " filename=\"{$fileattname}\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n" . "-{$mime_boundary}-\n"; if (mail($to, $subject, $message, $headers)) { echo "The email was sent."; } else { echo "There was an error sending the mail."; } //============================================================+ // END OF FILE //============================================================+ 

1.Вы можете сделать это, используя:

$fileatt = $pdf->Output('quotation.pdf', 'E');

вариант E: вернуть документ в виде вложения base64 mime с несколькими частями (RFC 2045), я нашел эту информацию по: документации tcpdf

после этого вам нужно только сделать:

$data = chunk_split($fileatt);

и ваш файл готов к присоединению к почте, нет необходимости работать с файлами. Просто держите заголовки и другие настройки, и он будет выполнять эту работу.

или

2. вы можете использовать F, чтобы сохранить его на своем сервере, а затем получить данные следующим образом:

$filename = location_on_server."quotation.pdf";

$fileatt = $pdf->Output($filename, 'F');

$data = chunk_split( base64_encode(file_get_contents($filename)) );

 Output($name='yourfilename.pdf', $dest='E') 

E – решение задачи u. Ниже приведено описание возможных значений строки $ dest (Назначение, куда отправить документ):

  • I : отправьте файл inline в браузер (по умолчанию).
  • D : отправить в браузер и принудительно загрузить файл с именем, указанным по имени.
  • F : сохранить файл локального сервера с именем, указанным по имени.
  • S : вернуть документ в виде строки (имя игнорируется).
  • FI : эквивалентно опции F + I
  • FD : эквивалентно опции F + D
  • E : верните документ в качестве базового сообщения электронной почты base64 mime (RFC 2045)

Я попробовал много вариантов. Тот, с которым работал, был, когда я использовал настройку выхода tcpdf, установленную в «F», чтобы сохранить ее в папке. Включил файлы phpmailer и использовал приведенный ниже код.

 $pdf->Output("folder/filename.pdf", "F"); //save the pdf to a folder setting `F` require_once('phpmailer/class.phpmailer.php'); //where your phpmailer folder is $mail = new PHPMailer(); $mail->From = "email.com"; $mail->FromName = "Your name"; $mail->AddAddress("email@yahoo.com"); $mail->AddReplyTo("email@gmail.com", "Your name"); $mail->AddAttachment("folder/filename.pdf"); // attach pdf that was saved in a folder $mail->Subject = "Email Subject"; $mail->Body = "Email Body"; if(!$mail->Send()) { echo "Message could not be sent. <p>"; echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message sent"; } //`the end` 

Поскольку официально документированный метод с использованием 'S' или 'E' вернул null для меня, я пошел вперед и использовал проверенный тестовый трюк выходного буфера, например:

 protected function PDF_string($pdf, $base64 = false) { ob_start(); $pdf->Output('file.pdf', 'I'); $pdf_data = ob_get_contents(); ob_end_clean(); return ($base64) ? base64_encode($pdf_data) : $pdf_data; } 

Его гораздо больше работы, чтобы сделать это по-своему, но я хотел дать пользователю вариант вывода D: отправить в браузер и принудительно загрузить файл с именем, указанным по имени, или сохранить его немедленно в виде файла PDF, готового для редактирования.

Example_054.php.

Затем я создал идентичную форму из TCPDF с DOMPDF.

После того, как форма будет отправлена, форма вызовет мой сценарий отправки, и сценарий отправки получит доступ к заполненным значениям и, в свою очередь, заполнит мой идентичный документ DOMPDF. Затем я сохраняю документ DOMPDF с его новыми значениями. Сохраненный файл DOMPDF теперь можно отправить по электронной почте через PHPMailer в виде полностью заполненного файла электронной почты в формате PDF.

Вероятно, был более простой способ сделать это через TCPDF, но это полностью удовлетворило мои требования. И я должен одновременно изучить DOMPDF вместе с TCPDF.

В качестве дополнения к моему последнему сообщению это ТОЛЬКО применяется, если пользователь выбирает доступ к файлу PDF из браузера, Output Option D: Example_054.php. Я не видел другого способа отправки по электронной почте в виде PDF-файла, созданного в браузере, и отправлял его в качестве фактического вложения в PDF-файл PDF без повторного создания PDF-файла с DOMPDF и сохранения заполненного PDF-файла, чтобы он мог быть отправлен затем в виде вложения электронной почты. Если пользователь выбирает сохранить PDF перед заполнением, то это не проблема, поскольку заполненный файл будет существовать для вложения. Если есть более простой способ справиться с этим сценарием, пожалуйста, дайте мне знать!