Base64 изображения в Gmail - PullRequest
45 голосов
/ 19 июля 2010

Я генерирую несколько встроенных изображений для электронного письма, отправленного с iPad. Отлично смотрится во всех почтовых клиентах для настольных компьютеров, но gmail, похоже, не нравится изображение base64, и оно отображается как текст

Кому-нибудь повезло встраивать изображения в base64 и gmail? Или знаете лучшее решение для отправки электронных писем в формате HTML с изображениями с iPad?

Ответы [ 6 ]

21 голосов
/ 08 октября 2012

Ссылки от Moin Zaman показывают результаты испытаний, которые устарели (с 2008 года). На момент моего тщательного тестирования сегодня Gmail поддерживает отображение встроенных изображений для обоих методов.

Использовать встроенное в кодировку base64 изображение в пределах <img src="...">

<html><body><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA9QAAADmCAIAAAC77FroAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAO..."></body></html>

Использовать закодированное в base64 изображение в качестве вложения.

Message-ID: <BE0243A40B89D84DB342702BC5FD6D313EA3BE1B@BYMAIL.example.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator:
x-originating-ip: [xxx.xxx.xxx.xxx]

Content-Type: multipart/related;
    boundary="_038_BE0243A40B89D84DB342702BC5FD6D313EA3BE1BBYMAIL_";
    type="multipart/alternative"
MIME-Version: 1.0
Return-Path: email@example.com
X-OriginatorOrg: example.com

--_038_BE0243A40B89D84DB342702BC5FD6D313EA3BE1BBYMAIL_
Content-Type: multipart/alternative;
    boundary="_000_BE0243A40B89D84DB342702BC5FD6D313EA3BE1BBYMAIL_"

...skipping Content-Type: text/plain which would be here for this example...

--_000_BE0243A40B89D84DB342702BC5FD6D313EA3BE1BBYMAIL_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html><body><img border=3D"0" width=3D"980" height=3D"230" id=3D"Picture_x0020_1" src==3D"cid:image001.png@01CDA268.204677C0"></body></html>

--_000_BE0243A40B89D84DB342702BC5FD6D313EA3BE1BBYMAIL_--

--_038_BE0243A40B89D84DB342702BC5FD6D313EA3BE1BBYMAIL_
Content-Type: image/png; name="image001.png"
Content-Description: image001.png
Content-Disposition: inline; filename="image001.png"; size=32756;
    creation-date="Mon, 08 Oct 2012 15:27:07 GMT";
    modification-date="Mon, 08 Oct 2012 15:27:07 GMT";
Content-ID: <image001.png@01CDA268.204677C0>
Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSUhEUgAAA9QAAADmCAIAAAC77FroAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAO
xAAADsQBlSsOGwAAf5lJREFUeF7tvQlgVdW18L+ZR20mpsSLCYlBQKwgwRCMr9TAqzg0CAl98Y9a
ikBfHxL1A/r0tUr77Feg1mDav4LUijxTk8hLRIstQ2mJhEiAWAEpNCGRa8KUSQXCzLf2cOZz7j33
5s5Zx6j3nruHtX97n33WWWfttbtdv36d4IEEkAASQAJIAAkgASSABJCA/wl0938VWAMSQAJIAAkg
ASSABJAAEkAClAAq3zgOkAASQAJIAAkgASSABJBAgAig8h0g0FgNEkACSAAJIAEkgASQABJA5RvH
...

Чтобы провести собственное тестирование, вы можете отправить электронное письмо со встроенным встроенным изображением, используя один из следующих методов

Отправьте сообщение электронной почты, используя один из перечисленных выше вариантов, в свою учетную запись Gmail, затем откройте сообщение электронной почты в веб-клиенте Gmail (в любом браузере, который работает) и с помощью стрелки вниз рядом с кнопкой «Ответить» выберите параметр «Показать оригинал». Это покажет вам, как оно получено.

Я думаю, что наилучшей практикой является использование встроенного изображения в качестве метода вложения.

В моем тестировании с Gmail Web Client, если я отправил 30 изображений в одном письме разных размеров, некоторые из них не смогли бы успешно загрузить контейнер с изображением, но не изображение. Если это произойдет, попробуйте перезагрузить страницу.

В моем тестировании (Windows 7) ...

  • Chrome (последний) потребовалось несколько перезагрузок, чтобы успешно загрузить / показать все 30 изображений
  • Opera (последняя версия) не сможет успешно показать все 30 изображений независимо от количества перезагрузок
  • Firefox (последний) последовательно показывал все 30 изображений без проблем
  • Internet Explorer 9 (последний) последовательно отображал все 30 изображений без проблем
  • Safari (последний) последовательно показывал все 30 изображений без проблем
8 голосов
/ 13 августа 2012

Похоже, ни в одной официальной документации нет, но Gmail определенно не поддерживает это, встроенный или как вложение в base64.

Вот несколько тестов, которые проводил монитор кампании:
Вложение изображений в электронное письмо
Повторное добавление изображений

4 голосов
/ 19 июля 2010

Убедитесь, что вы установили Content-Type: multipart / mixed;, границы и Content-Transfer-Encoding: base64

0 голосов
/ 05 апреля 2019

Это прекрасно работает: Я установил два атрибута src, один с данными: image / png; base64, а другой со ссылкой на изображение. Когда вы используете gmail, он использует атрибут src со ссылкой, а когда вы используете другой клиент электронной почты, он использует атрибут src с данными: image / png; base64. Попытайся!. вы увидите.

0 голосов
/ 03 декабря 2013

Попробуйте это друзья .. Я уверен, что это будет работать, чтобы включить изображение в качестве вложения

                    $output_hex_string_img = $image;
                    $output_bin_string_img = base64_decode($output_hex_string_img);
                    //echo base64_encode( $output_bin_string_img );
                    $XXX = base64_encode( $output_bin_string_img );

                    $from_name = "Senders Name";
                    $from_mail = "yyyyyyyy@gmail.com";
                    $replyto = "yyyyyyyy@gmail.com";
                    $subject = "Device Missing Notification";
                $message = "Device Missing notification has been activated on your device. Please change this setting when you find your smartphone back. Best Of Luck!!\r\r ";



                    $mailto = 'xxxxxxxx@mail.com';



                        $file = $XXX;
                        $filename = "Print_shot.png";
                        $uid = md5(uniqid(time()));
                        $name = basename($file);
                        $header = "From: ".$from_name." <".$from_mail.">\r\n";
                        $header .= "Reply-To: ".$replyto."\r\n";
                        $header .= "MIME-Version: 1.0\r\n";
                        $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
                        $header .= "This is a multi-part message in MIME format.\r\n";
                        $header .= "--".$uid."\r\n";
                        $header .= "Content-type:text/html; charset=iso-8859-1\r\n";
                        $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
                        $header .= $message."\r\n\r\n";
                        $header .= "--".$uid."\r\n";
                        $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; // use different content types here
                        $header .= "Content-Transfer-Encoding: base64\r\n";
                        $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
                        $header .= $file."\r\n\r\n";
                        $header .= "--".$uid."--";
                        mail($mailto, $subject, "", $header);

Но вы должны включить все внутри заголовков, используя различные типы контента в заголовках.и все, что появляется в теле, которое может быть третьим параметром в функции mail, будет передано в виде пустой строки.

0 голосов
/ 21 августа 2012
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];

[picker addAttachmentData:UIImageJPEGRepresentation(_tempImage,1) mimeType:mimeType fileName:filename];

[picker setMessageBody:emailBody isHTML:YES];

Если isHTML равно YES, addAttachmentData автоматически изменится на строку base64, в электронной почте html может увидеть вас img.

Если isHTML - НЕТ, addAttachmentData - вложение.

...