2011-03-27 51 views
17

Tôi đã thấy dịch vụ như spypig.com đặt một hình ảnh nhỏ trong email và theo dõi khi nó được mở và từ đâu. Họ theo dõi thành phố, quốc gia, địa chỉ IP, vv Việc này được thực hiện như thế nào?Theo dõi email bằng PHP và hình ảnh

  1. Làm cách nào để biết thời điểm thư được mở? Và hình ảnh được tạo ra như thế nào?
  2. Địa chỉ IP được phát hiện như thế nào và làm cách nào để biết vị trí từ ?
+3

Và những gì bạn muốn làm gì với điều này? Rất nhiều khách hàng E-Mail kiểm tra webbugs này và sẽ không hiển thị chúng, vì vậy bạn không thể dựa vào điều này trong một ứng dụng nghiêm túc. – martinstoeckli

Trả lời

46

Về cơ bản, trong cơ thể HTML của email của bạn, sẽ có một <img> thẻ đó sẽ trông như thế này:

<img src="http://www.yoursite.com/tracker.php?id=123456" alt="" /> 

Khi ai đó đọc thư của anh ấy, với hình ảnh được bật, ứng dụng email khách sẽ gửi yêu cầu đến tracker.php, để tải hình ảnh, chuyển cho nó id=123456 làm thông số.


tracker.php Kịch bản này sẽ được trên máy chủ của bạn, và khi được gọi, nó sẽ:

  • Kiểm tra các tham số id,
  • Sử dụng nó để tìm đến địa chỉ email nào nó tương ứng - khi tạo email cho từng người đăng ký của bạn, bạn sẽ tạo một số khác nhau cho mỗi e-mail là id.
  • Thực hiện một số nội dung - như nhật ký "email 123456 đã được mở" và một số thông tin bổ sung
  • trả lại nội dung của một hình ảnh nhỏ; giống như gif trong suốt 1x1.


Kịch bản tracker.php biết từ đó địa chỉ IP nó được gọi là - giống như bất kỳ PHP kịch bản khác:

$ipAddress = $_SERVER['REMOTE_ADDR']; 

Và, bắt đầu từ địa chỉ IP này, bạn có thể sử dụng dịch vụ định vị để tìm từ nơi nào trên thế giới, email đã được mở.
Là một vài ví dụ, bạn có thể có một cái nhìn tại MaxMind, hoặc IPInfoDB

Như bạn đã biết rằng id=123456 tương ứng với một địa chỉ email cụ thể, điều này cho phép để tìm hiểu một số nơi từng đăng ký của bạn.

+0

Có thể tôi có thể chưa hiểu hoàn toàn. Tôi chỉ muốn hiểu tại sao chúng ta cần trả lại nội dung của một hình ảnh nhỏ. Điều gì sẽ xảy ra nếu chúng ta có như thế này ' '? Tức là, được đặt thành 'display: none'. Bạn có thể ném một số ánh sáng vào điều này? – Gnanam

+0

Tôi đoán bạn có thể bỏ qua việc trả về một hình ảnh, nhưng nó sẽ hiển thị xấu biểu tượng hình ảnh bị hỏng. Và tôi không khuyên bạn sử dụng màn hình: không có email, vì bộ lọc spam khá nghiêm ngặt hiện nay và việc sử dụng có thể khiến email của bạn chuyển ngay vào thư mục spam hoặc thậm chí có thể từ chối nó, vì bộ lọc sẽ cho rằng bạn ẩn văn bản hoặc mã độc hại. Ngay cả khi sử dụng văn bản màu trắng trên nền trắng có thể kích hoạt hành động này – aleation

+1

cách trả về 'hình ảnh' từ' tracker.php'? –

2

Về phần đầu tiên của câu hỏi, điều tôi đã làm là trả về hình ảnh từ tệp php. Ngoài việc trả lại một hình ảnh (nó có thể là pixel 1x1 png trong suốt) là ghi lại tất cả thông tin vào cơ sở dữ liệu. Bằng cách này, khi tệp php được gọi, bạn biết rằng hình ảnh đã được tải tức là email đã được đọc. Vấn đề là rất nhiều khách hàng hiện đại không tải hình ảnh automaticlly. Điều này là không cho phép chỉ là loại điều bạn đang cố gắng làm, vì lý do riêng tư.

Về phần thứ hai, có một số dịch vụ web định vị địa lý, nơi bạn gửi IP và nhận vị trí địa lý. Bạn có thể làm điều đó trong tệp php trả về hình ảnh pixel 1x1. Đây là một chủ đề tốt về vấn đề này trên trang web này: Geolocation web service recommendations

0

tôi đang tìm kiếm một mẹo để ẩn hình ảnh, cách dễ nhất dường như làm:

<img src="http://www.yoursite.com/tracker.php?id=123456" alt="" width="1" height="1" border="0"> 

để hoàn thành lời giải thích tuyệt vời của Pascal.

3

1. Đặt iamge theo dõi tại E-mail

<img src="http://www.yoursite.com/tracker.php?eid=123456&uid=123" alt="" width="1px" height="1px"> 

làm việc của nó là rất đơn giản, khi mail của bạn mở, hình ảnh theo dõi gửi yêu cầu tới tracker.php cho hình ảnh để tải về, Chúng tôi lấy dữ liệu của url biểu mẫu dữ liệu người dùng và xem xét khi được đọc.

Lưu ý: Không sử dụng display: none; tài sản để ẩn hình ảnh của bạn, nó có thể lọc theo thuật toán spam. Và không nơi bất kỳ mã JavaScript, nó cũng ngăn chặn thư rác lọc

2. Trên tracker.php

<?php 
header("Content-Type: image/jpeg"); // it will return image 
readfile("img.jpg"); 

dbfunction(); // place your db code 
?> 

3. địa chỉ IP là có được bằng hàm sau.

function get_client_ip() { 
    $ipaddress = ''; 
    if (isset($_SERVER['HTTP_CLIENT_IP'])) 
     $ipaddress = $_SERVER['HTTP_CLIENT_IP']; 
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 
     $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    else if(isset($_SERVER['HTTP_X_FORWARDED'])) 
     $ipaddress = $_SERVER['HTTP_X_FORWARDED']; 
    else if(isset($_SERVER['HTTP_FORWARDED_FOR'])) 
     $ipaddress = $_SERVER['HTTP_FORWARDED_FOR']; 
    else if(isset($_SERVER['HTTP_FORWARDED'])) 
     $ipaddress = $_SERVER['HTTP_FORWARDED']; 
    else if(isset($_SERVER['REMOTE_ADDR'])) 
     $ipaddress = $_SERVER['REMOTE_ADDR']; 
    else 
     $ipaddress = 'UNKNOWN'; 
    return $ipaddress; 
} 
$PublicIP = get_client_ip(); 

4. Location:

Với vị trí là nhận được bằng dịch vụ vị trí địa lý, bạn có thể sử dụng công cụ tìm geolocation mã nguồn mở như nekudo, freegeoip.

cho examle

<?php 
$json = file_get_contents("https://freegeoip.net/json/$PublicIP"); 
$json = json_decode($json ,true); 
$country = $json['country_name']; 
$region= $json['region_name']; 
$city = $json['city']; 
?> 
+1

Có lẽ tôi sai, nhưng phần ipecho sẽ phải được gọi trên máy chủ, vì vậy bạn sẽ chỉ nhận được địa chỉ IP của máy chủ? – andeersg

Các vấn đề liên quan