You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:57:14