Подтвердить что ты не робот

PHP: Проверьте, кто прочитал отправленное письмо?

Я отправляю электронное письмо некоторым пользователям и хочу знать, кто его прочитал, означает, что если кто-то прочитал это письмо, тогда будет храниться файл журнала, который содержит адрес электронной почты этого пользователя с датой/временем/IP. Для этого я отправляю функцию javascript с адресом электронной почты (html-шаблон), который просто предупреждает адрес электронной почты пользователя, когда пользователь открывает этот адрес электронной почты, например:

for($n=0; $n<sizeof($checkBox); $n++){
        $mail = new PHPMailer();
        $mail->IsHTML(true);
        $mail->Subject = $subject;
        $function = "<script language='javascript'>function stats(emailId){alert(emailId);}</script>";
        $bodyOpen = "<body onload='stats(".$checkBox[$n].");'>"; 
        $msg_body .= $body .= "<table><tr><td>Hello Everyone</td></tr></table></body>";
        $mail->Body = $function.$bodyOpen.$msg_body;
        $mail->WordWrap = 50;
        $mail->FromName = 'Muhammad Sajid';
        $mail->IsMAIL();        
        $mail->From = '[email protected]';
        $mail->AddAddress($checkBox[$n]);
        $sent = $mail->Send();
    }

шаблон html отлично работает и отображает всплывающее окно предупреждения при загрузке страницы, но оно не работает, если я использую этот шаблон html.

И я только хочу решить эту проблему, используя PHP5.x.x/javascript, никакого другого программного обеспечения или стороннего инструмента. Любая помощь..?

4b9b3361

Ответ 1

Добавить заголовок сообщения электронной почты:

Disposition-Notification-To: [email protected]

Как уже упоминалось выше, он не является надежным и лучше делать что-то вроде этого:

<img src="http://yourdomain.com/emailreceipt.php?receipt=<email of receiver>" />

И запишите его в базу данных, хотя снова это ограничивается способностью клиента электронной почты показывать изображения, а иногда даже может помещать почту в мусор, поскольку она не обнаруживает изображение... обходной путь, который будет фактически выводя изображение (скажем, ваш логотип) в конце этого script.

Изменить: Быстрый поиск в классе phpmailer дал мне следующее:

$mail->ConfirmReadingTo = '[email protected]';

но он аналогичен методу Disposition-Notification-To выше.

Ответ 2

Отправьте изображение маяка в сообщения электронной почты таким образом

<img src='http://www.yourserver.com/beacon.php?email_id=$email_id&email_address=$user_address' style='width:1px;height:1px'>

И затем используйте файл beacon.php для регистрации данных. Затем вы захотите вывести изображение 1X1 с соответствующими заголовками.

Важное примечание. Многие популярные почтовые клиенты (такие как Gmail) теперь блокируют внешние образы, поэтому это далеко не доказательство дурака.

Ответ 3

Это практически невозможно сделать на 100% эффективно.

  • Вы можете контролировать, где хранится контент, например. http://www.example.com/34hg038g85gb8no84g5 и предоставить ссылку в электронном письме на этот контент, вы можете обнаружить, когда этот URL был просмотрен.

  • Используйте метод, используемый MailChimp и другими кампаниями рассылки, помещайте невидимое изображение в свой адрес электронной почты, это изображение должно находиться на сервере, которым вы управляете, затем вы можете обнаружить, когда это изображение попадает, когда пользователь открывает адрес электронной почты.

Ответ 4

Это невозможно по определению.

Ответ 5

Mailreaders не являются браузерами, они не поддерживают javascript. Они даже не поддерживают правильный CSS, поэтому не ожидайте слишком многого. Поэтому я честно не вижу, как вы можете делать то, что вы пытаетесь сделать

Ответ 6

Я просто добавляю одну строку:

$dt = date('F \ jS\,\ Y h:i:s a');
for($n=0; $n<sizeof($checkBox); $n++){
   $mail = new PHPMailer();
   $mail->IsHTML(true);
   $mail->Subject = $subject;
   $src = "<img src='msajid.isgreat.org/readmail.php?dt=".$dt."&eid=".$checkBox[$n]."' />";
   $msg_body .= $src .= "<table><tr><td>Hello Everyone</td></tr></table>";
   $mail->Body = $function.$bodyOpen.$msg_body;
   $mail->WordWrap = 50;
   $mail->FromName = 'Muhammad Sajid';
   $mail->IsMAIL();        
   $mail->From = '[email protected]';
   $mail->AddAddress($checkBox[$n]);
   $sent = $mail->Send();
}

и в файле readmail.php просто добавьте дату/время и идентификатор пользователя с проверкой (если не существует с прикрепленной датой/временем) и исправил ее только для Gmail, hotmail, но не для Yahoo., Может ли кто-то помочь также исправить для Yahoo....?

Haaaa. глупая ошибка, просто используйте полный url like:

$src = "<img src='http://www.msajid.isgreat.org/readmail.php?dt=".$dt."&eid=".$checkBox[$n]."' />";

и он также будет работать для Yahoo....

Ответ 7

Я знаю, что это старый поток, но я просто должен был ответить... для тех из нас, кто должен это учитывать, я предлагаю, чтобы мы поставили себя на место людей, которым приходится писать антиспамовое программное обеспечение, чтобы помешать наши усилия. Обнаружение? или .php(или другое script/двоичное расширение) внутри тега изображения было бы тривиально для меня как постулированный программист "спам-убийца"... так же, как определение изображения 1x1 было бы...

Я провел 2,5 года в качестве Национального цифрового директора для президентской кампании, которая собрала 20 миллионов долларов, прежде чем у нас даже появился кандидат - вот то, что я разработал для этой кампании:

  • При отправке (или раньше) создайте хэш на адресе TO: email и сохраните его в db рядом с адресом электронной почты.

  • Используйте хеш, который мы только что создали, чтобы изменить небольшой, но явно видимый логотип в письме и сделать копию логотипа с хешем в имени файла логотипа, например: emxlogox.0FAE7E6.png - обратитесь к этому уникальное изображение в электронной почте для логотипа - сделайте копию логотипа с именем хэша в имени файла. Эта конкретная серия логотипов появляется только в адресных массовых электронных сообщениях. Предупредить членов экипажа не копировать его для других целей (или переименовать его, если они это сделают). Первая часть имени файла должна быть тем, что не будет отображаться в журналах в других контекстах, чтобы ускорить ваш синтаксический анализ и код, который вы должны обработать, чтобы отсортировать ложные образы.

  • Разбирайте журналы для появления запрошенных логотипов и извлекайте хэш из имени файла, чтобы он соответствовал одному адресу электронной почты. И ваша программа синтаксического анализа также может получить IP-адрес и время, необходимое для их получения и открытия электронной почты, чтобы вы могли идентифицировать высокочувствительных получателей и тех, кто взял неделю, чтобы открыть письмо. Сделайте гео-поиск на IP-адресе и посмотрите, совпадете ли вы с местоположением, которое у вас уже есть, и/или начните запись их шаблонов путешествий (или шаблонов использования прокси). Geo deltas также может идентифицировать электронную почту вперед.

Такой же хэш, конечно, используется для записи кликов, а также для первого и второго опций. (Теперь у вас есть "досье" нескольких опций для ответов на эти отчеты о нарушениях, и вы также защищаете свою репутацию по электронной почте).

Этот метод также может использоваться для определения того, кто отправляет электронные письма своим друзьям, и вы просите этих "хороших экспедиторов" присоединиться к какой-то элитной команде добровольцев, предлагая им скидки или вознаграждения или что-то подходящее для вашего бизнеса/проекта... в сущности, тот же хеш также становится ссылочным кодом.

Вы также можете попросить их щелкнуть правой кнопкой мыши по логотипу в электронном письме и сохранить его, не изменяя имя файла, а затем отправить его в "везде" (изображение должно иметь незаметную, понятную, содержательную ссылку на нее, а не нечитаемую bit.ly shortlink). Затем вы можете использовать API поиска Google, чтобы определить, кто вам помог, и поблагодарить их или дать им награды... Для этого помогает, если первая часть вашего имени файла логотипа действительно уникальна, например unsportingly.unique.emxlogox.0FAE7E6.png, поэтому вам не нужно делать миллионы запросов API поиска Google - просто выполните поиск по уникальной первой части имени файла - и посмотрите на хеши после получения хитов.

Вы сохраняете ссылки, где их копия логотипа появилась в вашем db, чтобы добавить к вашему досье, где в сети они активны и вам помогли.

Да, это медленный и обременительный, но в наши дни, когда мы говорим, что хотим развивать "отношения" с нашим списком рассылки, это то, что вам нужно сделать, чтобы дать индивидуальное лечение; идентифицировать и вознаграждать своих друзей. И да, вы получаете миллионы этих хэшированных изображений файлов в одном каталоге, но хранилище дешево, и это стоит того, чтобы действительно иметь эти отношения с вашими взглядами.

Ответ 8

Вы не можете добавить javascript в свои электронные письма.
Единственное решение - иметь только ссылку в письме и сообщение на сервере. Тогда вы могли бы знать, что само сообщение было просмотрено.

Ответ 9

Встраивание пользовательского изображения (1px blank может быть хорошим) в электронном письме и запись, является ли оно горячим или нет, это справедливое решение. Но проблема Gmail как клиента блокирует внешние изображения по умолчанию.

Ответ 10

Подробнее о MDN можно узнать RFC-3798.

Ответ 11

Как последнее сообщение было некоторое время назад, я не уверен, работает ли этот метод.

Я протестировал этот метод на сервере под управлением PHP 5.4.30, и он, похоже, не выводит изображение.

Это очень простой код:

<img src="http://theservername.com/myaccount_email_read_offline.php">

Обратите внимание, что я удалил запрос и любой дополнительный код из этого изображения.

Открывая эту отдельную страницу, myaccount_email_read_offline.php отображал изображение.

Однако попытка включить изображение, включив в него файл PHP, не работает.

Ответ 12

Пока я не понял, почему простой PHP файл не генерировал включенное изображение (как упоминалось в моем сообщении 6 часов назад), вот еще один очень сложный способ создания файла изображения, который не был отклонен мой собственный 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 gif с именем "message_open_tracking.gif".

Файл index.php также можно пересмотреть, чтобы использовать message_id, чтобы отметить это сообщение как прочитанное. Если другие переменные включены в число запросов, таких как адрес электронной почты получателя, эти значения также могут использоваться в этом файле index.php.

Большое спасибо Беннетт Стоун за следующую статью: http://www.phpdevtips.com/2013/06/email-open-tracking-with-php-and-mysql/