2015-06-19 2 views
1

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

То есть, когда html содержит изображение, «альтернативная» часть должна показывать «img ... должна быть здесь».

Проблема в том, что я вижу все, также альтернатива, в gmail.

Сбой в MIME-сообществе?

Вот содержание:

Content-Type: multipart/mixed; boundary="===============9061258228856181354==" 
MIME-Version: 1.0 
From: [email protected] <[email protected]> 
To: [email protected] 

--===============9061258228856181354== 
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==-- 

--===============9061258228856181354== 
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 

--===============9061258228856181354== 
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==-- 

--===============9061258228856181354==-- 

Примечание: Код изображения был вырезан просто так его не огромный код. Опять же, просто цель состоит в том, чтобы показать резерв для не-html-читателей, который должен иметь другое сообщение, чем сообщение html. Способная почтовая программа НЕ должна показывать альтернативное сообщение, верно?

ответ

3

В принципе, ваша почта не имеет правильной маркировки. Есть несколько способов упорядочить детали в сообщении 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.

+0

Был буквально один ответ, который я нашел здесь, что [ответил] (http://stackoverflow.com/a/23853079/1575066). С тех пор я реализовал это, чтобы люди могли легко отправлять электронные письма именно вашей структурой. – PascalVKooten