2015-11-13 3 views
3

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

Например, здесь attachment1.doc вложен, а attachment2.doc будет частью верхнего уровня.

 
multipart/mixed 
    |---Title: text/plain 
    |---Text content: text/plain 
    |---Nested multipart: multipart/mixed 
    |  |--- attachment1.doc (BASE64) 
    |---attachment2.doc (BASE64) 

Я спрашиваю, потому что я встретил этот код из https://stackoverflow.com/a/27556667/492336:

# Iterate the different parts of the multipart message. 
    for part in msg.walk(): 
     # Skip any nested multipart. 
     if part.get_content_maintype() == 'multipart': 
      continue 

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

Правильно ли это сделать? Я пробовал читать RFC3501, но не смог найти ничего определенного, говоря, могут ли вложения файлов быть или нет вложенными.

ответ

4

Существует никаких предписаний для ограничений, и вам будет трудно спорить о единой политике для всех типов multipart - у них есть совершенно разные цели.

Например, с сообщением вроде

multipart/mixed 
    +-- multipart/alternative 
    |  +-- text/plain 
    |  +-- multipart/related 
    |   +-- text/html 
    |   +-- image/png 
    |   +-- image/png 
    +-- application/octet-stream; name="attachment.pdf" 

... здравомыслящего поведение для большинства клиентов, которые хотят, чтобы обеспечить представление HTML сообщения будет выбрать multipart/related внутри multipart/alternative со всеми приложениями, и использовать это для отображения сообщения при отображении PDF в виде отдельного приложения. Если вы обрабатываете только верхний уровень multipart/mixed, то вы только см. Вложение, которое не похоже на разумный подход.

Другой случай, когда может происходить полное произвольное вложение, - message/rfc822, где прикрепленное сообщение является полным MIME-сообщением, которое, в свою очередь, может содержать другое значение message/rfc822 и т. Д. Рекурсивно.

Все, что имеется (явным или подразумеваемым) Content-Disposition: attachment является «приложением»; вы иногда видите «вложения» внутри, например, multipart/alternative, что подразумевало бы, что вложение имеет смысл только в том случае, если вы показываете этот альтернативный вид сообщения - мне трудно придумать пример, где это было бы правдой, и может фактически предположить, что это следует рассматривать как ошибку , и покажите вложение при рендеринге другой альтернативы, на всякий случай.

+0

Не зависит от клиентского приложения электронной почты, которое использовалось для составления сообщения? В этом случае поведение Thunderbird, Outlook и GMail должно охватывать 99% случаев ... Возможно, существует стандарт де-фактора, который знает. Единственные файлы, которые я нашел до сих пор, которые были вложены, были изображениями, предназначенными для отображения в самом электронном письме. О, спасибо за ответ! – sashoalm

+0

Перспектива может быть очень распространенной, но адаптация к ее поведению - это не то, что я делал бы беззаботно. К сожалению, Thunderbird и Gmail также демонстрируют полное игнорирование стандартов в некоторых местах. Если вы хотите охватить распространенные случаи, возможно, добавьте Apple Mail.app в свой список. – tripleee

2

Вложенные множители являются законными и распространены для нескольких случаев использования. Самое главное, если вы используете S/MIME для подписывания многостраничного сообщения, содержащего текст и изображение, вы, как правило, должны иметь многоуровневый/многоуровневый уровень верхнего уровня, содержащий многочастные/смешанные и некоторые другие части, а многочастное/смешанное в свою очередь содержит текст/plain и изображение/jpeg.

+0

Спасибо. Вы знаете, где это описано в RFC? Я предполагаю, что это в https: //tools.ietf.org/html/rfc2045 # section-2.3 где-то. – sashoalm

+0

2045 говорит, что multiparts содержит ноль или более частей. Вот и все. Ограничений не существует, поэтому допускается перенос мультимножества в multiparts. (Все S/MIME в этом контексте должны предложить соответствующий пример.) – arnt