#!/usr/bin/env python3 """ Simple Email Tracking Server A minimal Flask application that serves transparent tracking pixels and logs email opens with metadata. """ import os import json import time import logging from datetime import datetime from flask import Flask, request, send_file, render_template_string # Configure logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('/opt/tracker/data/tracker.log'), logging.StreamHandler() ] ) # Create Flask app app = Flask(__name__) # Directory to store tracking data DATA_DIR = '/opt/tracker/data' os.makedirs(DATA_DIR, exist_ok=True) # Path to 1x1 transparent pixel PIXEL_PATH = os.path.join(DATA_DIR, 'pixel.png') # Create 1x1 transparent PNG if it doesn't exist if not os.path.exists(PIXEL_PATH): from PIL import Image img = Image.new('RGBA', (1, 1), color=(0, 0, 0, 0)) img.save(PIXEL_PATH) # Path to tracking data TRACKING_DATA_PATH = os.path.join(DATA_DIR, 'tracking_data.json') def load_tracking_data(): """Load existing tracking data from JSON file""" if os.path.exists(TRACKING_DATA_PATH): try: with open(TRACKING_DATA_PATH, 'r') as f: return json.load(f) except json.JSONDecodeError: logging.error("Error loading tracking data, starting fresh") return {} def save_tracking_data(data): """Save tracking data to JSON file""" with open(TRACKING_DATA_PATH, 'w') as f: json.dump(data, f, indent=2) @app.route('/pixel/.png') def tracking_pixel(tracking_id): """Serve a tracking pixel and log the request""" # Get client information user_agent = request.headers.get('User-Agent', 'Unknown') ip_address = request.remote_addr timestamp = datetime.now().isoformat() referer = request.headers.get('Referer', 'Unknown') # Log the tracking event logging.info(f"Pixel loaded - ID: {tracking_id}, IP: {ip_address}") # Add tracking event to data tracking_data = load_tracking_data() if tracking_id not in tracking_data: tracking_data[tracking_id] = [] tracking_data[tracking_id].append({ 'timestamp': timestamp, 'ip_address': ip_address, 'user_agent': user_agent, 'referer': referer }) save_tracking_data(tracking_data) # Return the 1x1 transparent pixel return send_file(PIXEL_PATH, mimetype='image/png') @app.route('/') def dashboard(): """Display tracking statistics dashboard""" tracking_data = load_tracking_data() # Prepare data for the dashboard stats = [] for tracking_id, events in tracking_data.items(): stats.append({ 'id': tracking_id, 'views': len(events), 'last_view': events[-1]['timestamp'] if events else 'Never', 'unique_ips': len(set(e['ip_address'] for e in events)) }) # Sort by most views stats.sort(key=lambda x: x['views'], reverse=True) # Simple HTML dashboard template template = """ Email Tracking Dashboard

Email Tracking Dashboard

To track email opens, add this HTML to your emails:

<img src="https://YOUR_DOMAIN/px/YOUR_TRACKING_ID.png" height="1" width="1" />

Tracking Statistics

{% for stat in stats %} {% endfor %}
Tracking ID Views Unique IPs Last View Details
{{ stat.id }} {{ stat.views }} {{ stat.unique_ips }} {{ stat.last_view }} View Details
""" return render_template_string(template, stats=stats) @app.route('/details/') def tracking_details(tracking_id): """Display detailed tracking information for a specific ID""" tracking_data = load_tracking_data() if tracking_id not in tracking_data: return f"No data found for tracking ID: {tracking_id}", 404 events = tracking_data[tracking_id] # Simple HTML template for details template = """ Tracking Details: {{ tracking_id }}

Tracking Details: {{ tracking_id }}

Total views: {{ events|length }}

Events

{% for event in events %} {% endfor %}
Time IP Address User Agent Referer
{{ event.timestamp }} {{ event.ip_address }} {{ event.user_agent }} {{ event.referer }}
""" return render_template_string(template, tracking_id=tracking_id, events=events) if __name__ == '__main__': app.run(host='127.0.0.1', port=5000, debug=False)