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

问题描述 投票:74回答:12

我有一些自动电子邮件,在我的网站注册完成后发送。

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

但是,谷歌对我的图像链接的新重写完全破坏了它们,给出了500错误和链接图像损坏。

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

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

谷歌正在将此重写为:

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

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

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

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

image caching gmail rewrite
12个回答
68
投票

我想我已经找到了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都会缓存您的图片,您必须为每次尝试重复相同的过程。

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


0
投票

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

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

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

现在,您可以将此徽标添加到HTML Body中的任何位置

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

就这样。



-5
投票

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


25
投票

根据您的示例,您似乎使用传统扩展(.jpg,.png,.gif)。 Some folks on this thread描述了您面临的相同问题,并表示使用这些扩展解决了这个问题。

其他可能的方案:


7
投票

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

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

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

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

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


6
投票

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

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


3
投票

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


3
投票

我刚试过,在更换图像后(没有更改图像名称)

  • 在新浏览器中打开电子邮件,它会显示新图像
  • Chrome(我的默认浏览器)中的Ctrl + f5(强制缓存刷新)也显示新图像

1
投票

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

您可以使用Fiddler进行检查。


1
投票

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

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


0
投票

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

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

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

所以改为:

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

我有一种强烈的感觉,谷歌的代理不缓存https

© www.soinside.com 2019 - 2024. All rights reserved.