Как я могу узнать, если кто-то открыл письмо?
Я работаю над системой электронной почты (на основе PHP), где пользователи будут отправлять сотни электронных писем, и я хочу отслеживать эти письма, чтобы я мог знать, что электронная почта открыта или нет?
Кто-нибудь может подсказать мне, как это сделать?
Спасибо
6 ответов
Единственный способ, который я знаю - и он не очень надежен - это отправка письма в формате HTML, в котором вы добавляете что-то вроде:
PHP-код:
<img src='http://www.domain.com/mailcheck.php?user=123'>
изображение, но в процессе, вы можете отслеживать GET пользователя. Вы также можете найти способ изменить почтовый заголовок, чтобы запросить квитанцию - но я не знаю, как это сделать, - и это также ненадежно из-за добровольного характера запроса.
Проще говоря, вы устанавливаете скрипт PHP, который возвращает изображение 1x1. Сделайте, чтобы этот сценарий регистрировал User-Agent и IP (Вы можете даже войти в систему реферера).
Теперь вставьте это в электронное письмо.
Поскольку gmail начал показывать изображение всегда, но будет размещать его на своих собственных серверах, вы можете узнать, открыта ли почта, но вы не сможете отследить правильный IP-адрес. Проверьте некоторые ссылки здесь: Эффект кэширования Gmail и показ изображений по умолчанию
Вы можете узнать, как это делает mailchimp: MailChimp Working
РЕДАКТИРОВАТЬ: Код ссылки:
<img src="http://www.example.com/checkopen.php?user_id=20" />
Внутри checkopen.php
сценарий, получить user_id
поле, теперь соответствующее этому полю, сохраните его, чтобы этот пользователь открыл почту.
При отправке почты убедитесь, что вы увеличиваете user_id
поле каждый раз, когда вы отправляете почту.
Таким образом, всякий раз, когда это изображение отображается, оно будет вызывать соответствующий URL, и, таким образом, вы сможете войти в свою систему о статусе открываемой почты.
Хотя я и не выяснил, почему простой файл PHP не генерировал включенное изображение, вот еще один очень сложный способ создания файла изображения, который не был отклонен моим собственным веб-сервером PHP 5.4.30.
Вот код, который я поместил в файл index.php в подкаталоге / email_image /:
<?php
$message_id = $_REQUEST['message_id'];
$graphic_http = 'http://mywebsite.com/email_image/message_open_tracking.gif';
$filesize = filesize( 'message_open_tracking.gif' );
header( 'Pragma: public' );
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header( 'Cache-Control: private',false );
header( 'Content-Disposition: attachment; filename="a_unique_image_name_' . $message_id . '.gif"' );
header( 'Content-Transfer-Encoding: binary' );
header( 'Content-Length: '.$filesize );
readfile( $graphic_http );
exit;
?>
Для имени файла изображения я использовал следующее:
http://mywebsite.com/email_image/?message_id=12345
В папке email_image также находится пустое изображение размером 1x1 с именем "message_open_tracking.gif".
Файл index.php также можно пересмотреть, чтобы использовать message_id, чтобы пометить это сообщение как прочитанное. Если в строку запроса включены другие переменные, например адрес электронной почты получателя, эти значения также можно использовать в этом файле index.php.
Большое спасибо Беннетту Стоуну за следующую статью: http://www.phpdevtips.com/2013/06/email-open-tracking-with-php-and-mysql/
Электронная почта имеет поле уведомления о расположении, которое вы можете использовать для достижения этой цели. Это, конечно, зависит от MUA на удаленном конце. Они могут свободно игнорировать MDN (что является вежливым запросом, а не чем-то подрывным, что предлагают другие 2 ответа). MUA вашего конечного получателя отправит вам электронное письмо с сообщением о том, что ваше сообщение было прочитано. Ваш SMTP-сервер может фильтровать их, и вы можете запустить какую-то программу, которая сопоставляет отправленные письма с ответами.
Я очень против встраивания небольших фрагментов HTML, которые позволяют отслеживать пользователей.
Существует много возможностей, что неприятно с точки зрения клиента, потому что многие из них используются спамерами, которые хотят знать, «живы» ли их почтовые адреса.
Наиболее исчерпывающий список методов приведен (и протестирован) на https://www.emailprivacytester.com.
Думаю, с вашей точки зрения, наиболее «добрым» решением являются заголовки уведомлений о диспозиции. Однако просьба о «надежном» решении противоречит общей заинтересованности получателей в том, что не должно быть способа надежно наблюдать за их поведением против их воли.
Вот ссылка на полное руководство
Шаг 1. Создайте веб-страницу PHP с именем "index.php". Это будет служить нашим интерфейсом. Мы отправим электронное письмо и отследим его только отсюда.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Email Open Tracking Using PHP</title>
<script src="js/jquery.min.js" type="text/javascript"></script>
<script src="js/myjs.js" type="text/javascript"></script>
<link href="css/style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="main">
<h1>Email Open Tracking Using PHP</h1>
<div id="login">
<h2>Send Email</h2>
<hr/>
<form id="form1" method="post">
<div id="box">
<input type="email" placeholder="To : Email Id " name="mailto" required/>
<input type="text" placeholder="Subject : " name="subject" required/>
<textarea rows="2" cols="50" placeholder="Meassage : This is the fixed message of test email to get notify when it is read...." name="message" readonly ></textarea>
<input type="submit" value="Send" name="send" />
</div>
</form>
<div id="loading-image"><img src="http://www.arabianbusiness.com/skins/ab.main/gfx/loading_spinner.gif" alt="Sending....."/></div>
<form id="form2" method="post">
<div id="view"></div><br><br>
<div id="readstatus"></div>
<input type="submit" value="Track Status" id="track_mail" name="track"/>
</form>
</div>
</div>
</body>
</html>
Шаг 2. Создайте файл PHP с именем "tracker.php". Будет наш PHP-скрипт для двух целей:
а. Отправка почты с использованием библиотеки PHP mailer.
б. Прочитайте файл журнала (email.txt), чтобы отследить, открылось ли письмо.
<?php
require ('phpmailer/PHPMailerAutoload.php');
$from = "test@gmail.com"; //sender's username
$pwd = "test@1234"; //sender's password
//-------------------------------------------------------SEND eMail----------------------------------------------------------------------
if (isset($_POST['mailto'])) {
try {
$mail = new PHPMailer(true); //New instance,exceptions enabled with true
$to = $_POST['mailto'];
$subject = $_POST['subject'];
$id = rand(111, 999);
$id.=rand(111, 999);
$body = "This is the fixed message of test email to get notify when it is read.....";
$body .= "<img border='0' src='https://yourwebsite.com/trackonline.php?email=$to&id=$id&subject=$subject' width='1' height='1' alt='image for email' >";
$mail->IsSMTP(); // tell the class to use SMTP
$mail->SMTPAuth = true; // enable SMTP authentication
$mail->Port = 25; // set the SMTP server port
$mail->Host = "smtp.gmail.com"; // SMTP server
$mail->Username = $from; // SMTP server username
$mail->Password = $pwd; // SMTP server password
$mail->From = $from;
$mail->FromName = "TESTUSER";
$mail->AddAddress($to);
$mail->Subject = $subject;
$mail->AltBody = "Please return read receipt to me."; // optional, comment out and test
$mail->WordWrap = 80; // set word wrap
$mail->MsgHTML($body);
$mail->IsHTML(true); // send as HTML
$mail->Send();
//return foll
echo '<input id="id1" name="id" type="hidden" value="' . $id . '">'
. '<input id="email1" name="email" type="hidden" value="' . $to . '">'
. '<label id="label1">Mail sent to <b>' . $to . '<b></label>';
} catch (phpmailerException $e) {
echo $e->errorMessage();
}
}
////------------------------------------------READ email.txt-------------------------------------------------------
if (!empty($_POST['id'])) {
$id = $_POST['id'];
$to = $_POST['email'];
$checkid = "Id:" . $id;
$fh = fopen("https://yourwebsite.com/email.txt", "r");
$read = false; // init as false
while (($buffer = fgets($fh)) !== false) {
if (strpos($buffer, $checkid) !== false) {
$a = explode("%",$buffer);
$read = true;
break; // Once you find the string, you should break out the loop.
}
}
fclose($fh);
if ($read == true) {
//$string = $email . " seen the mail on subject: '" . $sub . "' from ip: " . $ipAddress . " on " . $date . " and Id:" . $id . "\n";
echo "<img id=\"closed-image\" src=\"img/envelope-open.png\" alt=\"email not opened\"/><br><p id=\"closed-para\">"
. "Mail sent from <b>" . $from . "</b><br> To <b>" . $to
. "</b><br>has been<div id=\"color-read\"> opened on <b>".$a[1]."</b></div></p>"
. "<input id=\"id1\" name=\"id\" type=\"hidden\" value=\"" . $id . "\">"; //appended hidden input to keep previous data on the page.
} else {
echo "<img id=\"closed-image\" src=\"img/envelope-closed.png\" alt=\"email not opened\"/><br><p id=\"closed-para\">"
. "Mail sent from <b>" . $from . "</b><br> To <b>" . $to
. "</b><br><div id=\"color-not-read\"> Not yet opened......</div></p>"
. "<input id=\"id1\" name=\"id\" type=\"hidden\" value=\"" . $id . "\">"; //appended hidden input to keep previous data on the page.
}
}
Шаг 3. Создайте файл PHP с именем "trackonline.php". Это будет PHP-скрипт для записи записи в текстовом файле, а также для проверки на двойственность.
<?php
if (!empty($_GET['email'])) {
$id = $_GET['id'];
$checkid = "Id:" . $id;
$email = $_GET['email'];
$sub = $_GET['subject'];
date_default_timezone_set('Asia/Kolkata');
$date = date('d/m/Y h:i:s a');
$fh = fopen("email.txt", "a+"); //file handler
$a = fgets($fh);
$found = false; // init as false
while (($buffer = fgets($fh)) !== false) {
if (strpos($buffer, $checkid) !== false) {
$found = true;
break; // Once you find the string, you should break out the loop.
}
}
if ($found == false) {
$string = $email."opened the mail with subject:".$sub."on%".$date."% with mailId:".$id."\n";
fwrite($fh, $string);
}
fclose($fh);
//Get the http URI to the image
$graphic_http = 'https://yourwebsite.com/blank.gif';
//Get the filesize of the image for headers
$filesize = filesize('blank.gif');
//Now actually output the image requested, while disregarding if the database was affected
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private', false);
header('Content-Disposition: attachment; filename="blank.gif"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . $filesize);
readfile($graphic_http);
//All done, get out!
exit;
}