برنامه نویسی

ایجاد یک سیستم ردیابی ایمیل باز برای جیمیل شما

در چشم انداز ایمیل امروزی، پلتفرم های بازاریابی معمولاً ردیابی «باز» یا «خوانده» را به طور پیش فرض بسته بندی می کنند. اما اگر بخواهید چه می شود شخصی سیستم پیکسل ردیابی – سیستمی که در آن می‌توانید گزارش‌های باز برای ایمیل‌های خاصی را که از آن ارسال می‌کنید مشاهده کنید جیمیل?


پیوند GitHub: ردیاب نامه

خودت رول کن Node.js + Express + EJS + SQLite برنامه:

  1. 1×1 پیکسل تولید می کند مرتبط با شناسه های منحصر به فرد،
  2. رویدادها را باز می کند (تاریخ/زمان، IP، عامل کاربر)،
  3. یک فایل png واقعی را ارائه می دهد بنابراین Gmail/ سایر مشتریان یک تصویر استاندارد را می بینند.

یک داشبورد سبک وزن دریافت خواهید کرد که نشان می دهد کدام پیکسل ها ایجاد شده اند، به علاوه گزارش رویدادهای باز. در حالی که این 100٪ بی خطا نخواهد بود (به دلیل مسدود شدن تصویر یا پروکسی هایی مانند GoogleImageProxy)، این یک روش سرگرم کننده و آموزشی برای مشاهده ردیابی باز اولیه در عمل برای ایمیل های شخصی شما است.


فهرست مطالب

1. پیش نیازها

  • Node.js به صورت محلی نصب شده است.
  • مقداری آشنایی با اکسپرس (برای مسیریابی).
  • تمایل به سرهم بندی کردن EJS (موتور قالب) و SQLite برای ذخیره سازی داده ها

نکته: اگر می خواهید افراد دیگر (گیرندگان خارجی) پیکسل شما، سرور شما را باز کنند باید برای دنیای بیرون قابل دسترسی باشد. میزبانی بر روی پلتفرمی مانند رندر کنید، هروکو، یا استفاده از سرویس تونل (مثلاً ngrok یا تونل محلی) می تواند کمک کند.


2. مفاهیم اصلی

2.1. ردیابی پیکسل

“پیکسل ردیابی” فقط یک تصویر پنهان در ایمیل شما است. اگر مشتری گیرنده تصاویر را بارگیری کند، سرور شما یک درخواست HTTP برای آن PNG 1×1 (یا GIF) می بیند.

2.2. ورود به سیستم باز می شود

وقتی کسی (یا برخی از پروکسی ها) واکشی می کند /tracker/.png، ضبط می کنید:

  • مهر زمان (زمانی که واکشی شد)
  • آدرس IP،
  • عامل کاربر (ممکن است نشان دهد GoogleImageProxy برای Gmail، نشان می دهد که IP کاربر واقعی پوشانده شده است).

2.3. پروکسی های جیمیل و تصویر

تصاویر پراکسی Gmail مدرن (ارائه شده از ggpht.com یا مشابه). این یعنی:

  • شما نمی بینید گیرنده آدرس IP واقعی
  • جیمیل اغلب پیکسل را واکشی می کند یک بار و آن را کش می کند، بنابراین بازهای بعدی ممکن است به عنوان یک گزارش جدید ظاهر نشوند.

با وجود این محدودیت ها، هنوز هم می توانید ببینید اگر/وقتی تصویر برای اولین بار واکشی شد – اغلب نزدیک به زمانی که کاربر برای اولین بار ایمیل شما را باز کرد.


3. برنامه Node ساده ما

3.1. راه اندازی پروژه

یک پوشه ایجاد کنید (مثلاً mail-tracker) سپس:

cd mail-tracker
npm init -y
npm install express ejs sqlite3 uuid
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما در نهایت با یک package.json که به این وابستگی ها اشاره می کند. بعدی:

  1. ایجاد کنید الف public/images پوشه با a 1×1 PNG شفاف نام برد pixel.png.
  2. ایجاد کنید دو فایل EJS در یک views پوشه: index.ejs (داشبورد) و logs.ejs (نمایش سیاههها).

3.2. app.js (فایل سرور اصلی)

در زیر گزیده ای ساده شده است. آن:

  • داده های پیکسل را در آن ذخیره می کند SQLite (mail-tracker.db).
  • خدمت می کند فایل های استاتیک (بنابراین pixel.png اگر بخواهیم قابل بارگذاری است).
  • دارای یک /tracker/:id.png مسیری که یک باز ثبت می کند و واقعی را باز می فرستد pixel.png.
const express = require('express');
const path = require('path');
const { v4: uuidv4 } = require('uuid');
const sqlite3 = require('sqlite3').verbose();

const app = express();
app.set('view engine', 'ejs');
app.use(express.urlencoded({ extended: false }));

// Serve static files from /public
app.use(express.static(path.join(__dirname, 'public')));

// Initialize SQLite
const db = new sqlite3.Database(path.join(__dirname, 'mail-tracker.db'), (err) => {
  // Create tables if not existing
});

// Middleware to get baseUrl for EJS
app.use((req, res, next) => {
  const protocol = req.protocol;
  const host = req.get('host');
  res.locals.baseUrl = `${protocol}://${host}`;
  next();
});

// Dashboard: list all pixels
app.get('/', (req, res) => {
  // SELECT * FROM pixels ...
  res.render('index', { pixels });
});

// Create pixel
app.post('/create', (req, res) => {
  const pixelId = uuidv4();
  // Insert pixel into DB
  // redirect to "https://dev.to/"
});

// The tracker route
app.get('/tracker/:id.png', (req, res) => {
  // Check pixel ID, log open in DB
  // Serve the real 'pixel.png'
  res.sendFile(path.join(__dirname, 'public', 'images', 'pixel.png'));
});

// View logs
app.get('/logs/:id', (req, res) => {
  // SELECT logs from DB for that pixel
  res.render('logs', { pixel, logs });
});

// Start server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Listening on ${PORT}`));
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3.3. index.ejs (داشبورد)

فرمی را برای ایجاد یک پیکسل جدید به اضافه جدولی نشان می دهد که پیکسل های موجود را فهرست می کند:



  
    </span>Mail Tracker - Dashboard<span class="nt"/>
    <span class="nt"><meta/> <span class="na">charset=</span><span class="s">"UTF-8"</span> <span class="nt">/></span>
  <span class="nt"/>
  <span class="nt"/>
    <span class="nt"/>Mail Tracker - Dashboard<span class="nt"/>

    <span class="nt"><h2/></span>Create a New Tracking Pixel<span class="nt"/>
    <span class="nt"/>

    <span class="nt"><hr/> <span class="nt">/></span>

    <span class="nt"><h2/></span>Existing Pixels<span class="nt"/>
    <span class="c"><!-- For each pixel, show tracker URL like: baseUrl/tracker/PIXEL_ID.png --></span>
    <span class="c"><!-- Link to logs page to see open events --></span>
  <span class="nt"/>
<span class="nt"/>
</span></span></code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>وارد حالت تمام صفحه شوید
    

از حالت تمام صفحه خارج شوید

3.4. logs.ejs (نمایش گزارش ها)

هر رویداد باز (زمان، IP، عامل کاربر) را فهرست می کند. می توانیم زمان را قالب بندی کنیم، گزارش های سریع را با رنگ گروه بندی کنیم و غیره:



  
    </span>Mail Tracker - Logs<span class="nt"/>
    <span class="nt"><meta/> <span class="na">charset=</span><span class="s">"UTF-8"</span> <span class="nt">/></span>
  <span class="nt"/>
  <span class="nt"/>
    <span class="nt"/>Logs for <span class="nt"><</span><span class="err">%=</span> <span class="na">pixel.name</span> <span class="err">%</span><span class="nt">></span>
    <span class="nt"/>Created At: <span class="nt"><</span><span class="err">%=</span> <span class="na">pixel.createdAt</span> <span class="err">%</span><span class="nt">></span>

    <span class="nt"><h2/></span>Open Events<span class="nt"/>
    <span class="nt"><p> <span class="na">style=</span><span class="s">"font-style: italic;"</span><span class="nt">></span>
      You may see extra logs if bots (for example, GoogleImageProxy via ggpht.com) or the email client repeatedly load the image.
      Check each log’s timestamp to distinguish real user opens from proxy fetches.
    <span class="nt"/></p></span>

    <span class="nt"><table>
      <span class="nt"><thead>
        <span class="nt"><tr><th>Time<span class="nt"/></th><th>IP<span class="nt"/></th><th>User-Agent<span class="nt"/></th></tr></span>
      <span class="nt"/></thead></span>
      <span class="nt"><tbody>
        <span class="nt"><</span><span class="err">%</span> <span class="err">//</span> <span class="na">For</span> <span class="na">each</span> <span class="na">log</span><span class="err">,</span> <span class="na">show</span> <span class="na">the</span> <span class="na">local-time</span> <span class="na">date</span><span class="err">,</span> <span class="na">IP</span><span class="err">,</span> <span class="na">userAgent</span><span class="err">,</span> <span class="na">etc.</span> <span class="err">%</span><span class="nt">></span>
      <span class="nt"/></tbody></span>
    <span class="nt"/></table></span>
  <span class="nt"/>
<span class="nt"/>
</span></code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>وارد حالت تمام صفحه شوید
    

از حالت تمام صفحه خارج شوید


4. جاسازی در جیمیل

4.1. URL Tracker را کپی کنید

هنگامی که سرور شما به صورت عمومی اجرا می شود، پیکسل شما دارای یک URL مانند:

https://myapp.example.com/tracker/1234abcd-....png
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یا اگر از یک تونل محلی استفاده می کنید:

https://random.loca.lt/tracker/1234abcd-....png
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4.2. درج عکس بر اساس URL

  1. نوشتن یک ایمیل جدید در جیمیل
  2. کلیک کنید درج عکسآدرس وب (URL).
  3. چسباندن URL ردیاب.
  4. اگر Gmail بگوید «نمی‌توانیم آن تصویر را پیدا کنیم یا به آن دسترسی پیدا کنیم»، همچنان می‌توانید درج و ارسال کنید.
  5. وقتی گیرنده باز می‌شود (و تصاویر فعال می‌شوند)، Gmail آن تصویر را بارگیری می‌کند (یا حافظه پنهان) می‌کند و گزارش‌های شما یک رویداد را ضبط می‌کنند.

توجه داشته باشید: از آنجایی که Gmail تصاویر پراکسی را انجام می دهد، این درخواست احتمالاً از سرورهای Google (به عنوان مثال، GoogleImageProxy/ggpht.com). شما آی پی گیرنده واقعی را دریافت نخواهید کرد. اما شما می بینید چه زمانی پیکسل واکشی شد – اغلب با باز بودن کاربر مرتبط است.


5. درک “گزارش های اضافی” و رفتار پراکسی

  • گزارش های متعدد: اگر Gmail یا سرویس گیرنده دیگری تصویر را بازخوانی یا دوباره واکشی کند، یا اگر کاربر پیام را دوباره باز کند، چندین ورودی خواهید دید. برخی ممکن است در داخل باشند ثانیه از یکدیگر، توسط فرآیندهای پس‌زمینه یا فیلترهای هرزنامه ایجاد می‌شوند.
  • عامل کاربر: شاید ببینی GoogleImageProxy به جای یک عامل کاربر واقعی یک مرورگر. این برای جیمیل طبیعی است. سایر مشتریان، مانند Apple Mail یا Outlook، ممکن است اطلاعات مستقیم بیشتری را نشان دهند.
  • IP: به دلیل پروکسی ها، معمولاً محدوده IP Google را می بینید، نه IP واقعی گیرنده. این یک معیار حفظ حریم خصوصی است.

6. محدودیت ها و پیشرفت های آینده

  1. مسدود کردن تصویر: اگر سرویس گیرنده ایمیل گیرنده تصاویر را به طور پیش فرض مسدود کند، پیکسل شما هرگز بارگیری نمی شود. بنابراین شما یک رویداد باز را نخواهید دید.
  2. ذخیره سازی: جیمیل مخصوصاً تصاویر را کش می کند. باز شدن های بعدی ممکن است درخواست جدیدی ایجاد نکند.
  3. بدون IP / مکان: با پراکسی ها، آی پی یا موقعیت مکانی کاربر واقعی را نمی بینید.
  4. پارامترهای پرس و جو منحصر به فرد: اگر می‌خواهید گیرندگان فردی را ردیابی کنید، یک پیکسل جداگانه برای هر شخص ایجاد کنید یا رشته‌های پرس و جو را اضافه کنید. ?user=john@example.com.

7. چرا یک ردیاب شخصی بسازیم؟

  • آموزشی: با نحوه عملکرد ردیابی باز در زیر کاپوت آشنا شوید.
  • حریم خصوصی: شما به جای اعتماد به یک ارائه دهنده بازاریابی شخص ثالث، داده های خود را کنترل می کنید.
  • اشکال زدایی: اگر می خواهید ببینید که آیا یکی از دوستان/مشتریان ایمیل شما را می خواند یا نه، یا به سادگی تأیید کنید که برخی از تماس های یکباره باز شده است.

(همیشه مراقب باشید قانونی یا اخلاقی محدودیت ها در منطقه شما و در میان مخاطبین شما.)


8. نتیجه گیری

اجرای سرویس ردیابی باز خود می تواند یک پروژه جانبی سرگرم کننده باشد – به خصوص برای دیدن نحوه انجام آن جیمیل یا سایر ارائه دهندگان تصاویر را مدیریت می کنند. شما به سرعت آن را کشف خواهید کرد GoogleImageProxy می‌تواند آدرس‌های IP واقعی را بپوشاند، و در صورت خاموش بودن تصاویر، هر باز شده ضبط نمی‌شود. با این وجود، برای استفاده شخصی، این یک راه منظم برای دیدن رویدادهای باز در زمان واقعی است.

مراحل کلیدی خلاصه:

  1. ساخت یک سرور Node.js + Express.
  2. ایجاد کنید شناسه ها/پیکسل های منحصر به فرد
  3. ورود به سیستم درخواست به /tracker/:id.png.
  4. سرو کنید یک مشروع .png فایل
  5. جاسازی کنید پیکسل در پیام های جیمیل شما.
  6. بررسی کنید گزارش های خود را برای رویدادهای باز (و به دقت تفسیر کنید).

همین – سیستم ردیابی ایمیل شخصی شما. هنگامی که آن را در عمل مشاهده کردید، قدردانی عمیق تری از نحوه ردیابی باز در مقیاس پلتفرم های پستی بزرگ خواهید داشت و چرا با محدودیت های مشابه ذخیره سازی و مسدود کردن تصویر مواجه می شوند.


پیوند GitHub: ردیاب نامه

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا