我有一些自动电子邮件,在我的网站注册完成后发送.
直到最近,他们工作得很好.现在Google的新系统正在重写图像并将其存储在缓存中(据称)
但是,谷歌对我的图像链接的新重写完全破坏了它们,给出了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库和Ubuntu服务器,但我不确定是否与此问题有关.
我想我已经找到了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作为扩展名.
您的图片网址必须直接映射到您的图片上.
如果您需要为受保护的图像使用某个代理URL,那么您的响应必须包含正确的标题
Content-Type: image/jpeg
文件扩展名和内容类型标头必须匹配
状态代码必须是200而不是403,500等
重要的提示
尝试重复每次运行php-email脚本的整个过程.因为每次GoogleImageProxy都会缓存您的图片,您必须为每次尝试重复相同的过程.
希望这将解决大多数人的问题.
我遇到了类似的问题,但这是由URL的长度引起的.从gmail缓存图片时,Google会生成以下网址:
https://ci4.googleusercontent.com/proxy/[hash]#[url])
生成的哈希值基于图像的URL,但大小将根据使用的字符而有所不同.我使用不同大小的URL运行了几个测试,并发现如果哈希长度超过2076个字符(接近2048个字节+ meta?不确定),则缓存的图像将无法一致地加载(400 /无效请求).
同样,图像URL可以生成超过这1000多个特殊字符或1500多个简单字符的多个字符的散列.如果散列的长度超过2076个字符,则请求失败.
我意识到这是一个老帖子,但希望这有助于其他开发人员搜索谷歌
根据您的示例,您似乎使用传统扩展(.jpg,.png,.gif).这个线程上的一些人描述了你所面临的相同问题,他们表示使用这些扩展解决了这个问题.
其他可能的方案:
由于谷歌的图片代理,图片链接在Gmail中断开
令人怀疑,但可能是一个cookie问题
图片网址代理白名单设置 - 这已成为Google Apps下的少数用户的解决方案.当图片网址附加了https://ci4.googleusercontent.com/proxy后,通过Gmail未显示图片
我知道这是一个古老的问题,但同样的事情发生在我身上.当我检查我的访问日志时,这是我发现的 -
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上的图片显示正常.希望有所帮助.