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

如何用PHP检测已发邮件是否被打开及获取浏览器、系统信息

Hey there! Implementing email open tracking with PHP is totally doable, and it mostly relies on the classic 1x1 pixel tracking method. Let's walk through how to build this, including capturing user agent details and setting up stats reporting.

Core Principle: Pixel Tracking

When an email client loads external content (like images), it sends a request to the server hosting that content. We can leverage this by embedding a tiny, transparent 1x1 GIF in our emails—when the image loads, our PHP script will log the request details, which tells us the email was opened.

Step-by-Step Implementation

1. Build the Tracking Pixel Script (track.php)

This script will serve the transparent pixel and log all relevant data to a database. We'll capture the email's unique ID, timestamp, IP address, user agent, and parse the OS/browser from the user agent string.

<?php
// Serve a 1x1 transparent GIF
header('Content-Type: image/gif');
header('Content-Length: 42');
echo base64_decode('R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==');

// Initialize tracking data
$trackingData = [
    'email_id' => $_GET['email_id'] ?? 'unknown', // Unique ID for the sent email
    'opened_at' => date('Y-m-d H:i:s'),
    'ip_address' => $_SERVER['REMOTE_ADDR'],
    'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? 'unknown',
    'os' => 'unknown',
    'browser' => 'unknown'
];

// Parse OS from User Agent
$ua = $trackingData['user_agent'];
if (preg_match('/Windows/', $ua)) $trackingData['os'] = 'Windows';
elseif (preg_match('/Mac OS X/', $ua)) $trackingData['os'] = 'Mac OS X';
elseif (preg_match('/Linux/', $ua)) $trackingData['os'] = 'Linux';
elseif (preg_match('/Android/', $ua)) $trackingData['os'] = 'Android';
elseif (preg_match('/iOS/', $ua)) $trackingData['os'] = 'iOS';

// Parse Browser from User Agent
if (preg_match('/Chrome/', $ua)) $trackingData['browser'] = 'Chrome';
elseif (preg_match('/Firefox/', $ua)) $trackingData['browser'] = 'Firefox';
elseif (preg_match('/Safari/', $ua)) $trackingData['browser'] = 'Safari';
elseif (preg_match('/Edge/', $ua)) $trackingData['browser'] = 'Edge';
elseif (preg_match('/Opera/', $ua)) $trackingData['browser'] = 'Opera';

// Save data to MySQL (create this table first!)
// CREATE TABLE email_tracking (
//     id INT AUTO_INCREMENT PRIMARY KEY,
//     email_id VARCHAR(255) NOT NULL,
//     opened_at DATETIME NOT NULL,
//     ip_address VARCHAR(45) NOT NULL,
//     user_agent TEXT NOT NULL,
//     os VARCHAR(50) NOT NULL,
//     browser VARCHAR(50) NOT NULL
// );

$db = new PDO("mysql:host=localhost;dbname=your_db;charset=utf8mb4", 'your_user', 'your_pass');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $db->prepare("INSERT INTO email_tracking (email_id, opened_at, ip_address, user_agent, os, browser) VALUES (:email_id, :opened_at, :ip_address, :user_agent, :os, :browser)");
$stmt->execute($trackingData);

exit;
?>

2. Embed the Tracking Pixel in Your Sent Emails

When sending HTML emails, add an invisible image tag pointing to track.php, with a unique email_id to identify which email was opened.

<?php
// Example email sending script
$to = 'customer@example.com';
$subject = 'Your Monthly Update';
$uniqueEmailId = uniqid('track_'); // Generate a unique ID for this email

$htmlMessage = '
<html>
<body>
    <p>Hi there, here\'s your monthly update!</p>
    <!-- Invisible tracking pixel -->
    <img src="https://your-domain.com/track.php?email_id=' . $uniqueEmailId . '" 
         width="1" height="1" style="display:none;" alt="" />
</body>
</html>
';

// Set email headers for HTML content
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: Your Company <noreply@your-domain.com>\r\n";

// Send the email
mail($to, $subject, $htmlMessage, $headers);

// Optional: Save $uniqueEmailId with recipient details to cross-reference later
?>

3. Build a Statistics Dashboard (stats.php)

Create a simple page to view and analyze the tracking data. This example shows overall open counts, OS breakdowns, and browser usage.

<?php
// Connect to database
$db = new PDO("mysql:host=localhost;dbname=your_db;charset=utf8mb4", 'your_user', 'your_pass');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Fetch overall open stats by email
$overallStats = $db->query("SELECT email_id, COUNT(*) as open_count FROM email_tracking GROUP BY email_id ORDER BY open_count DESC")->fetchAll(PDO::FETCH_ASSOC);

// Fetch OS breakdown
$osStats = $db->query("SELECT os, COUNT(*) as count FROM email_tracking GROUP BY os")->fetchAll(PDO::FETCH_ASSOC);

// Fetch browser breakdown
$browserStats = $db->query("SELECT browser, COUNT(*) as count FROM email_tracking GROUP BY browser")->fetchAll(PDO::FETCH_ASSOC);
?>

<!DOCTYPE html>
<html>
<head>
    <title>Email Tracking Stats</title>
    <style>
        table { border-collapse: collapse; width: 80%; margin: 2rem auto; }
        th, td { border: 1px solid #ddd; padding: 0.8rem; text-align: left; }
        th { background: #f5f5f5; }
        h1, h2 { text-align: center; }
    </style>
</head>
<body>
    <h1>Email Open Tracking Dashboard</h1>

    <h2>Overall Open Counts</h2>
    <table>
        <tr><th>Email ID</th><th>Total Opens</th></tr>
        <?php foreach ($overallStats as $stat): ?>
        <tr><td><?= htmlspecialchars($stat['email_id']) ?></td><td><?= $stat['open_count'] ?></td></tr>
        <?php endforeach; ?>
    </table>

    <h2>Opens by Operating System</h2>
    <table>
        <tr><th>OS</th><th>Count</th></tr>
        <?php foreach ($osStats as $stat): ?>
        <tr><td><?= htmlspecialchars($stat['os']) ?></td><td><?= $stat['count'] ?></td></tr>
        <?php endforeach; ?>
    </table>

    <h2>Opens by Browser</h2>
    <table>
        <tr><th>Browser</th><th>Count</th></tr>
        <?php foreach ($browserStats as $stat): ?>
        <tr><td><?= htmlspecialchars($stat['browser']) ?></td><td><?= $stat['count'] ?></td></tr>
        <?php endforeach; ?>
    </table>
</body>
</html>
Important Notes
  • Privacy Compliance: Make sure to inform users your emails include tracking (per GDPR/CCPA rules) and offer an opt-out option.
  • Email Client Limitations: Many clients (like Gmail) block external images by default—users have to manually enable images for tracking to trigger. Your stats will reflect this.
  • Better UA Parsing: The regex above is basic. For more accurate results, use a dedicated library like ua-parser for PHP instead of manual regex.
  • Avoid Spam Filters: Don't overuse tracking—ensure your emails are legitimate and valuable, or risk being marked as spam.

内容的提问来源于stack exchange,提问作者codemossaka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:17:33