如何为指定ID订单的PHPMailer邮件附加PDF发票
实现邮件附加PDF发票的方案
1. 选择PHP PDF生成库
推荐使用TCPDF或FPDF,两者都是轻量易集成的PHP类库,无需额外扩展支持。以下以TCPDF为例演示实现流程。
2. 核心实现步骤
步骤1:引入PDF库并编写发票生成函数
先将TCPDF下载到项目目录(比如libs/tcpdf/),然后在sendInvoice.php中引入并编写生成PDF的函数,传入订单数据即可生成包含客户信息、产品明细和备注的发票:
// 引入TCPDF类文件 require_once '../libs/tcpdf/tcpdf.php'; function generateInvoicePDF($orderData) { // 初始化PDF对象 $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // 设置文档基础信息 $pdf->SetTitle('订单发票'); $pdf->SetHeaderData('', 0, '家具店订单发票', ''); // 设置中文字体(确保中文正常显示) $pdf->SetFont('stsongstdlight', '', 12); // 添加空白页 $pdf->AddPage(); // 组装发票HTML内容 $html = '<h2>订单发票</h2>'; $html .= '<p><strong>客户姓名:</strong>' . $orderData['customer_name'] . '</p>'; $html .= '<p><strong>客户邮箱:</strong>' . $orderData['customer_email'] . '</p>'; $html .= '<h3>产品明细</h3>'; $html .= '<table border="1" cellpadding="5" width="100%">'; $html .= '<tr><th>产品名称</th><th>数量</th><th>单价</th></tr>'; foreach ($orderData['products'] as $product) { $html .= '<tr>'; $html .= '<td>' . $product['name'] . '</td>'; $html .= '<td align="center">' . $product['quantity'] . '</td>'; $html .= '<td align="right">' . $product['price'] . '</td>'; $html .= '</tr>'; } $html .= '</table>'; $html .= '<p><strong>备注:</strong>' . ($orderData['remark'] ?: '无') . '</p>'; // 将HTML写入PDF $pdf->writeHTML($html, true, false, true, false, ''); // 返回PDF内容字符串('S'参数表示输出为字符串,而非直接下载或保存) return $pdf->Output('', 'S'); }
步骤2:获取订单数据并生成PDF
在sendInvoice.php中,根据订单ID从数据库拉取对应的客户、产品和备注信息(以下为示例,需替换为你的实际数据库查询逻辑):
// 获取订单ID(从URL或表单提交参数中获取) $orderId = $_GET['id'] ?? $_POST['id']; // 模拟从数据库查询到的订单数据 // 实际开发中替换为PDO/MySQLi的查询代码 $orderData = [ 'customer_name' => '张三', 'customer_email' => 'zhangsan@example.com', 'products' => [ ['name' => '北欧布艺沙发', 'quantity' => 1, 'price' => '3299元'], ['name' => '实木圆形茶几', 'quantity' => 1, 'price' => '999元'] ], 'remark' => '请于周六上午送货' ]; // 生成PDF内容字符串 $pdfContent = generateInvoicePDF($orderData);
步骤3:用PHPMailer添加PDF附件并发邮件
将生成的PDF作为附件添加到PHPMailer的邮件中,完成发送:
// 引入PHPMailer相关文件 require '../libs/phpmailer/PHPMailer.php'; require '../libs/phpmailer/SMTP.php'; require '../libs/phpmailer/Exception.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; $mail = new PHPMailer(true); try { // SMTP服务器配置 $mail->SMTPDebug = SMTP::DEBUG_OFF; $mail->isSMTP(); $mail->Host = 'smtp.example.com'; // 你的SMTP服务器地址 $mail->SMTPAuth = true; $mail->Username = 'admin@yourstore.com'; // SMTP账号 $mail->Password = 'your-smtp-password'; // SMTP密码 $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; // 设置发件人和收件人 $mail->setFrom('admin@yourstore.com', '家具店'); $mail->addAddress($orderData['customer_email'], $orderData['customer_name']); // 邮件内容配置 $mail->isHTML(true); $mail->Subject = '您的家具订单发票'; $mail->Body = '您好,附件是您的订单发票,感谢您的选购!'; $mail->AltBody = '您好,附件是您的订单发票,感谢您的选购!'; // 添加PDF附件:使用字符串内容添加,指定文件名 $mail->addStringAttachment($pdfContent, "订单_{$orderId}_发票.pdf", PHPMailer::ENCODING_BASE64, 'application/pdf'); // 发送邮件 $mail->send(); echo '发票邮件已成功发送'; } catch (Exception $e) { echo "邮件发送失败: {$mail->ErrorInfo}"; }
3. 注意事项
- 确保PDF库和PHPMailer的文件路径正确,避免引入报错。
- 若生成的PDF文件较大,建议先保存为服务器临时文件(使用
$pdf->Output("/tmp/invoice_{$orderId}.pdf", 'F')),再通过$mail->addAttachment("/tmp/invoice_{$orderId}.pdf")添加附件,发送完成后记得删除临时文件(unlink("/tmp/invoice_{$orderId}.pdf"))。 - 中文显示异常时,检查TCPDF的字体设置,确保使用支持中文的字体文件。
内容的提问来源于stack exchange,提问作者FurnitureStore
相关产品推荐
相关产品推荐

