В принципе, ваша почта не имеет правильной маркировки. Есть несколько способов упорядочить детали в сообщении MIME, чтобы они имели смысл для почтового агента. Давайте начнем с простого и пройти к сложному варианту:
Самый простой из всех текстов с несколькими приложениями. Например, вы хотите отправить свое резюме на кого-то, поэтому вы написать несколько слов введения и прикрепить один или несколько документов (сопроводительное письмо, CV):
mime───multipart/mixed─┬─text
├─attachment1
└─attachment2
Multipart/смешанные означает, что адрес электронной почты агент будет показывать детали поочередно - один за другим.
- Если вложения контента диспозиция
inline
, и адрес электронной почты агент способен показывать данный тип вложения, то он будет отображаться внутри самого сообщения - в его конце.
- Если содержимое содержимого вложений
attachment
, они обычно будут отображаться как значки или ссылки для сохранения вложений.
Если вы хотите отправить довольно HTML сообщение, принято включать как открытого текста версию и HTML версию. Это значит, что получатель может прочитать его даже в читателе электронной почты, который не поддерживает HTML. Вы должны использовать многослойную/альтернативу:
mime───multipart/mixed─┬─multipart/alternative─┬─text/plain
│ └─text/html
├─attachment1
└─attachment2
Итак, опять-таки, содержание сообщения включает в себя три части, тело и две насадки. Но само тело является multipart/alternative
, и оно содержит версию открытого текста и версию HTML. Не забудьте сначала поставить открытый текст, а второй - HTML, поскольку для почтового агента выбрана последняя альтернатива, которую он знает, как отображать.
Вложения будут отображаться последовательно после тела, как и раньше, потому что это следующие части основного уровня, который равен multipart/mixed
.
Теперь давайте посмотрим на почту, которая не имеет «вложения», но у него есть изображения, которые должны быть встроены внутри HTML.В этом случае почтовому агенту необходимо знать, что вложения - это не только файлы, отправляемые читателю для загрузки, но и его отображение в сочетании с HTML. Итак, правильный тип mime для этого - multipart/related
, чтобы показать, что части связаны. В этом случае вам также необходимо предоставить им правильные идентификаторы контента и использовать эти идентификаторы контента в HTML. Это не является частью стандарта MIME, но именно так обычно делается HTML-почта в наши дни.
Что касается MIME касается, такое сообщение будет выглядеть следующим образом:
mime───multipart/alternative─┬─text/plain
└─multipart/related─┬─text/html
├─embedded image 1
└─embedded image 2
На этот раз у нас нет вложения, поэтому мы можем поставить многослойную/альтернативу в качестве нашего верхнего уровня содержания. Сначала он имеет альтернативу открытым текстом, как и раньше, но вторая альтернатива - это MimeMultipart("related")
.
Внутри него у вас есть часть HTML и два изображения. HTML и его изображения всегда должны быть частью одного и того же объекта с несколькими объектами.
Теперь, что если вы хотите, чтобы прикрепить документ к такому сообщению, тот, который имеет HTML и изображения внутри него? Тогда вы бы использовать что-то вроде этого:
mime───multipart/mixed─┬─multipart/alternative─┬─text/plain
│ └─multipart/related─┬─text/html
│ ├─embedded image 1
│ └─embedded image 2
├─attachment1
└─attachment2
Таким образом, ваш верхний объект уровня многочастный/смешанный, что позволяет добавлять вложения последовательно к сообщению. Сообщение «тело» (первая часть multipart/mixed
) представляет собой сложную структуру multipart/alternative
со встроенным multipart/related
. И затем следуют другие приложения.
В итоге:
multipart/mixed
сообщение имеет первую часть, которая, как предполагается, ваше читаемое сообщение, а остальные вложения. Все детали будут отображаться почтовым агентом читателя.
- Сообщение
multipart/alternative
дает разные варианты отображения одного и того же контента, упорядоченные по наиболее распространенному знаменателю, к наиболее редкому типу презентации (например, текстовый текст → HTML → богатый текст → проприетарное форматирование), а почтовая программа получателя выбирает последний, который он знает способ отображения. Вы видите только один из вариантов:.
- Сообщение
multipart/related
обычно используется для объединения тела HTML со встроенными сообщениями. Первая часть - HTML, другие части содержат Content-ID, которые HTML использует для своих тегов <img src="..." />
.
Теперь давайте посмотрим на вашей собственной иерархии, на основе граничных строк. Ваш внешний уровень - multipart/mixed
с границей ===============9061258228856181354==
. Если вы посмотрите на все места, которые появляются на этой границе, вы увидите, что есть три части этого multipart/alternative
.
Первая часть:
Content-Type: multipart/alternative; boundary="===============2889524977048828163=="
MIME-Version: 1.0
--===============2889524977048828163==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
img 1043833786270341319 should be here
--===============2889524977048828163==--
Эта часть является multipart/alternative
, , но он имеет только одну альтернативную часть - содержание которого тип текста/равнине.
Вторая часть:
Content-Type: image/jpeg; name="sky.jpg"
MIME-Version: 1.0
Content-ID: <1043833786270341319>
Content-Transfer-Encoding: base64
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU
FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAEbAakDASIA
AhEBAxEB/8QAHQAAAgIDAQEBAAAAAAAAAAAAAgQBAwUGBwAICf/EADoQAAEEAQMDAwIFAgYBBAMB
Так это изображение.
Третья часть:
Content-Type: multipart/related; boundary="===============7011550496984103126=="
MIME-Version: 1.0
--===============7011550496984103126==
Content-Type: text/html; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
<div><h1>bla</h1></div><img src="cid:1043833786270341319" title="1043833786270341319"/>
--===============7011550496984103126==--
Ну, это multipart/related
. Но у него есть только одна часть - сообщение text/html
. Изображение не является частью этого.
Так вместо того, чтобы следующая иерархия, которая является подходящей для того, что вы описали (текст простого и HTML альтернативы, HTML-часть, имеющую встроенное изображение)
mime───multipart/alternative─┬─text/plain
└─multipart/related─┬─text/html
└─embedded image
У вас есть этот неправильно иерархии :
mime───multipart/mixed─┬─multipart/alternative───text/plain
├─image
└─multipart/related───text/html
поскольку все части находятся в multipart/mixed
, они отображаются поочередно, а не в качестве альтернативы. Поскольку text/plain
и multipart/related
не являются частями одного и того же multipart/alternative
, почтовый агент не знает, что они являются альтернативами друг другу. Он не видит другой альтернативы text/plain
, есть только одна часть в этом multipart/alternative
.
Поскольку часть multipart/related
не содержит изображений, будут созданы почтовые агенты, которые не смогут правильно помещать изображение в HTML. Кроме того, из-за этого изображение, вероятно, показано вам серийно или как приложение - оно стоит отдельно и не связано ни с чем другим.
Таким образом, вы должны изменить свое сообщение, чтобы оно соответствовало надлежащей иерархии альтернатив для работы и правильному отношению изображения к HTML.
Был буквально один ответ, который я нашел здесь, что [ответил] (http://stackoverflow.com/a/23853079/1575066). С тех пор я реализовал это, чтобы люди могли легко отправлять электронные письма именно вашей структурой. – PascalVKooten