Gmail的新图片caching正在打破新闻稿中的图片链接

我收到了一些自动发送的电子邮件,这些电子邮件是在我的网站注册完成后发送的。

直到最近,他们工作得很好。 现在Google的新系统正在重写图像并将其存储在caching中 (据说)

然而,谷歌新的重写我的图像链接是完全打破他们,给500错误和一个破碎的链接图像。

让我说我正常的图像url是:

http://www.mysite.comhttp://img.dovov.compic1.jpg 

Google正在将其改写为:

 https://ci5.googleusercontent.com/proxy/vI79kajdUGm6Wk-fjyicDLjZbCB1w9NfkoZ-zQFOB2OpJ1ILmSvfvHmE56r72us5mIuIXCFiO3V8rgkZOjfhghTH0R07BbcQy5g=s0-d-e1-ft#http://www.mysite.comhttp://img.dovov.compic1.jpg 

但是,该URL没有任何内容。

电子邮件显示图片错误

所以,无论是由Google创build的链接有问题,还是图片只是没有上传到googleusercontent服务器,但我不知道如何解决这个问题。

我使用PHP, phpmailer库和Amazon EC2上的Ubuntu服务器,但我不知道这是与问题有关。

我想我已经find了GoogleImageProxy的问题。

这与CACHING概念有关。 假设你最近在服务器上部署了你的php代码,但是你忘记了上传图片。 你用你的电子邮件逻辑testing过一次。 你的系统生成一个HTML电子邮件。 当这封电子邮件发送到gmail服务器时,GoogleImageProxy会尝试将您网站上的图像提取并存储到自己的代理服务器上。 在获取图像时,GoogleImageProxy发现了一些404状态来对付你丢失的图像,403对一些受保护的图像。 GoogleImagesProxy已经将这些状态存储到自己的代理服务器中。

现在试图打开你的电子邮件,你注意到一些404状态对你的图像。 这是可以理解的。 你立即意识到你忘了上传一些图片,所以你上传到你的服务器。 并且还修复了一些针对受保护图像的权限。

你们现在都完成了。 现在你试着再次运行你的php-email脚本。 因此,您会在Gmail或Hotmail收件箱中收到另一封电子邮件。 你已经修复了你的图片的所有问题。 现在图像必须显示在您的电子邮件内容中。 但是你仍然无法看到图像。

啊,可能你忘了清除浏览器的caching。 清除浏览器的caching并再次加载gmail或hotmail页面。 但结果仍然是一样的。 尝试应用几十个修复程序/补丁,并尝试运行您的PHP电子邮件脚本成千上万次。 但结果仍然是一样的。 没提升。

真正的问题

这到底是怎么回事? 让我给你解释一下。 转到您的访问日志,并尝试查找来自GoogleImageProxy的请求。 您会惊讶地发现,根据您电子邮件中使用的不同图片的数量,GoogleImageProxy将只有两三个请求。 GoogleImageProxy从未尝试获取图像即使在通过上传丢失图像并设置受保护图像的权限解决了图像的问题之后。 为什么? 清除浏览器的caching没有任何影响。 GoogleImageProxy将永远不会为新的电子邮件获取新的图像,因为这些图像现在被caching到GoogleImageProxy以及最后一个状态码中,而不是caching在您自己的浏览器中。

GoogleImageProxy已经为图像设置了自己的失效date。 我想一个月。 所以现在图像的新副本将在失效date之后获取。 我的意思是一个月后 您不能强制GoogleImageProxy获取图像。 但它对你来说在你的电子邮件中显示图像很重要。 什么是解决scheme?

解决scheme

以下是强制GoogleImageProxy获取图片的唯一方法

  • 将图片重命名为其他只有png,jpg或gif扩展名的图片。
  • 不要在图像url中使用任何types的查询string,例如?t=34343
  • 您的图片必须包含png,jpg或gif作为扩展名。
  • 您的图片url必须直接映射到您的图片上。
  • 如果您需要为受保护的图片使用一些代理url,那么您的响应必须包含像Content-Type: image/jpeg这样的正确标题Content-Type: image/jpeg
  • 文件扩展名和内容types标题必须匹配
  • 状态码必须是200而不是403,500等

重要的提示

尝试重复每个运行的PHP电子邮件脚本的整个过程。 因为每次GoogleImageProxy都会caching你的图片,你将不得不为每一次新的尝试重复相同的过程。

希望这能解决大多数人的问题。

基于你的例子,它看起来像你使用传统的扩展(.jpg,.png,.gif)。 在这个线程上的一些人 ,描述了你面临的同样的问题,已经表示使用这些扩展解决了这个问题。

其他可能的解决方

我知道这是一个古老的问题,但同样的事情发生在我身上。 当我检查我的访问日志,这是我发现 –

 www.example.ca 66.249.85.50 - - [10/Apr/2014:17:57:18 -0400] "GET /newsletters/Apr10_2014/cad/cad2.jpg HTTP/1.1" 403 457 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (via ggpht.com GoogleImageProxy)" 

你可以看到我的服务器阻止GOOGLEIMAGEPROXY给予403 Forbidden的回复。 我决定检查我的.htaccess,果然我阻止了PROXY这个词。 删除该字词后,现在Gmail上的图片显示得很好。 希望有所帮助。

我遇到了类似的问题,但这是由URL的长度引起的。 Google从gmailcaching图片时会生成以下url:

 https://ci4.googleusercontent.com/proxy/[hash]#[url]) 

生成的散列值基于图像的URL,但大小将根据所使用的字符而有所不同。 我运行了几个不同大小的URL的testing,发现如果哈希长度超过2076个字符(接近2048字节+ meta?不确定),caching的图像将无法持续加载(400 /无效的请求)。

同样,图像URL可能会生成一个散列,超过1000个特殊字符或1500多个简单字符中的许多字符。 如果散列长度超过2076个字符,则请求失败。

我意识到这是一个旧的post,但希望这可以帮助其他开发者淘Google

确保Gmail通过http请求您的图片,而不是https

让我们说你正常的图片url是:

 https://www.mysite.comhttp://img.dovov.compic1.jpg 

所以改成:

 http://www.mysite.comhttp://img.dovov.compic1.jpg 

我有一个强烈的感觉,谷歌的代理不cachinghttps

检查服务器为图像文件返回的内容types是否正确。

你可以使用Fiddler来检查。

HTTPS映像位置caching。 我们的几个生产环境在使用HTTPS uri的gmail代理映像位置方面没有问题。 如果SSL证书以某种方式无效,我可以看到gmail忽略您的内容。

这是3月6日,你可能已经知道了这一点,但是我以为我会帮助别人。 我发现JPG在gmail中不起作用。 PNG格式很好。 对不起,我无法解释为什么,但有时最好不要问为什么。 使用PNG!