Чтобы определить, читали отправленное письмо или нет, можно воспользоваться небольшой хитростью – отправить в письме картинку, которая будут подгружаться с удаленного сервера, и при обращении к этой картинке, можно реализовать вызов счетчика количества просмотров. Для того чтобы при обращении к картинке на сервере выполнялся скрипт можно воспользоваться apache модулем
mod_rewrite
. Он позволит реализовать редирект с картинки на скрипт. Для этого достаточно добавить в корень сайта файл
.htaccess
с кодом:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ([[:alnum:]]+).png$ img.php?em=$1 [L]
</IfModule>
Таким образом, при обращении к картинке с адресом:
<img src="http://site.ru/dGVzdEBtYWlsLnJ1.png"/>
будет вызван скрипт http://site.ru/img.php?em=dGVzdEBtYWlsLnJ1
Как вы уже наверняка обратили внимание, помимо вызова самого скрипта, происходит передача GET параметра em – имя картинки. Это сделано специально, с помощью этого параметра можно передавать любую необходимую информацию, например e-mail адрес получателя письма. В данном примере это закодированный, с помощью
base64
, e-mail получателя. Остается только написать скрипт, который будет обрабатывать обращения и возвращать в ответ картинку и записывать статистику обращений:
// генерируем картинку и отдаем ее
// создаем холст 1 на 1 пиксель
$image = imagecreatetruecolor(1,1);
// делаем его белым
imagefill($image, 0, 0, 0xFFFFFF);
// задаем заголовок для вывода картинки
header('Content-type: image/png');
// выводим картинку
imagepng($image);
// очищаем память от картинки
imagedestroy($image);
// проверяем наличие GET параметра
if(isset($_GET['em'])){
// получили email пользователя,
// который открыл письмо
// раскодирем данные
$email = base64_decode($_GET['em']);
// тут реализуем запись статистики
// в файл или базу данных
}
В рецепте был использован код для генерации картинки, об этом подробнее написано в V части сборника рецептов(«Графика»). Также была использована ранее не описанная функция
base64_decode
, она осуществляет декодирование данных закодированных с помощью функции
base64_encode
в формат
base64.