首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHPMailer 郵件已讀追蹤:嵌入圖片信標實作原理與程式碼

     編輯:PHP 綜合知識

SMTP 協定本身不提供已讀回執,但可透過 HTML 郵件嵌入追蹤圖片(Web Beacon),當收件人開信載入圖片時,記錄開信事件。

核心原理

  1. 郵件內容為 HTML,包含 <img src="track.php?email=user@example.com">
  2. 收件人開信 → 郵件客戶端請求圖片 → 觸發 track.php
  3. track.php 記錄資料庫(標記已讀)→ 回傳 1x1 透明 GIF
  4. 發件端查詢資料庫即知誰讀過、何時讀

完整實作程式碼

1. 郵件內容模板

<!-- content.php -->
<table width="555" background="track.php?email=<?=$email?>">
    <tr><td>這是測試郵件內容</td></tr>
</table>

2. 追蹤圖片處理器

<?php
// track.php
$email = $_GET['email'] ?? '';
if ($email) {
    require_once 'db.php';
    $stmt = $pdo->prepare("UPDATE mail_list SET has_read=1, read_time=NOW() WHERE email=?");
    $stmt->execute([$email]);
}

// 回傳 1x1 透明 GIF
header('Content-Type: image/gif');
header('Content-Length: 43');
header('Cache-Control: no-cache, must-revalidate');
echo base64_decode('R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7');
?>

3. 發送邏輯(PHPMailer)

<?php
require 'PHPMailerAutoload.php';

$contacts = [
    'UserA' => 'usera@example.com',
    'UserB' => 'userb@example.com',
];

$mail = new PHPMailer();
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'sender@example.com';
$mail->Password = 'password';
$mail->setFrom('sender@example.com', '系統通知');
$mail->isHTML(true);
$mail->Subject = '測試已讀追蹤';

foreach ($contacts as $name => $email) {
    // 重要:每次迴圈重設收件人,避免累積
    $mail->clearAddresses();
    $mail->addAddress($email, $name);

    // 產生含追蹤圖片的 HTML 內容
    ob_start();
    include 'content.php'; // 內含 track.php?email=...
    $html = ob_get_clean();

    $mail->msgHTML($html);
    $mail->AltBody = '請使用支援 HTML 的郵件客戶端查看';

    if (!$mail->send()) {
        error_log("Mail to $email failed: " . $mail->ErrorInfo);
    } else {
        echo "Sent to $email\n";
    }
}
?>

關鍵技術細節

細節說明
1x1 透明 GIFBase64 內嵌,無需實體檔案,最小 43 bytes
背景圖片 vs <img>background 屬性在某些客戶端不載入,建議雙重保險:<img src="track.php?..." width="1" height="1" style="display:none">
快取防禦回傳 Cache-Control: no-cache,避免 Proxy 快取導致漏記
批次發送clearAddresses() 必須每次呼叫,否則 PHPMailer 會累積收件人
隱私合規GDPR/個資法要求告知追蹤行為,建議加入退訂連結與隱私政策

限制與誤區

  • 無法保證 100% 準確:純文字模式、封鎖圖片、離線閱讀、預覽窗不載入圖片皆會漏記
  • 誤判風險:郵件伺服器預掃描、防毒軟體預載入會產生假陽性
  • 非即時:需收件人主動開信載入圖片

進階:唯一追蹤碼防刷

$token = bin2hex(random_bytes(16));
$stmt = $pdo->prepare("INSERT INTO mail_track (email, token, sent_time) VALUES (?, ?, NOW())");
$stmt->execute([$email, $token]);
// 圖片網址:track.php?token=$token
// track.php 驗證 token 存在且未讀才記錄

已讀追蹤是電子郵件行銷的標準功能,理解其原理與限制,能正確解讀開信率數據並設計更好的郵件策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved