SMTP 協定本身不提供已讀回執,但可透過 HTML 郵件嵌入追蹤圖片(Web Beacon),當收件人開信載入圖片時,記錄開信事件。
<img src="track.php?email=user@example.com">track.phptrack.php 記錄資料庫(標記已讀)→ 回傳 1x1 透明 GIF<!-- content.php -->
<table width="555" background="track.php?email=<?=$email?>">
<tr><td>這是測試郵件內容</td></tr>
</table>
<?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');
?>
<?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 透明 GIF | Base64 內嵌,無需實體檔案,最小 43 bytes |
| 背景圖片 vs <img> | background 屬性在某些客戶端不載入,建議雙重保險:<img src="track.php?..." width="1" height="1" style="display:none"> |
| 快取防禦 | 回傳 Cache-Control: no-cache,避免 Proxy 快取導致漏記 |
| 批次發送 | clearAddresses() 必須每次呼叫,否則 PHPMailer 會累積收件人 |
| 隱私合規 | GDPR/個資法要求告知追蹤行為,建議加入退訂連結與隱私政策 |
$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 存在且未讀才記錄
已讀追蹤是電子郵件行銷的標準功能,理解其原理與限制,能正確解讀開信率數據並設計更好的郵件策略。