Почему размер моей электронной почты примерно на треть больше размера вложенных файлов?

10627
arc_lupus

Прикрепляя данные к моим электронным письмам, я заметил, что Thunderbird вычисляет общий размер полученного электронного письма, который намного больше, чем файлы, которые я прикрепил.

Вот недавний пример: два изображения, одно на 13 МБ и одно на 3,6 МБ, должны быть в общей сложности примерно 17 МБ. Там было четыре строки текста. Затем Thunderbird спросил меня, действительно ли я хочу отправить электронное письмо общим объемом 22 МБ.

Откуда эта разница? 5 МБ текста звучит как много.

112
Обратите внимание, что это часто влияет на такие вещи, как максимальный размер. Если я не ошибаюсь, гугл-почта обычно допускает электронную почту размером не более 25 МБ, но 25 МБ вычисляются * после * кодирования, поэтому вы не можете отправить изображение размером 25 МБ с электронной почтой, поскольку при кодировании оно будет на самом деле слишком большим. Bakuriu 8 лет назад 2
Комментарий @ Bakuriu относится и к серверу Outlook + Exchange. Я полагаю, что основной вопрос на самом деле * Почему почтовые клиенты (часто - Tbird кажется лучше, чем outlook снова) сообщают только о локальном размере файла, когда важен размер в кодировке base64? * Chris H 8 лет назад 4
@MarcksThomas Я не хочу спорить с призывом иметь один универсальный, легко доступный для поиска источник знаний, а не просто иметь все доступные для поиска знания. Но нужно ли это? Я так не думаю. - Я не думаю, что этот вопрос вообще бесполезен, я просто думаю, что он не удовлетворяет основным требованиям по защите сайта от лишних вопросов и усложняет поиск действительно важных вещей, которые _не являются_ ответил где-нибудь еще. Это то, что мы должны делать! - arc_lupus, так как я только скрываюсь на этом сайте, обычно мое понижение пока не происходит. Но так оно и есть. Alexander Kosubek 8 лет назад 0
Относится к: http://superuser.com/questions/568506/how-much-larger-does-uuencode-make-binary-files glenneroo 8 лет назад 0

2 ответа на вопрос

214
David Schwartz

Ваши данные были 17 МиБ. В МиБ 1024 КиБ. В КиБ 1024 Б В байте 8 бит. Это 142 606 336 бит.

Кодирование Base 64 кодирует каждые шесть битов в виде отдельного байта. Итак, нам нужно около 23 767 722 байта. Деление на 1024 дважды дает нам 22,67 МиБ. Так вот откуда 22 МиБ.

Электронная почта является довольно старой технологией и не предполагает 8-битную чистоту канала.

Немного расшифруем эту последнюю строку: base-64 - это способ кодировать вложения в виде текста, используя ограниченный набор «гарантированных безопасных символов», которые не будут искажены некоторыми промежуточными устройствами, такими как az, AZ, 0-9 Yorik 8 лет назад 79
И, как только вы поймете математику в отличном ответе Дэвида, вы можете просто умножить размер вложений на 4/3, чтобы получить размер почтового сообщения, которое будет отправлено (плюс фактический текст). Kent 8 лет назад 64
Даже если бы электронная почта знала, что в ней есть 8-битный канал, ее придется кодировать, так как это текстовый поток - некоторые символы выполняют функции управления и, следовательно, не должны появляться в ваших данных. При этом существуют лучшие методы кодирования, но они не были приняты. Loren Pechtel 8 лет назад 12
@LorenPechtel, вы можете с радостью иметь часть application / octet-stream в сообщении MIME. Все, что вам нужно сделать, это выбрать границу, которая не встречается в данных. OrangeDog 8 лет назад 3
@ Mehrdad Я говорил, что вы оба правы: Copper.hat говорил, что проверка / исправление ошибок происходит на более высоком уровне, чем физический обмен байтами (и это так), и вы говорите, что это более низкий уровень, чем MIME-кодирование / формат пересылки почты (который это). TripeHound 8 лет назад 0
что base64 _actually_ делает, использует 4 байта для каждых 3 исходных байтов. Хотя это звучит примерно одинаково, это важно, потому что длина всегда кратна 4, а также потому, что нет причин для уровня битов. njzk2 8 лет назад 8
@Mehrdad Email на самом деле не имеет двоичного представления, поэтому необходимо перекодировать двоичные данные в виде текста (в виде base64). jpaugh 8 лет назад 1
В принципе, если вы можете отправить `8BITMIME`, вы можете использовать кодировку, которая намного более эффективна, чем base64, с чем-то вроде 7,5 или более бит двоичных данных на байт (а не 6 бит). Вы не можете отправить чистый двоичный файл, потому что это должен быть корректный текст, но вы можете приблизиться к той же эффективности. R.. 8 лет назад 0
К сожалению, не существует стандарта, определяющего кодирование, которое будет эффективно кодировать произвольные двоичные данные в виде потока данных, который следует правилам MIME «8 бит». Существует * IS * SMTP-расширение для передачи писем, содержащих двоичные данные, но оно, по-видимому, широко не поддерживается. plugwash 8 лет назад 1
@ njzk2 Данные в кодировке Base64 всегда кратны 4 байтам, за исключением случаев, когда это не так. В частности, заполнение конца является необязательным во многих реализациях. a CVn 8 лет назад 1
@ njzk2 https://tools.ietf.org/html/rfc4648#section-3.2 «Реализации ** ДОЛЖНЫ ** включать соответствующие символы дополнения в конце кодированных данных **, если ** в спецификации, ссылающейся на этот документ, явно не указано иное «. (Мой акцент.) Не уверен, что электронная почта в Интернете позволяет или не допускает отсутствие заполнения. a CVn 8 лет назад 0
По-прежнему не существует «8-битного чистого канала», SMTP-сервер будет * интерпретировать * то, что отправлено ему по TCP-соединению, по крайней мере, ищет конечную последовательность (одну точку или control-D) для команды DATA. Поэтому, по крайней мере, потребуется протокол escape для сохранения всех допустимых таких последовательностей из двоичных данных. rackandboneman 8 лет назад 0
@rackandbonemane Стандарт CHUNKING / BINARYMIME решает эту проблему, вводя команду BDAT, которая включает заголовок длины. Таким образом, двоичные данные сообщения не должны сканироваться для определения конечной последовательности. plugwash 8 лет назад 0
50
plugwash

Почему электронная почта больше?

Потому что данные кодируются, в base64котором кодируются группы до трех байтов в виде групп из четырех печатных символов ASCII. Как правило, эти группы печатных символов затем разбиваются на строки.

В результате кодированные данные чуть более чем в 1⅓ раз превышают размер исходных данных.

Почему используется base64?

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

Таким образом, MIME разделил две схемы для кодирования других данных в виде текста ASCII - «цитируемый для печати», предназначенный в основном для текста ASCII с несколькими другими битами, и «BASE64» для произвольных двоичных данных.

Существуют расширения протокола SMTP, чтобы попытаться снять эти ограничения. Во-первых, 8BITMIME в 1994 году, который допускал более высокие значения октетов, но, к сожалению, не снимал ограничений, связанных с длинами строк и окончаниями строк, поэтому не подходил для произвольных двоичных данных; а затем BINARYMIME в 1995 году, что позволило передавать сообщения, содержащие произвольные двоичные данные.

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

Интересно, почему yEnc, с другой стороны, был достаточно успешен в Usenet при вытеснении UUE. Возможно, потому что бинарные новостные группы оказывают гораздо большее давление на интернет-провайдеров, чем случайные бинарные письма? igorsk 8 лет назад 1
@igorsk: плюс Usenet / NN был представлен и воспринимается как с потерями, где вы можете опубликовать статью, и не все подписчики на всех серверах обязательно получат ее. Существовали (и в значительной степени остаются) обычаи относительно цитирования в последующем «достаточно» предыдущей статьи, чтобы ваше продолжение могло быть понято кем-то, кто не получил предыдущую статью (-ы). В отличие от этого большинство (не спамерских) отправителей электронной почты ожидали, что «система» получит свое сообщение указанному получателю (ям), хотя иногда через несколько часов или дней; сегодня люди жалуются даже на короткие задержки. dave_thompson_085 8 лет назад 2

Похожие вопросы