отправка вложения электронной почты с использованием TCPDF - PullRequest
7 голосов
/ 14 июля 2011

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
//============================================================+

Ответы [ 10 ]

8 голосов
/ 27 сентября 2011

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

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

опция E: вернуть документ как вложенное электронное письмо из mime-части base64 (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)) );

6 голосов
/ 25 июля 2014

Я перепробовал много вариантов.Тот, который работал, был, когда я использовал настройку выходного файла 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`
6 голосов
/ 02 июня 2013
Output($name='yourfilename.pdf', $dest='E')

E - это решение проблемы, с которой вы столкнулись. Вот список возможных значений строки $ dest (Место назначения, куда отправить документ):

  • I: отправить файл в браузер (по умолчанию).
  • D: отправить в браузер и принудительно загрузить файл с именем, указанным по имени.
  • F: сохранить на локальном сервере файл с именем, указанным по имени.
  • S: вернуть документ в виде строки (имя игнорируется).
  • FI: эквивалентно опции F + I
  • FD: эквивалентно опции F + D
  • E: вернуть документ как вложенное электронное вложение из mime-части base64 (RFC 2045)
2 голосов
/ 17 мая 2018
First generate the PDF using tcpdf library.Here is the example for generate PDF:

<?php
    ini_set("display_errors", 1);

    require_once('./TCPDF/tcpdf.php');

    class MYPDF extends TCPDF {
        public function Footer() {
            $this->SetY(-15);
            $this->SetFont('helvetica', 'I', 8);
            $this->Cell(0, 0, 'Product Company - Spider india, Phone : +91 9940179997, TIC : New No.7, Old No.147,Mount Road, Little Mount,Saidapet, Chennai, Tamilnadu,Pin - 600015, India.', 0, 0, 'C');
            $this->Ln();
            $this->Cell(0,0,'www.spiderindia.com - TEL : +91-44-42305023, 42305337  - E : marketing@spiderindia.com', 0, false, 'C', 0, '', 0, false, 'T', 'M');
            $this->Cell(0, 10, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'C', 0, '', 0, false, 'T', 'M');
        }    
    }

    $pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
    $pdf->SetCreator(PDF_CREATOR);
    $pdf->SetAuthor('Manikandan');
    $pdf->SetTitle('Quote');
    $pdf->SetSubject('Quote');
    $pdf->SetKeywords('PDF, Quote');

    $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
    $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
    $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

    $pdf->SetFont('times', '', 15); 

    $pdf->AddPage();

    // create some HTML content
    $now = date("j F, Y");
    $company_name = 'ABC test company';

    $user_name = 'Mr. Manikandan';
    $invoice_ref_id = '2013/12/03';


    $html = '';
    $html .= '<table style="padding-top:25px;">
                <tr>
                    <td colspan="2" align="left"><h4>Kannama & CO</h4></td>
                    <td colspan="2" align="right"><h1 style="color:#6C8BB5;">Quote</h1></td>
                </tr>

                <tr>
                    <td colspan="2" align="left"><table><tr><td>'.$user_name.'</td></tr><tr><td>Mob NO : 9791564278</td></tr></table></td>
                    <td colspan="2" align="right"><table border="1" align="center"><tr><td>Date</td><td>'.$now.'</td></tr><tr><td>Quote</td><td>#0041</td></tr></table></td>
                </tr>

                <tr>
                    <td colspan="2" align="left"><table><tr><td style="background-color: #2B7DB9;color:white;width:75%;">Customer</td></tr><tr><td>Dear senthil kumar,</td></tr><tr><td>39,Jawahar sangam street,Chockalingapuram,Aruppukottai.</td></tr><tr><td><b>Mob no : </b> 9791564821</td></tr></table></td>
                </tr>


             </table>';

    $html .= '<br><br>
              <table border="1" cellpadding="5">
                <tr style="background-color: #2B7DB9;color:white;">
                    <td colspan="4">Quote # Quote 001</td>            
                </tr>
                <tr>
                    <td><b>Product</b></td>
                    <td><b>Quantity</b></td>
                    <td><b>Subtotal</b></td>
                    <td align="right"><b>Amount (Rs.)</b></td>
                </tr>
                <tr style="background-color: #C1E1F8;">
                    <td>Product 1</td>
                    <td>30</td>
                    <td>10</td>
                    <td align="right">300</td>
                </tr>
                <tr>
                    <td>Product 3</td>
                    <td>15</td>
                    <td>3</td>
                    <td align="right">75</td>
                </tr>
                <tr style="background-color: #C0E1F8;">
                    <td>Product 2</td>
                    <td>15</td>
                    <td>3</td>
                    <td align="right">75</td>
                </tr>
                <tr>
                    <td colspan="3" align="right"><b>Sub Total:</b></td>
                    <td align="right"><b> 375</b></td>
                </tr>
                <tr>
                    <td colspan="3" align="right"><b>GST:</b></td>
                    <td align="right"><b> 5</b></td>
                </tr>
                <tr>
                    <td colspan="3" align="right"><b>CGST:</b></td>
                    <td align="right"><b> 10</b></td>
                </tr>
                <tr>
                    <td colspan="3" align="right"><b>Delivery:</b></td>
                    <td align="right"><b> 100</b></td>
                </tr>
                <tr>
                    <td colspan="3" align="right"><b>Total:</b></td>
                    <td align="right"><b> 1000</b></td>
                </tr>
             </table>';

    $html = str_replace('{now}',$now, $html);
    $html = str_replace('{company_name}',$company_name, $html);
    $html = str_replace('{user_name}',$user_name, $html);
    $html = str_replace('{invoice_ref_id}',$invoice_ref_id, $html);

    $pdf->writeHTML($html, true, false, true, false, '');

    $pdf->lastPage();

    $fileName = time() . '.pdf';
    ob_clean();
    $pdf->Output(FCPATH . 'files/' . $fileName, 'F');

    if (file_exists(FCPATH . 'files/' . $fileName)) {
        if (!empty($data->email)) {
            $status = $this->sendReceiptEmail($fileName, $data->email);
            return $status;   
        } else {
            return false;
        }
    } else {
        return false;
    }

    Use PHP Mailer library to send email. Here is the example to send mail with attachment.

    function sendReceiptEmail($fileName, $mailto)
    {
        $file = FCPATH . 'files/' . $fileName;
        date_default_timezone_set('Asia/Kolkata');

        require __DIR__.'/../libraries/phpmailer/PHPMailerAutoload.php';

        $mail = new PHPMailer;

        $mail->SMTPDebug = 0;
        $mail->Debugoutput = 'html';
        $mail->IsSMTP();
        $mail->Host = "xxx.xxx.com";
        $mail->Port = 587;
        $mail->SMTPAuth = true;
        $mail->Username = "info@xxx.com";
        $mail->Password = "xxxxx";
        $mail->setFrom('info@xxx.com', 'Company Quote');
        $mail->addReplyTo('info@xxx.com');
        $mail->addAddress($mailto);
        $mail->Subject = 'Quote';
        $mail->Body = 'Here we attached quote detail.Please find the attachment.';

        $mail->addAttachment($file);

        //send the message, check for errors
        if (!$mail->send()) {
            return false;
        } else {
            $file = FCPATH . 'files/' . $fileName;
            if (file_exists($file)) {
                unlink($file);
            }
            return true;
        }
    }
1 голос
/ 12 июня 2014

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

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;
}
0 голосов
/ 12 июля 2018

Я знаю, что это довольно старый вопрос (поставьте старый!).Но мне удается сделать это так.

function createPDF($html){
    $pdf = new TCPDF();
    $pdf->AddPage();
    $pdf->writeHTML($html, true, false, true, false, '');

    return $pdf->Output('filename.pdf', 'S'); //S: return the document as a string (name is ignored).
}


function sendEmail() {

    $pdf = createPDF('<a>Hello</a>');
    $filename = 'hello.pdf';
    $encoding = 'base64';
    $type = 'application/pdf';

    //using PHPMailer
    $mail->AddStringAttachment($pdf,$filename,$encoding,$type);
}
0 голосов
/ 24 апреля 2018

Используя CodeIgniter и TCPDF, это то, что сработало для меня.

  1. Шаг 1: Сохраните документ на сервере.
  2. Шаг 2:Получите путь к файлу и отправьте путь к файлу в функцию отправки электронной почты.

    <?php
    
    function GenerateQuotation(){
        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('Name of Author');
    
        $pdf->SetTitle('Quotation Request');
    
        $pdf->SetSubject('TCPDF Tutorial');
    
        $pdf->SetKeywords('TCPDF, PDF, example, test, guide');
    
        $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, '', PDF_HEADER_STRING);
    
        $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
        $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
    
        $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
    
        $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
        $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
        $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
    
        $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
    
        $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
    
        $pdf->setLanguageArray($l);
    
        $pdf->setFontSubsetting(true);
    
        $pdf->SetFont('dejavusans', '', 14, '', true);
    
        $pdf->AddPage();
    
        $html = '<span style="font-size:7pt;">' . $_SESSION['content'] . '</span>';
        $html .= <<<EOD
        EOD;
    
        $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $html, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true);       
    
        //Change this according to where you want your document to be uploaded to
        $LocationOnServer = 'C:\wamp64\www\projectname\uploads\invoices/\/'; 
    
        $FileNamePath = $LocationOnServer.'quotation.pdf';
    
        //Save the document to the server
        $QuotationAttachment = $pdf->Output($FileNamePath, 'F');
    
        $EmailAddress = $_SESSION['email'];       
    
        if(!empty($FileNamePath)){
            $this->SendQuotation($EmailAddress,$FileNamePath);
        }
        else{
            print_r('Could not trace file path');
        }             
    
    }
    
    function SendQuotation($EmailAddress,$FileNamePath){
        $Subject = 'My subject here';
        $Message = 'My Email body message here';
    
        $this->email
            ->from('xxxxx@xxxx.com', 'From Who')    
            ->to($EmailAddress) 
            ->subject($Subject)
            ->message($Message);
    
        $this->email->attach($FileNamePath);
        if($this->email->send()){
            print_r('Email Sent');
    
        }else{
            print_r($this->email->print_debugger());
        }
    
    }
    
    
    }
    ?>
    

Вызвать GenerateQuotation(), чтобы сгенерировать предложение и отправить его по электронной почте.

0 голосов
/ 27 февраля 2018

Есть код от tcpdf.php.мы видим, что делает опция E в функции Output.он использует base64_encode & chunk_split, а также добавляет с ним headers, поэтому нет необходимости добавлять заголовки снова.

case 'E': {
            // return PDF as base64 mime multi-part email attachment (RFC 2045)
            $retval = 'Content-Type: application/pdf;'."\r\n";
            $retval .= ' name="'.$name.'"'."\r\n";
            $retval .= 'Content-Transfer-Encoding: base64'."\r\n";
            $retval .= 'Content-Disposition: attachment;'."\r\n";
            $retval .= ' filename="'.$name.'"'."\r\n\r\n";
            $retval .= chunk_split(base64_encode($this->getBuffer()), 76, "\r\n");
            return $retval;
        }

Итак, в приведенном выше вопросе

$attachFile = $pdf->Output('quotation.pdf', 'E');
$html_message = '<p> Your HTML/ Plain message Here </p>' ;
$uid = md5() ;

$header = "From: <user@example.com>\r\n";
$header .= "Reply-to: <user@example.com>\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";

// message & attachment
$nmessage = "--".$uid."\r\n";
$nmessage .= "Content-type:text/html ;charset=UTF-8\r\n";
$nmessage .= $html_message."\r\n\r\n"; //Your message

$nmessage .= "--".$uid."\r\n";
$nmessage .= $attachFile."\r\n\r\n"; //adding Your PDF file
$nmessage .= "--".$uid."--" ;
0 голосов
/ 14 декабря 2015

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

0 голосов
/ 14 декабря 2015

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

Example_054.php.

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

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

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

...