本文目录导读:

我来为您详细介绍如何在PHP项目中实现邮件打开与点击跟踪功能。
邮件打开跟踪(像素跟踪)
基本原理
使用1x1像素的透明图片,当用户加载图片时触发服务器请求。
实现代码
创建跟踪像素PHP文件
<?php
// track_open.php
// 记录邮件打开
function trackEmailOpen($email_id, $recipient_email) {
// 数据库连接
$db = new PDO('mysql:host=localhost;dbname=email_tracking', 'username', 'password');
// 记录打开信息
$stmt = $db->prepare("INSERT INTO email_opens
(email_id, recipient_email, ip_address, user_agent, opened_at)
VALUES (?, ?, ?, ?, NOW())");
$stmt->execute([
$email_id,
$recipient_email,
$_SERVER['REMOTE_ADDR'],
$_SERVER['HTTP_USER_AGENT']
]);
}
// 获取参数
$email_id = $_GET['email_id'] ?? null;
$recipient = $_GET['recipient'] ?? null;
if ($email_id && $recipient) {
trackEmailOpen($email_id, base64_decode($recipient));
}
// 返回1x1透明GIF图片
header('Content-Type: image/gif');
header('Content-Length: 43');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
// 1x1透明像素GIF
echo base64_decode('R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7');
exit;
在邮件中嵌入跟踪像素
<?php
// 发送邮件时添加跟踪像素
function sendTrackedEmail($to, $subject, $htmlBody, $emailId) {
$trackingPixel = sprintf(
'<img src="https://yourdomain.com/track_open.php?email_id=%s&recipient=%s"
width="1" height="1" style="display:none;" />',
$emailId,
base64_encode($to)
);
// 在邮件底部添加跟踪像素
$htmlBody .= $trackingPixel;
// 发送邮件
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=UTF-8\r\n";
mail($to, $subject, $htmlBody, $headers);
}
点击跟踪实现
基本原理
将所有链接替换为跟踪链接,用户点击后先跳转到跟踪服务器,再重定向到目标URL。
创建跟踪链接生成器
<?php
// click_tracker.php
function generateTrackingLink($originalUrl, $emailId, $recipient, $linkId) {
$params = http_build_query([
'url' => base64_encode($originalUrl),
'email_id' => $emailId,
'recipient' => base64_encode($recipient),
'link_id' => $linkId
]);
return "https://yourdomain.com/redirect.php?" . $params;
}
// 替换邮件中的链接
function replaceLinksWithTracking($htmlBody, $emailId, $recipient) {
$linkId = 0;
return preg_replace_callback(
'/<a\s+(?:[^>]*?\s+)?href="([^"]*)"/i',
function($matches) use ($emailId, $recipient, &$linkId) {
$originalUrl = $matches[1];
$linkId++;
$trackingUrl = generateTrackingLink(
$originalUrl,
$emailId,
$recipient,
$linkId
);
return str_replace($matches[1], $trackingUrl, $matches[0]);
},
$htmlBody
);
}
点击重定向处理
<?php
// redirect.php
function trackClick($emailId, $recipient, $linkId, $targetUrl) {
$db = new PDO('mysql:host=localhost;dbname=email_tracking', 'username', 'password');
$stmt = $db->prepare("INSERT INTO email_clicks
(email_id, recipient_email, link_id, target_url, ip_address, user_agent, clicked_at)
VALUES (?, ?, ?, ?, ?, ?, NOW())");
$stmt->execute([
$emailId,
$recipient,
$linkId,
$targetUrl,
$_SERVER['REMOTE_ADDR'],
$_SERVER['HTTP_USER_AGENT']
]);
}
// 获取并验证参数
$targetUrl = base64_decode($_GET['url'] ?? '');
$emailId = $_GET['email_id'] ?? null;
$recipient = base64_decode($_GET['recipient'] ?? '');
$linkId = $_GET['link_id'] ?? null;
if ($targetUrl && $emailId && $recipient && $linkId) {
trackClick($emailId, $recipient, $linkId, $targetUrl);
// 重定向到原始URL
header('Location: ' . $targetUrl, true, 302);
exit;
}
// 无效参数时重定向到首页
header('Location: https://yourdomain.com');
exit;
数据库表结构
-- 邮件发送记录表
CREATE TABLE email_sends (
id INT PRIMARY KEY AUTO_INCREMENT,
campaign_id VARCHAR(50),
recipient_email VARCHAR(255),
subject VARCHAR(255),
sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 邮件打开记录表
CREATE TABLE email_opens (
id INT PRIMARY KEY AUTO_INCREMENT,
email_id INT,
recipient_email VARCHAR(255),
ip_address VARCHAR(45),
user_agent TEXT,
opened_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (email_id) REFERENCES email_sends(id)
);
-- 邮件点击记录表
CREATE TABLE email_clicks (
id INT PRIMARY KEY AUTO_INCREMENT,
email_id INT,
recipient_email VARCHAR(255),
link_id INT,
target_url TEXT,
ip_address VARCHAR(45),
user_agent TEXT,
clicked_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (email_id) REFERENCES email_sends(id)
);
完整发送邮件示例
<?php
// 发送跟踪邮件完整示例
function sendCampaignEmail($to, $subject, $htmlContent) {
// 1. 创建邮件发送记录
$emailId = createEmailSendRecord($to, $subject);
// 2. 替换链接为跟踪链接
$trackedContent = replaceLinksWithTracking($htmlContent, $emailId, $to);
// 3. 添加跟踪像素
$trackedContent .= sprintf(
'<img src="https://yourdomain.com/track_open.php?email_id=%s&recipient=%s"
width="1" height="1" style="display:none;" />',
$emailId,
base64_encode($to)
);
// 4. 发送邮件
$headers = [
'MIME-Version: 1.0',
'Content-type: text/html; charset=UTF-8',
'From: Your Company <noreply@yourdomain.com>',
'X-Mailer: PHP/' . phpversion()
];
return mail($to, $subject, $trackedContent, implode("\r\n", $headers));
}
注意事项
隐私考虑
- 遵守GDPR等相关法规
- 在邮件底部添加退订链接
- 提供隐私政策说明
技术限制
- 用户关闭图片加载时无法跟踪打开
- 某些邮件客户端会缓存图片
- 需要HTTPS加密传输
性能优化
- 使用CDN加速跟踪像素加载
- 异步记录跟踪数据
- 定期清理过期跟踪记录
使用PHP库简化实现
# 使用Composer安装 composer require maileon/maileon-tracking composer require snowplow/snowplow-tracker
这个实现方案提供了完整的邮件跟踪功能,包括打开和点击跟踪,根据您的具体需求,可以进行调整和优化。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播