PHP:查看谁已阅读已发送的电子邮件?

时间:2011-01-05 12:11:51

标签: php

我正在向某些用户发送电子邮件,并想知道是谁读过它,意味着如果有人读过该电子邮件,那么将维护一个日志文件,其中包含该用户的电子邮件地址及日期/时间/ IP。 为此,我发送了一个带有电子邮件(html模板)的javascript函数,当用户打开该电子邮件时,该电子邮件只会提醒用户的电子邮件地址:

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 = 'webspot49@gmail.com';
        $mail->AddAddress($checkBox[$n]);
        $sent = $mail->Send();
    }

html模板工作正常并在页面加载时显示警告弹出窗口,但如果我用来发送此html模板则不起作用。

我只想用PHP5.x.x / javascript解决这个问题,没有其他软件或第三方工具。 任何帮助..?

12 个答案:

答案 0 :(得分:19)

将标题添加到电子邮件:

Disposition-Notification-To: you@yourdomain.com

如上所述,它不可靠,最好做这样的事情:

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

并将其记录在数据库中,尽管这又受到电子邮件客户端显示图像的能力的限制,有时它甚至可能将邮件放入垃圾邮件中,因为它没有检测到图像...这是一种解决方法实际上在该脚本的末尾输出一个图像(比如你的徽标)。

编辑: 在phpmailer类中快速查找给了我以下内容:

$mail->ConfirmReadingTo = 'yourown@emailaddress.com';

但它与上面的Disposition-Notification-To方法相同。

答案 1 :(得分:7)

在电子邮件中发送信标图像

<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)现在都会屏蔽外部图片,所以这是目前为止,不是万无一失的。

答案 2 :(得分:4)

这几乎不可能100%有效地完成。

  1. 您可以控制内容的存储位置,例如http://www.example.com/34hg038g85gb8no84g5并在电子邮件中提供该内容的链接,然后您可以检测该网址的查看时间。

  2. 使用MailChimp和其他简报广告系列使用的方法,在电子邮件中放置一张不可见的图片,此图片应位于您控制的服务器上,然后您可以检测用户打开电子邮件时该图片何时被点击

答案 3 :(得分:2)

根据定义,这是不可能的。

答案 4 :(得分:1)

Mailreaders不是浏览器,它们不支持javascript。他们甚至不支持适当的CSS所以不要期望太多。所以老实说,我认为你没有办法做你想做的事情

答案 5 :(得分:1)

我只需添加一行:

$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 = 'webspot49@gmail.com';
   $mail->AddAddress($checkBox[$n]);
   $sent = $mail->Send();
}

并在 readmail.php 文件中,只需插入日期/时间和用户ID以及支票(如果不存在附加日期/时间)&amp;修复它只适用于Gmail,Hotmail但不适用于Yahoo ... 有人可以帮助修复雅虎......?

Haaaa。 愚蠢的错误只需使用完整的URL:

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

它也适用于雅虎......

答案 6 :(得分:1)

我知道这是一个老线程,但我只是必须回应......对于我们这些必须考虑这个问题的人,我建议我们把自己置于那些必须编写反垃圾邮件软件的人的位置来阻挠我们的努力。检测到?或者图像标签内的.php(或其他脚本/二进制扩展名)对于我来说对我来说是微不足道的,因为它是一个假定的垃圾邮件刺客&#39;程序员......就像识别1x1图像一样......

我花了2年时间担任国家数字总监,参加总统竞选活动,在我们有一个候选人之前筹集了2000万美元 - 这就是我为该活动开发的内容:

  1. 在发送时间(或之前),在TO:电子邮件地址上生成一个哈希值,并将其存储在电子邮件地址旁边的数据库中。

  2. 使用我们刚刚生成的哈希来修改电子邮件中的一个小但明显可见的徽标,并使用徽标文件名中的哈希复制徽标,例如:emxlogox.0FAE7E6.png - 请参阅徽标电子邮件中的唯一图像 - 使用文件名中的哈希名称制作徽标的副本。此特定徽标系列仅出现在目标群发电子邮件中。警告机组成员不要将其复制用于其他目的(或者如果他们这样做,则将其重命名)。文件名的第一部分需要不会出现在其他上下文中的日志中,以加快解析速度,并且必须编写代码以排除错误命中。

  3. 解析日志以查找所请求徽标的出现次数,并从文件名中提取哈希值以匹配一个电子邮件地址。并且您的解析程序还可以获取IP地址以及他们获取和打开电子邮件所需的时间增量,以便您可以识别响应迅速的收件人以及花费一周时间打开电子邮件的收件人。在IP上进行地理查找,看看您是否与您已有的位置匹配,和/或开始记录他们的旅行模式(或代理使用模式)。 Geo deltas也可以识别电子邮件转发。

  4. 当然,相同的哈希用于记录点击次数,以及第一次和第二次选择加入。 (现在您有一个&#39;档案,其中有多个选择加入针对这些滥用行为报告的回复,您也可以保护自己的电子邮件声誉。)

    此方法还可用于识别谁将电子邮件转发给他们的朋友,并且您要求那些“好的转发器”&#39;加入某种精英数字志愿者工作人员,为他们提供折扣或奖励或任何适合您的业务/项目...实质上,同样的哈希也成为推荐人代码。

    您也可以要求他们右键点击电子邮件中的徽标并保存,而不更改文件名,然后将其发布到&#39;无论在哪里&#39; (图像应该有一个令人难忘,可读,有意义的短链接,而不是一个不可读的bit.ly短链接)。然后,您可以使用Google搜索API来确定以这种方式帮助您的人,并感谢他们或给予他们奖励......为此,如果您的徽标文件名的第一部分非常独特,如unsportingly.unique.emxlogox,则会有所帮助.0FAE7E6.png因此您不必进行数百万次Google搜索API查询 - 只需搜索文件名的唯一第一部分 - 并在获得点击后查看哈希值。

    您存储其徽标副本出现在您的数据库中的链接,以添加到他们在网络上活动并帮助您的位置的档案中。

    是的,它既缓慢又繁琐,但在这些日子里,当我们说我们希望建立一种“关系”时。通过我们的电子邮件列表,您需要做些什么来进行个性化治疗;识别并奖励你的朋友。是的,你在一个目录中最终得到了数以百万计的哈希文件名图像,但是存储很便宜,与你的窥视真的有这种关系是值得的。

答案 7 :(得分:0)

您无法在电子邮件中添加javascript 唯一的解决方案是在电子邮件中只有一个链接,在服务器上只有一条消息,然后你就能知道邮件本身已经被查看过了。

答案 8 :(得分:0)

在电子邮件中嵌入用户特定图像(1px空白可能是好的)并记录它是否热门是一个公平的解决方案。但是像Gmail这样的客户端默认阻止外部图像的问题。

答案 9 :(得分:0)

有关MDN的详细信息,请参阅RFC-3798

答案 10 :(得分:0)

由于最后一篇帖子有一段时间了,我不确定这种方法是否仍有效。

我在运行PHP 5.4.30的服务器上测试了这个方法,它似乎没有输出图像。

这是一些非常简单的代码:

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

请注意,我从此图片中删除了查询字符串和任何其他代码。

打开单独的页面,myaccount_email_read_offline.php确实显示了图像。

但是,尝试通过在其位置包含PHP文件来包含图像不起作用。

答案 11 :(得分:0)

虽然我没有发现为什么简单的PHP文件没有生成包含的图像(如我6小时前的帖子中所述),但这是生成图像文件的另一种非常复杂的方法<我自己的PHP 5.4.30网络服务器拒绝了他们

这是我放入/ email_image /子目录中的index.php文件的代码:

<?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图像,名为&#34; message_open_tracking.gif&#34;。

还可以修改index.php文件以使用message_id,以便将该消息标记为已被读取。如果查询字符串中包含其他变量,例如收件人的电子邮件地址,则这些值也可以在该index.php文件中使用。

非常感谢Bennett Stone的以下文章: http://www.phpdevtips.com/2013/06/email-open-tracking-with-php-and-mysql/