Как остановить встроенные изображения в электронной почте, которые GMail отображает в виде вложений?

Я отправляю электронные письма в формате HTML со встроенными изображениями (в виде вложений), и изображения отображаются так, как ожидается в GMail. Однако они также отображаются в виде вложений под электронным письмом. Кто-нибудь знает, как этого избежать, т.е. я хочу, чтобы они были только в электронном письме и не указаны в качестве вложений. Я использовал "Content-Disposition: inline". Я использую Spring и JavaMail.

Вот то, что мои письма заканчиваются как. Кто-нибудь может увидеть, что не так?

Delivered-To: ...
...
Subject: ...
MIME-Version: 1.0
Content-Type: multipart/mixed; 
    boundary="----=_Part_0_1248835444.1288246311187"

------=_Part_0_1248835444.1288246311187
Content-Type: multipart/related; 
    boundary="----=_Part_1_592250078.1288246311197"

------=_Part_1_592250078.1288246311197
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

<html>
<body>
<p><img src="cid:a0"/></p>
</body>
</html>
------=_Part_1_592250078.1288246311197
Content-Type: image/x-png
Content-Transfer-Encoding: base64
Content-Disposition: inline
Content-ID: <a0>

iVBORw0KGgoAAAANSUhEUgAAAPAAAABQCAYAAAAnSfh8AAAACXBIWXMAAC4jAAAuIwF4pT92AAAA
...
Qcz8hzyUxqGHjkNbsY4Df5iBg6OIwafQHBxFjP8PAIwl43uhncLdAAAAAElFTkSuQmCC
------=_Part_1_592250078.1288246311197--

------=_Part_0_1248835444.1288246311187--

3 ответа

Решение

Можно получить такое почтовое тело из GMail, выполнив следующие действия:

  1. включить в Gmail Labs "Вставка изображений с помощью Kent T"
  2. написать письмо и вставить изображение в почту
  3. отправить письмо себе
  4. открой почту. В правом верхнем углу нажмите на изображение со стрелкой вниз (справа рядом с Ответить) и нажмите "Показать оригинал". Там вы найдете пример такой почты.

Я сделал это и получил следующий результат, где изображение не указано как приложение. Может быть, это почтовое тело поможет вам создать правильную почту с помощью Spring и JavaMail:

MIME-Version: 1.0
...
Subject: ...
From: ...
To: ...
Content-Type: multipart/related; boundary=000e0cd62fb69a9c280493a7a1c0

--000e0cd62fb69a9c280493a7a1c0
Content-Type: multipart/alternative; boundary=000e0cd62fb69a9c250493a7a1bf

--000e0cd62fb69a9c250493a7a1bf
Content-Type: text/plain; charset=ISO-8859-1

[image: abc.png]

--000e0cd62fb69a9c250493a7a1bf
Content-Type: text/html; charset=ISO-8859-1

<img src="cid:ii_12bf191c5eab934e" alt="abc.png" title="abc.png"><br>

--000e0cd62fb69a9c250493a7a1bf--
--000e0cd62fb69a9c280493a7a1c0
Content-Type: image/png; name="abc.png"
Content-Transfer-Encoding: base64
Content-ID: <ii_12bf191c5eab934e>
X-Attachment-Id: ii_12bf191c5eab934e

iVBORw0KGgoAAAANSUhEUgAAAJ4AAADLCAIAAAAQpL1oAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA
...

Используя Spring, вы можете сделать это следующим образом:

MimeMessagePreparator message = mimeMessage -> {
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
        mimeMessageHelper.setFrom(new InternetAddress(emailSender));
        mimeMessageHelper.setTo("user@server.com");
        mimeMessageHelper.setSubject("A subject");
        String html = ... // contains a tag <img src='cid:logoIcon'>
        mimeMessageHelper.setText(html, true);

        mimeMessageHelper.addInline("logoIcon", new ClassPathResource("/data/images/logo.png"));
    };
mailSender.send(message);

Для Gmail будьте осторожны, чтобы идентификатор контента содержал только буквенно-цифровые символы!

В моем CID были пробелы, и только GMAIL отображался неправильно. Убрал пробелы и все пошло как надо.

** Я настоятельно рекомендую использовать хеш-функцию, такую ​​как md5 , чтобы назвать cid **

Другие вопросы по тегам