Pull to refresh

Как узнать, что письмо прочитали

При создании информационной рассылки для своей компании я озаботился о том, прочитали ли мои подписчики письма. На емайл счетчик не поставишь, скрипты никакие не выполнишь, поэтому нужно искать выход. Самый простой способ — попросить пользователя перейти по ссылке — по понятным причинам может на сработать. Ссылка «отписаться» сработает если пользователю это неинтересно, т.е. получим информацию не совсем ту, что нужна. Выход напросился сам собой.

Если в письме используются какие-либо элементы с Вашего сайта, то нужно просто посчитать количество их скачиваний. Почтовые клиенты весьма примитивны и можно рассчитывать лишь на скачивание изображений. Следовательно делаем скрипт, который выдает простую белую картинку:

<?
    $image = imagecreatetruecolor(10,10)
       or die('Cannot create image');
    
    imagefill($image, 0, 0, 0xFFFFFF);
    header('Content-type: image/png');
    imagepng($image);
    imagedestroy($image);
?>


Проверяем — действительно картинка генерируется. Однако теперь нужно определить уникальный ли посетитель. Простой способ, поставив в письме тег таким образом:
<img src="lynks.ru/images/img.php?i=0b96fca79547b435e644a98ffe3e9bda"/>

где 0b96fca79547b435e644a98ffe3e9bda — это уникальный идентификатор подписчика (MD5 хеш от емайла). Внедряем в html страницу, проверяем в браузере — отображается. Теперь запишем статистику в базу данных:

<?
    // Подключаемся к базе данных
    $dbh=mysql_connect ("localhost", "site_textpat", "lynksru") 
         or die ('I cannot connect to the database because: ' . mysql_error());
    //Выбираем базу
    mysql_select_db ("site_textpat");
    //Обновляем запись, инкрементируем количество скачиваний
    $query="UPDATE  `site_textpat`.`bab_pm_subscribers` 
    SET  readed=readed+1 
    WHERE  `bab_pm_subscribers`.`unsubscribeID` ='$i' LIMIT 1" ;
    //Выполняем запрос.
    $result = mysql_query($query,$dbh)
        or die("Invalid query: " . mysql_error());
?>    

Теперь при каждом скачивании картинки в базе данных увеличивается число скачиваний для заданного идентификатора. Формируем письмо, отправляем для проверки. И тут оказывается, что тот же Gmail просто-напросто игнорирует такие изображения. Нужен какой-то способ интерпретировать стандартные ссылки на картинки как обращения к скрипту. Конечно можно наделать кучу скриптов, но это не рационально.

На помощь приходит mod_rewrite для apache. Чтобы распознать ссылку на картинку и подменить ее ссылкой на скрипт нужно в каталоге скрипта создать файл .htaccess такого вида:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ([[:alnum:]]+).png$ img.php?i=$1 [L]
</IfModule>

Первой инструкцией включаем mod_rewrite, второй регулярным выражением вычленяем из ссылки имя png файла, без расширения. Имя может
  • состоять из цифр и букв: [:alnum:]
  • иметь любое их количество: [[:alnum:]]+
  • имя запоминаем: ([[:alnum:]]+)
  • конец расширение будет .png: ([[:alnum:]]+).png

После пробела указываем что должны получить взамен найденного: img.php?i=$1 [L], где $1 это то, что мы до этого запомнили в скобках, а [L] — инструкция предписывающая на этой операции прекратить обработку URL. Объединяем все в один скрипт:
<?
    //Создаем изображение
    $image = imagecreatetruecolor(10,10)
       or die('Cannot create image');
    //заливаем белым
    imagefill($image, 0, 0, 0xFFFFFF);
    //в заголовке указываем что шлем png изображение
    header('Content-type: image/png');
    //выводим и уничтожаем
    imagepng($image);
    imagedestroy($image);

    // Подключаемся к базе данных
    $dbh=mysql_connect ("localhost", "site_textpat", "lynksru") 
         or die ('I cannot connect to the database because: ' . mysql_error());
    //Выбираем базу
    mysql_select_db ("site_textpat");
    //Обновляем запись, инкрементируем количество скачиваний
    $query="UPDATE  `site_textpat`.`bab_pm_subscribers` 
    SET  readed=readed+1 
    WHERE  `bab_pm_subscribers`.`unsubscribeID` ='$i' LIMIT 1" ;
    //Выполняем запрос.
    $result = mysql_query($query,$dbh)
        or die("Invalid query: " . mysql_error());
?>    

Теперь изображения в письма можно вставлять обычным способом:
<img src="lynks.ru/images/0b96fca79547b435e644a98ffe3e9bda.png"/>

mod_rewrite сам изменит ссылку и передаст управление нашему скрипту. По крайней мере Gmail, Outlook и даже OpenOffice Writer корректно распознали и отобразили изображение, а счетчик прочтений исправно инкрементировался.

Описанный метод можно использовать практически везде, где нужно посчитать количество открытий html структур, ведь изображения поддерживаются почти везде.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.