Nowe buforowanie obrazów w Gmailu przerywa linki do obrazów w newsletterze

105

Otrzymałem automatyczne e-maile, które są wysyłane po zakończeniu rejestracji w mojej witrynie.

Do niedawna działały dobrze. Teraz nowy system Google przepisuje obrazy i przechowuje je w swojej pamięci podręcznej (podobno)

Jednak nowe przepisywanie przez Google linków do moich obrazów całkowicie je psuje, powodując błąd 500 i uszkodzony obraz linku.

Powiedzmy, że mój normalny adres URL obrazu to:

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

Google przepisuje to na:

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

Jednak pod tym adresem URL nic nie ma.

E-mail z błędami obrazu

Więc albo jest coś nie tak z linkami, które są tworzone przez Google, albo obrazy nie są po prostu przesyłane na serwer googleusercontent, ale nie mam pojęcia, jak rozwiązać ten problem.

Używam PHP, biblioteki phpmailer i serwera Ubuntu na Amazon EC2, ale nie jestem pewien, czy jest to związane z problemem.

RonnyKnoxville
źródło
czy masz jakąś funkcję bezpieczeństwa na swoim serwerze lub logikę obsługującą obraz? czy jest dostępny tylko przez ograniczony czas czy tego rodzaju funkcje?
Pixou,
Nie ma żadnej funkcji bezpieczeństwa ani systemu logowania do przeglądania obrazów, są one w folderze publicznym w systemie. Jeśli odwiedzisz oryginalny link, obrazy będą widoczne. Problem polega na tym, że przepisywanie adresu URL przez Google albo nie przesyła obrazu na ich serwery, albo nieprawidłowo kieruje użytkownika do mojej witryny.
RonnyKnoxville,
1
Po przejrzeniu blogów i postów nie znaleziono prawdziwego obejścia tego losowego problemu (marzec 2013). Jestem w błędzie ?
kheraud
4
to doprowadza mnie do szaleństwa. Google ma uszkodzony e-mail. Byłem aktywny w kilku powiązanych wątkach na forach Google i nie mogę znaleźć żadnej odpowiedzi. to zostało zepsute od początku grudnia 2013 roku.
Nathan Beach,
Czy to gdzieś poszło? Wyrywam sobie włosy. Obrazy są publicznie dostępne, ładują się dobrze, gdy przechodzę do nich bezpośrednio, typy treści są zgodne, a serwer proxy Google nie otrzymuje nic poza 200 OK w moich dziennikach. Nie mam pojęcia, dlaczego obrazy nie pojawiają się w Gmailu.
Matt Brunmeier

Odpowiedzi:

83

Myślę, że rozwiązałem problem GoogleImageProxy.

To jest coś związanego z koncepcją CACHING. przypuśćmy, że niedawno wdrożyłeś kod php na serwerze, ale zapomniałeś załadować obrazy. raz przetestowałeś logikę poczty e-mail. Twój system wygenerował wiadomość e-mail w formacie HTML. Gdy ten e-mail dotrze do serwera Gmaila, GoogleImageProxy spróbuje pobrać i zapisać obrazy z Twojej witryny na swoim własnym serwerze proxy. podczas pobierania obrazów GoogleImageProxy znalazł około 404 statusów dla brakujących obrazów i 403 dla niektórych chronionych obrazów. GoogleImagesProxy przechował te stany na swoim własnym serwerze proxy.

Teraz, gdy próbowałeś otworzyć swój e-mail, zauważyłeś około 404 statusów na swoich obrazach. To jest coś zrozumiałego. Od razu zdałeś sobie sprawę, że zapomniałeś przesłać niektórych obrazów, więc przesłałeś je na swój serwer. a także ustaliłeś pewne uprawnienia do chronionych obrazów.

Wszystko gotowe. Teraz spróbuj ponownie uruchomić skrypt php-email. W rezultacie otrzymasz kolejną wiadomość e-mail w skrzynce odbiorczej Gmail lub Hotmail. naprawiłeś wszystkie problemy ze swoimi obrazami. Teraz obrazy muszą być wyświetlane w treści wiadomości e-mail. ale nadal nie możesz zobaczyć obrazów.

Ach, prawdopodobnie zapomniałeś wyczyścić pamięć podręczną przeglądarki. Wyczyść pamięć podręczną przeglądarki i ponownie załaduj stronę Gmail lub Hotmail. Ale wynik będzie nadal taki sam. Spróbuj zastosować dziesiątki poprawek / łatek i spróbuj tysiące razy uruchomić swój skrypt php-email. Ale wynik będzie nadal taki sam. Brak poprawy.

PRAWDZIWY PROBLEM

Co się do cholery dzieje? Pozwól, że ci to wyjaśnię. Przejdź do dziennika dostępu i spróbuj znaleźć żądania z GoogleImageProxy. Zdziwisz się, widząc, że będą tylko 2-3 żądania z GoogleImageProxy, w zależności od liczby różnych obrazów użytych w Twojej wiadomości e-mail. GoogleImageProxy nigdy nie próbowało pobierać obrazów Nawet po rozwiązaniu problemów z obrazami, przesyłając brakujące obrazy i ustawiając uprawnienia do obrazów chronionych. Czemu? Wyczyszczenie pamięci podręcznej przeglądarki nie ma żadnego wpływu. GoogleImageProxy nigdy nie pobierze nowych obrazów nawet dla nowszych wiadomości e-mail, ponieważ obrazy są teraz buforowane w GoogleImageProxy wraz z ich ostatnim kodem stanu i nie są przechowywane w pamięci podręcznej Twojej przeglądarki.

GoogleImageProxy wyznaczył własną datę ważności obrazów. Myślę, że miesiąc. więc teraz nowa kopia obrazów zostanie pobrana po upływie daty ważności. Mam na myśli po miesiącu. Nie możesz zmusić GoogleImageProxy do pobrania obrazów. Ale ważne jest, aby wyświetlać obrazy w wiadomości e-mail. Jakie może być rozwiązanie?

ROZWIĄZANIE

Oto jedyny sposób, aby zmusić GoogleImageProxy do pobrania obrazów

  • Zmień nazwę swoich obrazów na inną z rozszerzeniami png, jpg lub gif.
  • Nie używaj żadnego ciągu zapytania w adresie URL obrazu, takiego jak ?t=34343
  • Twój obraz musi zawierać jako rozszerzenie png, jpg lub gif.
  • adres URL obrazu musi być bezpośrednio odwzorowany na obraz.
  • Jeśli potrzebujesz użyć adresu URL proxy dla chronionych obrazów, Twoja odpowiedź musi zawierać odpowiedni nagłówek, taki jak Content-Type: image/jpeg
  • Rozszerzenie pliku i nagłówek typu treści muszą być zgodne
  • Kod statusu musi mieć wartość 200 zamiast 403, 500 itd

WAŻNA UWAGA

Spróbuj powtórzyć cały proces dla każdego uruchomienia skryptu php-email. ponieważ za każdym razem GoogleImageProxy będzie buforować twoje obrazy i będziesz musiał powtarzać ten sam proces dla każdej nowej próby.

Mam nadzieję, że rozwiąże to problem większości ludzi.

Malik Ahmed Khan Awan
źródło
9
tl; dr: prawdopodobnie używasz .svg, zamiast tego użyj .png .jpg lub .gif
taylorstine
2
tak, nie używaj svg;)
Alexandre Martini
1
Mieliśmy obraz obsługiwany z usługi Azure Blob Storage, który miał spację w nazwie pliku. Obraz nie byłby poprawnie wyświetlany w Gmailu. Usunięcie spacji w nazwie pliku rozwiązało problem.
Narthring
1
@AlexandreMartini, dlaczego nie użyć SVG? Logo jest najlepsze w formacie SVG, prawda?
trainoasis
1
Upewnij się, że kodujesz urlencode ścieżki obrazu. Mieliśmy spację na ścieżce i chociaż przeglądarki zastępują ją znakiem% 20, pamięć podręczna Gmaila tego nie robi i uważa, że ​​łącze jest uszkodzone.
Chad Richardson
29

Na podstawie Twojego przykładu wygląda na to, że używasz tradycyjnych rozszerzeń (.jpg, .png, .gif). Niektórzy ludzie w tym wątku , opisując te same problemy, z którymi się borykasz, stwierdzili, że użycie tych rozszerzeń rozwiązuje problem.

Inne możliwe rozwiązania:

JSuar
źródło
1
To wiele źródeł, które znalazłem, badając ten problem samodzielnie, niestety żadne z nich nie daje mi odpowiedzi, której szukam. Wciąż mam nadzieję, że Google rozwiąże ten problem, zanim uda mi się znaleźć odpowiedź
RonnyKnoxville.
@JackalopeZero Czy próbowałeś samodzielnie odtworzyć ten problem poza biuletynem? Wypróbowałem to na mojej osobistej i firmowej poczcie z sukcesem. Wiem, że to problem, ale może utworzenie nowej wiadomości e-mail z obrazami może rzucić światło na to, co się dzieje.
JSuar
4
Dzięki za wskazówkę dotyczącą rozszerzeń. Używałem .svgobrazów i potwierdzono, że nie są one obsługiwane przez proxy Google.
Nick Merrill
1
Sam dzisiaj na to wpadłem. Dla mnie proxy Google rzucało błąd 500 dla przezroczystości 1x1 pixel.gif. Zmieniając to na przezroczystość 1x1 pixel.pngi proxy działało zgodnie z oczekiwaniami. Dziwne.
deefour
8

Miałem podobny problem, ale był on spowodowany długością adresu URL. Google generuje następujący adres URL podczas buforowania obrazu z Gmaila:

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

Wygenerowany skrót jest oparty na adresie URL obrazu, ale rozmiar będzie się różnić w zależności od użytych znaków. Przeprowadziłem kilka testów z różnymi rozmiarami adresów URL i stwierdziłem, że buforowany obraz nie ładuje się konsekwentnie (400 / nieprawidłowe żądanie), jeśli hash przekracza długość 2076 znaków (blisko 2048 bajtów + meta? Nie jestem pewien).

Ponownie, adres URL obrazu może generować hash, który przekracza tę liczbę znaków przy ~ 1000 znaków specjalnych lub ponad 1500 prostych znaków. Jeśli długość skrótu przekracza 2076 znaków, żądanie kończy się niepowodzeniem.

Zdaję sobie sprawę, że to stary post, ale mam nadzieję, że pomoże to innym programistom przeszukiwać Google

Mahdi.Montgomery
źródło
6

Wiem, że to stare pytanie, ale mnie spotkało to samo. Kiedy sprawdziłem moje dzienniki dostępu, oto co znalazłem -

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)" 

Możesz zobaczyć, że mój serwer blokował GOOGLEIMAGEPROXY, dając mu odpowiedź 403 Forbidden . Postanowiłem sprawdzić mój .htaccess i na pewno blokowałem termin PROXY . Po usunięciu terminu obrazy wyglądają teraz dobrze w Gmailu. Mam nadzieję, że to pomoże.

Manish Pradhan
źródło
Miałem też 403. Dowiedziałem się, że mod_security blokuje proxy Google ...
Peter
2
To był dokładnie problem, który miałem. Możesz sprawdzić, czy masz ten sam problem z konfiguracją, używając 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
3

Lokalizacje obrazów HTTPS są buforowane. Kilka naszych środowisk produkcyjnych nie ma problemów z przekazywaniem przez Gmaila lokalizacji obrazów za pomocą protokołu HTTPS URI. Mogłem zobaczyć, jak Gmail ignoruje Twoje treści, jeśli certyfikat SSL jest w jakiś sposób nieprawidłowy.

DDS
źródło
Dziękuję za aktualizację. Chociaż to było jakiś czas temu, nigdy nie znalazłem rozwiązania na tę odpowiedź
RonnyKnoxville.
W zależności od mojego obecnego doświadczenia w tworzeniu e-maili w formacie html z dołączonymi obrazami i protokołami https, potwierdzam, że zależy to od certyfikatu. Używając let's encrypt bez organizacji, obraz jest blokowany w Gmailu. Podczas korzystania z markowego certyfikatu z dołączoną organizacją dobrze widać obraz. Więc myślę, że to albo darmowe, albo markowe certyfikaty albo deklarowana w nim organizacja.
Tritof
3

Właśnie próbowałem, po wymianie obrazka (bez zmiany nazwy obrazka)

  • Otwórz wiadomość e-mail w nowej przeglądarce, pokazuje nowy obraz

  • Ctrl + f5 (wymusza odświeżenie pamięci podręcznej) w chrome (moja domyślna przeglądarka), pokazuje również nowy obraz

safin chacko
źródło
1

Sprawdź, czy typ zawartości zwrócony dla pliku obrazu przez serwer jest poprawny.

Możesz to sprawdzić za pomocą programu Fiddler.

Softlion
źródło
1

W moim przypadku problemem był rozmiar pliku, był to 22 Mb (wiem, prawda?), A po zmniejszeniu rozmiaru wszystko zaczęło działać jak marzenie.

Sprawdź rozmiar pliku i jeśli jest za duży, skompresuj go.

vishes_shell
źródło
Dobry chwyt. Komunikat o błędzie Gmaila sprawia, że ​​wygląda na to, że był to błąd podczas pisania lub błąd uprawnień, co było bardzo mylące.
Oprawa
1

Wiem, że to stare pytanie, ale napotkałem ten problem. W moim przypadku obrazy są przechowywane w Google Cloud Storage. Co ciekawe, to ten link

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

zwraca 307 (tymczasowe przekierowanie) i Locationnagłówek zawierający coś podobnego

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

Wygląda na to, że GoogleImageProxy nie przetwarza poprawnie 307

askazakov
źródło
To prawda, musiałem skonfigurować system równoważenia obciążenia i CDN z moim zapleczem jako zasobnikiem, teraz moje obrazy działają poprawnie w chmurze
Wendel Nascimento
0

Mam idealne rozwiązanie tego problemu, które zadziałało u mnie jeśli używasz PHPMailera to wystarczy dodać kolejną opcję w PHPMailer do załączania takiego obrazu

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

Tutaj podaliśmy absolutną ścieżkę obrazu i nadaliśmy mu nazwę „logoimg” lub cokolwiek chcesz.

Teraz możesz dodać to logoimg do dowolnego miejsca w treści HTML w ten sposób

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

To wszystko.

Arjun Choudhary
źródło
0

Miałem ten problem, kiedy wysyłałem gify. Zauważyłem, że rozmiar pliku ma znaczenie dla serwera Googles Proxy. Sugeruję, aby pliki były tak małe, jak to możliwe i zobacz, czy to zadziała. Możesz użyć swojego konta Gmail i dodać zdjęcie z adresu URL do przetestowania. Jeśli gif pojawi się podczas tworzenia wiadomości e-mail, będzie można go odebrać.

szczęśliwego kodowania.

AtLeastTheresToast
źródło
0
  1. Czy to działa z Outook / Hotmail? Powinniśmy wtedy wyizolować to jako problem Google. W twoim przypadku tak nie jest.
  2. Rozmiar obrazu może stanowić problem. Spróbuj to zmniejszyć i zobacz
  3. www.mysite.com ta witryna może być dostępna z Twojego systemu. Ale czy jest również dostępny z serwera Google?
  4. Spróbuj zmienić rozszerzenie ... to jest sztuczka: mogłeś wypróbować kilka rzeczy, ale nadal pobierałoby to z pamięci podręcznej (co unieważnia twoje wysiłki), ale kiedy rozszerzenie się zmienia, wczytuje się ponownie i cała praca, którą wykonałeś wcześniej, wchodzi w grę i jeśli to działa, możesz pomyśleć, że to „rozszerzenie” załatwiło sprawę !! (jak wielu z tych, którzy mówią o rozszerzeniach)
Niebieskie chmury
źródło
0

W moim przypadku natrafienia na ten problem, problem polegał na tym, że przypadkowo ścieżka do obrazka w szablonie e-maila miała potrójne ukośniki w adresie URL, np https:///content.example.org/image.png. Było to trudne do zauważenia i chociaż działało w innych klientach poczty e-mail, które mogły pomyślnie rozwiązać adres URL, serwer proxy obrazu Google nie był w stanie go obsłużyć i spowodował 404 dla adresu obrazu proxy.

Adam Reis
źródło
-1

Upewnij się, że Gmail żąda ponownego przesłania obrazu http, a nie https.

Powiedzmy, że Twój normalny adres URL obrazu to:

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

Więc zmień na:

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

Mam przeczucie, że serwer proxy Google nie buforuje pamięci podręcznej https.

Pedro Vagner
źródło
Słuszna
19
„Mam przeczucie, że serwer proxy Google nie buforuje protokołu HTTPS”. - twoje przeczucie jest złe
Will
1
To zadziałało! Próbowałem skopiować i wkleić komórkę arkusza kalkulacyjnego Google, która zawierała obraz zewnętrzny, do wiadomości e-mail, używając protokołu http jako protokołu.
Wykres
To jest złe, dlaczego Google nie mógłby buforować obrazu przez https?
southpaw93
Google nie wspominało nic o pozwie przeciwko https, więc silne uczucie jest zmarnowane
Blue Clouds
-7

Jest 6 marca i prawdopodobnie już to rozgryzłeś, ale pomyślałem, że zadzwonię, aby pomóc innym. Odkryłem, że pliki JPG nie działają w Gmailu. Format PNG działa świetnie. Przepraszam, nie potrafię wyjaśnić dlaczego, ale czasami lepiej nie pytać dlaczego. Użyj PNG!

MaryM
źródło
Nie mogę uwierzyć, że Google rzeczywiście uznałoby to za rozwiązanie. Niezależnie od tego spróbuję, ponieważ nasze biuletyny są zniszczone dla naszych użytkowników Gmaila.
Nathan Beach
To nie jest prawda, Gmail obsługuje JPEG
Will
Obsługuje pliki jpg
menedżer
Używam png i mam ten sam problem.
Eduardo Nobre