Gmail的新图像缓存打破了新闻通讯中的图像链接


105

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

直到最近,他们的表现还不错。现在,Google的新系统正在重写图像并将它们存储在缓存中(据称)

但是,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

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

电子邮件显示图像错误

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

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


您的服务器或提供映像的逻辑中是否具有任何安全功能?它仅在有限的时间内可用或具有此类功能吗?
2014年

没有任何一种安全功能或登录系统可以查看图像,它们位于系统的公用文件夹中。如果您访问原始链接,则可以看到图像。问题是Google对URL的重写要么没有将图像上传到他们的服务器,要么没有正确地将用户定向到我的网站。
RonnyKnoxville 2014年

1
博客和帖子审核后,没有发现此随机问题的实际解决方法(2013年3月)。我错了 ?
kheraud 2014年

4
这真让我发疯。google的电子邮件已损坏。我一直在Google论坛上的几个相关主题中活跃,并且一无所获。自2013
弥敦道(Nathan Beach)

这到哪里去了?我正在拔头发。图片是可公开访问的,直接进入图片时加载良好,内容类型匹配,并且Google的代理服务器在我的日志中仅获得200个OK。我不知道为什么图片不会显示在gmail中。
马特·布鲁梅尔

Answers:


83

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

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


9
tl; dr:您可能使用.svg,请改用.png .jpg或.gif
taylorstine 2016年

2
是的,不要使用svg;)
Alexandre Martini

1
我们从Azure Blob存储提供了一个映像,该映像的文件名中有一个空格。该图片在Gmail中无法正确显示。当我们删除文件名中的空格时,它解决了该问题。
Narthring '18 -10-31

1
@AlexandreMartini为什么不使用SVG?徽标是SVG中最好的,不是吗?
trainoasis

1
确保您对图像路径进行urlencode。路径中有一个空格,尽管浏览器会将其替换为%20,但gmail缓存不会并将其视为断开的链接。
乍得理查森

29

根据您的示例,您似乎正在使用传统扩展名(.jpg,.png,.gif)。该线程上的一些人描述了您面临的相同问题,他们表示使用这些扩展程序可以解决问题。

其他可能的解决方案:


1
这些是我自己研究此问题时发现的许多资源,但不幸的是,它们都没有给我答案。我仍然希望Google能够在我找到答案之前解决此问题
RonnyKnoxville 2014年

@JackalopeZero您是否尝试过在新闻通讯之外独立复制此问题?我在个人和公司的gmail上尝试了成功的结果。我知道这是一个问题,但是也许创建带有图像的新电子邮件可能会说明正在发生的事情。
JSuar 2014年

4
感谢您提供扩展技巧。我使用的是.svg图片,并且已确认这些图片不受Google代理的支持。
尼克·美林

1
我今天遇到了这个问题。对我来说,Google的代理为1x1透明抛出500错误pixel.gif。将其更改为1x1透明pixel.png,代理将按预期运行。奇怪的。
deefour 2014年

8

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

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

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

同样,图片URL可能会生成一个散列,该散列超出了〜1000个特殊字符或1500+个简单字符的数量。如果哈希长度超过2076个字符,则请求失败。

我意识到这是一篇过时的文章,但希望这可以帮助其他开发人员搜索Google


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禁止回复。我决定检查.htaccess并确定我已阻止PROXY一词。删除术语后,图像现在在Gmail上显示的很好。希望能有所帮助。


我也有一个403。我发现mod_security阻止了Google代理……
彼得

2
这正是我遇到的问题。您可以使用curl来测试是否遇到相同的配置问题:curl -I --user-agent "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)" -X GET https://example.com/your-image.png
Dave Teare 2015年

3

HTTPS图像位置会缓存。我们的几个生产环境在使用HTTPS uri的gmail代理图像位置方面都没有问题。如果SSL证书在某种程度上无效,我会看到gmail忽略了您的内容。


感谢更新。尽管前一阵子,现在我还没有找到答案的解决方案
RonnyKnoxville 2014年

根据我目前尝试创建包含图像和https协议的html电子邮件的经验,我确认这取决于证书。通过让我们在没有组织的情况下进行加密,该图像将在Gmail中被阻止。在使用包含组织的品牌证书时,图像会很好地显示出来。所以我想这是免费的还是品牌的证书,或者是其中声明的组织。
Tritof

3

我刚刚尝试过,替换图片后(不更改图片名称)

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

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


1

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

您可以使用Fiddler进行检查。


1

在我的情况下,文件大小是个问题,它是22 Mb(我知道吗?),在我们减小文件大小之后,一切都开始发挥作用。

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


不错的收获。Gmail的错误消息使它看起来像是输入错误或权限错误,这非常容易引起误解。
Luminaire

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


是的,我需要以后端为存储桶来设置负载均衡器和CDN,现在我的图像可以在云存储上正常工作
Wendel Nascimento

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();

就这样。



0

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

快乐的编码。


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

0

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


-1

确保Gmail要求的图片不是http,而是https

假设您的普通图片网址为:

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

因此更改为:

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

我强烈感觉到Google的代理不缓存https


好一点,该网站绝对使用https,所以可能是原因
RonnyKnoxville 2014年

19
“我强烈认为Google的代理不缓存https。” -您的感觉有误
2014年

1
这工作了!我正在尝试使用http作为协议的工作原理,将包含外部图像的google电子表格单元格复制并粘贴到电子邮件中。

这是错误的,为什么Google不能通过https缓存图像?
southpaw93

Google并未提及有关对https提起诉讼的任何消息,因此这种强烈的感觉被浪费了
Blue Clouds

-7

现在是3月6日,您可能已经知道了这一点,但是认为我会乐于助人。我发现JPG无法在gmail中使用。PNG格式效果很好。抱歉,我无法解释原因,但有时最好不要问原因。使用PNG!


我不敢相信Google会真正考虑该解决方案。无论如何,我都将尝试使用它,因为我们的新闻简报对我们的Gmail用户而言很糟糕。
弥敦道海滩

这是不正确的,Gmail也支持JPEG文件
威尔

它支持jpgs
managerger

我使用png并得到相同的问题。
爱德华多·诺布雷
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.