跟踪像素和Gmail代理存在的问题

7

我正在尝试为从WordPress发送的电子邮件实现自定义跟踪像素。

感谢以下文章:

利用PHP和图片跟踪电子邮件

使用真实图像跟踪电子邮件打开情况

特别是

http://www.phpdevtips.com/2013/06/email-open-tracking-with-php-and-mysql/

我能够实现核心思想。

电子邮件通过以下方式加载跟踪像素: <img src="https://www.example.com/tracking.php?order_id=1" width="100" height="100" />

在tracking.php文件中:

$graphic_http =  'https://www.example.com/GIF-example.gif';

header('Content-Type: image/gif');
readfile( $graphic_http );

在浏览器中打开tracking.php文件会下载gif图像。

然而,在Gmail电子邮件中,跟踪像素/跟踪图片不显示。只有一个损坏的图像标志,当我点击显示图像时,会打开此链接:

https://ci5.googleusercontent.com/proxy/l2xUKFGnNFKm64zEYmJhOcUmEJm15w9MC1txRRF01tpKlcL3t3O16aMJgbYQkucBySV0xV2T0EsCwikOAC0Z4em6uPzSs38lkHrYBvosRRAk14EfPoEXqC5JdLxRm8ToZmGSQqt_RwHCaBE_3uLgQDVEB05Rdtkq-Xzuw30=s0-d-e1-ft#https://www.example.com/tracking.php?order_id=1

其中显示Google 404:

Google 404. That’s an error.

The requested URL /proxy/l2xUKFGnNFKm64zEYmJhOcUmEJm15w9MC1txRRF01tpKlcL3t3O16aMJgbYQkucBySV0xV2T0EsCwikOAC0Z4em6uPzSs38lkHrYBvosRRAk14EfPoEXqC5JdLxRm8ToZmGSQqt_RwHCaBE_3uLgQDVEB05Rdtkq-Xzuw30=s0-d-e1-ft was not found on this server. That’s all we know.

看起来是Google代理无法读取php脚本的问题。tracking.php和GIF-example.gif文件都具有775权限,并且可以公开访问。

在Hotmail上这确实可行,因此似乎是与Google代理有关的问题。

有人知道如何让Google代理访问此跟踪像素吗?

2个回答

4
我找到了答案:问题在于Google代理和链接中的问号? https://www.example.com/tracking.php?order_id=1

由于Google代理中已经有一个问号,所以出现了404错误。
我解决了这个问题,改用 https://www.example.com/tracking.php/order_id=1,然后在tracking.php文件中使用 $_SERVER['REQUEST_URI'] 解析了 /order_id= 字符串,而不是使用$_GET
该跟踪像素在Gmail中显示,并且可以在tracking.php脚本中跟踪。

我在Gmail发送邮件后,我的跟踪URL看起来像这样:<img src="https://ci5.googleusercontent.com/proxy/M0eT59-eQFXoo_sSnCIg9Xye-ZXIwyMulKSFO-m_i0PvlwtKsLn5WYr9Nqxq25TDGhOhnGCUeA8d0r4fCZtZ61V1fR-dEtgHO7E8SoJ2FMjs86GLYtlueZ75C4cxoQogEIsqfg=s0-d-e1-ft#http://xyz.abc.com:9099/MailMongo/trackmail/5b8cc4d738770a701aa1709b" alt="" class="CToWUd">。但是Gmail会发送两个服务器请求,如https://ci5.googleusercontent.com/proxy/M0eT59-eQFXoo_sSnCIg9Xye-ZXIwyMulKSFO-m_i0PvlwtKsLn5WYr9Nq........... 为什么它会在网络请求中删除我的跟踪器URL?请帮忙解决。 - sns

0

你的所有头部都试图强制浏览器下载文件并忽略它的文件类型(因为你从未说明文件类型)。要在浏览器中显示图像,您需要设置正确的头部。

基本上,您只需要执行以下操作:

$orderId = isset($_GET['order_id']) ? $_GET['order_id'] : null;

if ($orderId) {
    // Save stuff in your DB or how you want to log it.
}

header('Content-Type: image/gif');
echo file_get_contents('/absolute/path/to/image.gif');
exit; // Not really necessary, but just to make sure there's no more output.

感谢您的反馈。实际上,我在代码中已经加入了header('Content-Type: image/gif'),但是在问题描述中忘记添加了。感谢您指出这一点。然而,您提供的解决方案仍然无法解决问题。无论是file_get_contents还是readfile都无法正常显示图片,且代理图片内容在Google上显示404错误。 - MrWeix
如果您创建一个单独的页面并在其中放置相同的<img src="...." />标记,会发生什么?那么它对您是否有效?还是与服务器有关? - M. Eriksson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接