【问题标题】:sending an email attachment using TCPDF使用 TCPDF 发送电子邮件附件
【发布时间】:2011-10-05 02:20:00
【问题描述】:

PHP 我有一个简单的课程申请表,填写后,会向申请人发送一封电子邮件,其中包含他选择的课程的费用报价作为 pdf 附件。

我正在使用 TCPDF,并使用会话变量将数据从表单传递到库。内容为html格式。

PDF 是根据需要生成并作为附件发送的,问题是它是空白的。文档中只有页眉和页脚。在 linux 中尤其如此。在 Windows 中,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
//============================================================+

【问题讨论】:

  • 你确定$_SESSION['content']在php生成的时候不为空吗?

标签: php tcpdf


【解决方案1】:

1.你可以这样做:

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

选项 E:将文档作为 base64 mime 多部分电子邮件附件 (RFC 2045) 返回,我在以下位置找到此信息:tcpdf documentation

之后你只需要做:

$data = chunk_split($fileatt);

并且您的文件已准备好附加到邮件中,因此无需处理文件。只需保留您的标题和其他设置,它就可以完成工作。

2.你可以用F把它保存在你的服务器上,然后得到这样的数据:

$filename = location_on_server."quotation.pdf";

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

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

【讨论】:

  • 不需要$data = chunk_split($fileatt);,因为 TCPDF 已经将数据拆分成块。或许过去并非如此。事实上,在其输出中使用 chunk_split 现在会搞砸了。
  • $filename = 'output.pdf'; $pdfString = $pdf->Output($_SERVER['DOCUMENT_ROOT'].'/path/to/file/'.$filename, 'S');$mail->AddStringAttachment($pdfString, $filename);这是它对我有用的唯一方法。
【解决方案2】:
Output($name='yourfilename.pdf', $dest='E')

E 是解决您遇到的问题的方法。以下是 $dest 字符串的可能值列表(发送文档的目的地):

  • I:将文件内联发送到浏览器(默认)。
  • D:发送到浏览器并强制下载文件名。
  • F:保存到本地服务器文件,名称由 name 给出。
  • S:将文档作为字符串返回(名称被忽略)。
  • FI:相当于F+I选项
  • FD:相当于F+D选项
  • E:将文档作为 base64 mime 多部分电子邮件附件(RFC 2045)返回

【讨论】:

    【解决方案3】:

    我尝试了很多选择。一个有效的方法是当我使用 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`
    

    【讨论】:

      【解决方案4】:
      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;
              }
          }
      

      【讨论】:

      • 请不要仅发布代码答案。继续解释您的解决方案以及您如何解决 OP 的问题。
      【解决方案5】:

      我知道这是个老问题(老老实实说吧!)。但我设法做到了。

      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);
      }
      

      【讨论】:

        【解决方案6】:

        由于官方记录的使用'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;
        }
        

        【讨论】:

          【解决方案7】:

          有来自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."--" ;
          

          【讨论】:

            【解决方案8】:

            按我的方式做还有很多工作,但我想为用户提供输出选项 D:发送到浏览器并强制使用名称给出的名称下载文件,或立即将其保存为 PDF 文件以供使用编辑。

            Example_054.php.

            然后我用 DOMPDF 从 TCPDF 创建了一个相同的表单。

            提交表单后,表单将调用我的提交脚本,提交脚本将访问填充的值,进而填充我相同的 DOMPDF 文档。然后我用新的填充值保存我的 DOMPDF 文档。保存的 DOMPDF 文件现在可以通过 PHPMailer 作为完全填充的 PDF 文件电子邮件附件发送。

            可能有一种更简单的方法可以通过 TCPDF 本身做到这一点,但这完全满足了我的要求。我必须同时学习 DOMPDF 和 TCPDF。

            【讨论】:

              【解决方案9】:

              作为对我上一篇文章的修正,这仅适用于用户选择从浏览器访问 PDF 文件的情况,输出选项 D:Example_054.php。我没有看到任何其他方式将电子邮件作为在浏览器上创建的 PDF 并将其作为实际的 PDF 文件电子邮件附件发送,而无需使用 DOMPDF 重新创建 PDF 并保存填充的 PDF,以便可以将其作为电子邮件附件发送。如果用户选择在填充之前保存 PDF,那么这不是问题,因为填充的文件将存在于附件中。如果有更简单的方法来处理这种情况,请告诉我!!

              【讨论】:

              • 本,将两者结合起来,除非它们是真正不同的答案。只需单击答案下方的编辑链接并进行编辑。并删除第二个答案
              • @Ben 您需要将示例的 href 链接(链接 Example_054.php 文件)添加到您的答案中
              【解决方案10】:

              使用CodeIgniterTCPDF,这对我有用。

              1. 第 1 步:将文档保存在服务器中。
              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()函数生成报价并通过电子邮件发送。

              【讨论】:

                猜你喜欢
                • 2015-12-26
                • 1970-01-01
                • 2016-06-10
                • 1970-01-01
                • 1970-01-01
                • 2016-11-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多