Gmail的新图片缓存正在破坏简报中的图片链接

时间:2014-01-03 12:43:27

标签: image caching gmail rewrite

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

直到最近,他们工作得很好。现在Google's new system is rewriting the images and storing them in it's cache(据说)

然而,Google对我的图片链接进行了新的重写,完全破坏了它们,造成了500错误和链接图像损坏。

让我们说我的正常图片网址是:

http://www.mysite.com/images/pic1.jpg

Google将此重写为:

https://ci5.googleusercontent.com/proxy/vI79kajdUGm6Wk-fjyicDLjZbCB1w9NfkoZ-zQFOB2OpJ1ILmSvfvHmE56r72us5mIuIXCFiO3V8rgkZOjfhghTH0R07BbcQy5g=s0-d-e1-ft#http://www.mysite.com/images/pic1.jpg

但是,该网址没有任何内容。

Email showing image errors

因此,要么Google创建的链接出现问题,要么图片没有上传到googleusercontent服务器,但我不知道如何解决问题。

我在Amazon EC2上使用PHP,phpmailer library和Ubuntu服务器,但我不确定是否与此问题有关。

16 个答案:

答案 0 :(得分:61)

我想我已经找到了GoogleImageProxy问题。

这与CACHING概念有关。假设您最近在服务器上部署了PHP代码,但忘记上传图像。您使用电子邮件逻辑测试了一次。您的系统生成了HTML电子邮件。当此电子邮件发送到gmail服务器时,GoogleImageProxy将尝试从您的站点获取图像并将其存储到自己的代理服务器。在获取图像时,GoogleImageProxy发现了一些针对丢失图像的404状态,以及针对某些受保护图像的403状态。 GoogleImagesProxy已将这些状态存储到自己的代理服务器中。

现在尝试打开您的电子邮件,您发现了一些针对您图片的404状态。这是可以理解的。您立即意识到忘记上传某些图片,因此您将它们上传到您的服务器。并且您还修复了一些针对受保护图像的权限。

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

啊,可能你忘记清除浏览器的缓存了。清除浏览器的缓存并再次加载gmail或hotmail页面。但结果仍然是一样的。尝试应用几十个修补程序/补丁,并尝试运行您的php-email脚本数千次。但结果仍然是一样的。没有改善。

真正的问题

到底是怎么回事?让我向你解释一下。转到您的访问日志,尝试从GoogleImageProxy查找请求。您会惊讶地发现GoogleImageProxy只会有2或3个请求,具体取决于您电子邮件中使用的不同图片的数量。 GoogleImageProxy从未尝试过获取图片即使您已经通过上传丢失的图像和设置受保护图像的权限来解决图像问题。为什么?清除浏览器的缓存没有任何影响。 GoogleImageProxy永远不会为您的新电子邮件获取新鲜图片,因为这些图片现在与其上一个状态代码一起缓存到GoogleImageProxy中,而不是缓存在您自己的浏览器中。

GoogleImageProxy已为图片设置了自己的到期日期。我想一个月。所以现在新的图像副本将在到期日后获取。我的意思是一个月后。您无法强制GoogleImageProxy获取图像。但是,在您的电子邮件中显示图像非常重要。什么可以解决方案?

解决方案

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

  • 使用png,jpg或gif扩展名将图像重命名为其他图像 仅
  • 请勿在图片网址中使用任何类型的查询字符串,例如?t=34343
  • 您的图片必须包含png,jpg或gif作为扩展名。
  • 您的图片网址必须直接映射到您的图片上。
  • 如果您需要为受保护的图片使用某个代理网址,那么您的回复必须包含正确的标题 Content-Type: image/jpeg
  • 文件扩展名和内容类型标题必须匹配
  • 状态代码必须为200而不是403,500等

重要提示

尝试重复每次运行php-email脚本的整个过程。因为每次GoogleImageProxy都会缓存您的图片,并且您必须为每次尝试重复相同的过程。

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

答案 1 :(得分:25)

根据您的示例,您看起来使用的是传统扩展程序(.jpg,.png,.gif)。 Some folks on this thread描述了您面临的相同问题,并声明使用这些扩展可以解决问题。

其他可能的解决方案:

答案 2 :(得分:7)

我遇到了类似的问题,但这是由网址的长度引起的。从gmail缓存图片时,Google会生成以下网址:

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

生成的哈希值基于图像的URL,但大小将根据使用的字符而有所不同。我使用不同大小的URL运行了几次测试,发现如果哈希超过2076个字符(接近2048字节+元?不确定),缓存的图像将无法一致地加载(400 /无效请求) )。

同样,图像URL可以生成超过这1000多个特殊字符或1500多个简单字符的多个字符的哈希值。如果散列长度超过2076个字符,则请求失败。

我意识到这是一个老帖子,但希望这有助于其他开发人员搜索Google

答案 3 :(得分:5)

我知道这是一个老问题,但同样的事情发生在我身上。当我检查我的访问日志时,这就是我找到的 -

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上的图片显示正常。希望有所帮助。

答案 4 :(得分:3)

HTTPS图像位置执行缓存。我们的一些生产环境使用HTTPS uri对gmail代理图像位置没有任何问题。如果SSL证书在某种程度上无效,我可以看到gmail忽略了你的内容。

答案 5 :(得分:3)

我刚试过, 更换图像后(不更改图像名称)

  • 在新浏览器中打开电子邮件,它会显示新图像

  • Ctrl + f5(强制缓存刷新)在chrome(我的默认浏览器)中, 还显示新图像

答案 6 :(得分:1)

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

您可以使用Fiddler进行检查。

答案 7 :(得分:1)

在我的情况下,文件的大小是问题,它是22 Mb(我知道对吗?),在我们缩小尺寸后,一切都开始像魅力一样。

检查文件大小,如果文件太大,请将其压缩。

答案 8 :(得分:1)

我知道这是一个老问题,但我遇到了这个问题。就我而言,图像存储在Google Cloud Storage中。有趣的是该链接

https://storage.cloud.google.com/{bla_bla}/logo.png

返回307(临时重定向)和Location标头,其中包含类似

https://{xxx}-apidata.googleusercontent.com/{bla-bla_bla}/logo.png?{zzz}

似乎GoogleImageProxy无法正确处理307

答案 9 :(得分:0)

确保Gmail通过http而非https请求您的图片。

让我们说你的正常形象网址是:

https://www.mysite.com/images/pic1.jpg

所以改为:

http://www.mysite.com/images/pic1.jpg

我强烈认为谷歌的代理不会缓存https

答案 10 :(得分:0)

对于这个问题,我有一个完美的解决方案,如果您使用的是PHPMailer,那么这对我很有用,那么您只需在PHPMailer中添加另一个选项来附加这样的图像

$mail = new PHPMailer(); $mail->AddEmbeddedImage('../absolutepath/image/image.jpg', 'logoimg', '../absolutepath/image/image.jpg');

在这里,我们给出了图像的绝对路径,并给它命名为“ logoimg”或您想要的任何名称。

现在您可以像这样将徽标添加到HTML正文中的任意位置

$mail->Body = " <h1>Test of PHPMailer html body with image</h1> <p>This is a test picture: <img src=\"cid:logoimg\" /></p>"; $mail->send();

仅此而已。

答案 11 :(得分:0)

答案 12 :(得分:0)

我在发送gif时遇到了这个问题。我发现文件大小对Google的代理服务器很重要。我建议使文件尽可能小,看看是否可行。您可以使用您的Gmail帐户并从URL添加照片以进行测试。如果在撰写电子邮件时出现gif,则可以接收。

快乐的编码。

答案 13 :(得分:0)

  1. 可以在Outook / hotmail中使用吗?然后,我们应该可以将其隔离为Google问题。您的情况并非如此。
  2. 图像大小可能是个问题。尝试减少它,看看
  3. www.mysite.com可以从您的系统访问此站点。但 也可以从Google服务器访问它吗?
  4. 尝试更改扩展名。.诀窍是:您可能已经尝试了几件事,但仍会从缓存中获取(这会使您的工作无效),但是当扩展名更改时,它将再次获取并且您之前所做的所有工作都将进入玩,如果可行,您可能会以为是“扩展”才成功! (就像许多谈论扩展的人一样)

答案 14 :(得分:0)

在我遇到此问题的情况下,问题是电子邮件模板中图像的路径意外在URL中带有三斜杠,例如https:///content.example.org/image.png。很难发现这一点,当它在可以成功解析URL的其他电子邮件客户端中工作时,Google的图像代理无法处理它,并导致404为代理图像地址。

答案 15 :(得分:-5)

这是3月6日,你可能已经想到了这一点,但我想我会帮助其他人。我发现JPG在gmail中不起作用。 PNG格式非常有用。对不起,我无法解释原因,但有时最好不要问为什么。使用PNG!