Приватность и повседневность

Вложения на одноразовой почте: лимит размера и защита

Одноразовый адрес принимает не только текст, но и файлы — до 5 MB на всё сообщение целиком, а это заметно меньше файла, чем звучит. Здесь о том, что приходит, что отклоняется на входе, как забрать файл обратно и о единственном правиле, которое важно соблюсти перед тем, как что-либо открывать.

  • Начальный
  • 11 мин на чтение
Большая канцелярская скрепка держит синий лист бумаги, который заметно больше открытого почтового ящика рядом с ней

Что считается вложением в письме?

Сообщение — это дерево частей, и файлами являются лишь некоторые из них. Здесь действует намеренно широкое правило, потому что альтернатива — доверять отправителю правильно всё подписать — незаметно теряет вложения, которые почтовый клиент бы показал:

Всё, что помечено как вложение
Часть, у которой Content-Disposition равен attachment. Обычный случай, с которым согласен любой почтовый клиент.
Всё, у чего есть имя файла
Часть с указанным filename, как бы она ни была помечена во всём остальном. Отправители постоянно путают разметку, а файл с именем — это файл.
Именованные части, которые не являются текстом
Часть с указанным name, тип которой не text/…. Именно так сюда попадает логотип из HTML-подписи — поэтому сообщение может прийти с вложениями, которых вы не ожидали и которые сам отправитель никогда не считал вложениями.

Поэтому число, которое вы видите, часто больше того, что имел в виду отправитель. Двадцать — это максимум, который сохраняет одно сообщение: если частей с именами файлов больше, остаются первые двадцать, а остальные отбрасываются, и это стоит знать, прежде чем на этом что-то строить.

Имя файла, пришедшее по сети, никогда не используется как путь. Файл записывается под сгенерированным именем, а исходное имя хранится рядом как данные, — поэтому отправитель не может выбрать, куда попадёт его файл, назвав его именем со слэшем.

Какой на самом деле предел размера вложения?

Заявленное число — 5 MB, и стоит точно понимать, что именно оно измеряет: всё закодированное сообщение целиком. Не вложение и не сумму вложений, а всё, что передаёт отправляющий сервер, — уже после того, как MIME-кодирование его увеличило.

предел 5 MBваш файл после base64заголовки, текст, HTML
Предел измеряет всю полосу целиком, а не только синюю её часть. Файл приходит примерно на треть больше, чем был при отправке, а заголовки и текстовая и HTML-части забирают свою долю из того, что остаётся.

Base64 — способ, которым бинарные данные пересекают протокол, рассчитанный на текст, — превращает каждые три байта в четыре. Добавьте нужные ему переносы строк, и файл приходит примерно на треть больше, чем был на диске, а с их учётом — чуть больше. Если считать от 5 MB в обратную сторону, реальный предел — это файл около 3,5 МБ, и ещё меньше для сообщения с подписью и HTML-частью.

Что измеряется
Заголовки, текстовая часть, HTML-часть и все вложения — всё уже после кодирования.
Вложений на сообщение
Двадцать. На практике предел размера наступает раньше.
Текстовые части
Хранятся до 2 МиБ каждая после декодирования. Более длинный текст сохраняется усечённым — обычное письмо до этого предела не доходит, а вот сгенерированный отчёт может.

Что будет, если файл слишком большой?

Файл отклоняется ещё на входе, во время сеанса SMTP, до того как что-либо сохранится. Отправляющий сервер, который заранее сообщает размер, получает отказ немедленно, и обмен заканчивается примерно так:

что видит отправляющий сервер
>>> MAIL FROM:<news@example.com> SIZE=7602176
<<< 552 5.3.4 Message size exceeds fixed limit

Это важнее, чем кажется. Сервис, который принял бы сообщение, а потом отбросил его, оставил бы отправителя уверенным, что письмо доставлено, а вас — ждать то, что никогда не появится. Отказ на этапе SMTP — это настоящая ошибка, о которой узнаёт настоящий человек: отправитель получает письмо о недоставке с указанной причиной.

Отправитель, который не сообщает размер заранее, получает тот же ответ, но в конце передачи сообщения — как только почтовый сервер сам подсчитает байты. В любом случае в ящик ничего не попадает и ничего не приходит усечённым.

Как скачать вложение из почтового ящика?

В браузере всё там, где вы и ожидаете. Откройте сообщение — под ним будет список вложений, у каждого своё имя, данное отправителем, и размер, с которым файл действительно пришёл.

  1. Откройте сообщение. Список обновляется сам, поэтому файл, пришедший, пока вы смотрите в ящик, появится без перезагрузки страницы.
  2. Прочитайте имя и размер, прежде чем нажать. Оба факта относятся к тому, что действительно пришло, и это последнее, что вы видите перед тем, как файл окажется на вашем компьютере.
  3. Нажмите на него. Файл скачается. В браузере он не откроется никогда, что бы он из себя ни изображал, — следующий раздел объясняет, почему это особенность, а не недостаток.

Внешние изображения в тексте сообщения блокируются, пока вы сами их не разрешите, и это не то же самое, что вложение: заблокированное изображение загружается с сервера отправителя в момент, когда вы это разрешаете, а вложение пришло вместе с сообщением и ни у кого не запрашивается.

Как скачать вложение через API?

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

часть ответа с сообщением
"attachments": [
  {
    "id":       "01JR8W2K4QATT1",
    "filename": "invoice.pdf",
    "mime":     "application/pdf",
    "size":     184320,
    "url":      "/api/v1/attachment/01JR8W2K4QATT1?mailbox=k7fq2m%40grabmail.io"
  }
]

Этот URL — обычный GET с почтовым ящиком в качестве параметра запроса, и на публичных доменах больше ничего не требуется: ни ключа, ни сессии, ни аккаунта:

скачать под собственным именем
curl -OJ "https://grabmail.io/api/v1/attachment/01JR8W2K4QATT1?mailbox=k7fq2m%40grabmail.io"

-OJ указывает curl сохранить файл под именем, которое присылает сервер, а не под идентификатором. Эндпоинт отвечает одним из трёх способов: самим файлом, 404, если такого вложения в этом ящике нет или срок его хранения истёк, либо 429, если запросы идут чаще одного в секунду.

Идентификатор вложения привязан к своему почтовому ящику, поэтому id с одного адреса на другом даёт 404. Отдельного эндпоинта для списка вложений нет — они приходят вместе со своим сообщением и читаются из него. Справочник по API содержит полную структуру ответа с сообщением.

Почему вложение скачивается, а не открывается?

Чем бы отправитель ни назвал свой файл, обратно он приходит как application/octet-stream и скачивается, а не открывается. Это не небрежность в отношении типов содержимого — это единственный безопасный ответ, когда файл пришёл от незнакомца.

Тип, указанный отправителем, никогда не возвращается обратно
Тот, кто пометит файл как text/html и добьётся, чтобы он отрисовался на нашем origin, запустит свою страницу от нашего имени, в вашей сессии, — со всем, что это позволяет получить. Поэтому метка отбрасывается, а вызывающая сторона сама определяет, что это за файл, по метаданным рядом с ним.
Всегда скачивание, никогда просмотр
Content-Disposition: attachment в каждом ответе, поэтому ничто не отображается на месте — как бы оно ни было помечено.
Никакого угадывания типа и никакого выполнения
X-Content-Type-Options: nosniff запрещает браузеру самому угадывать тип, а Content-Security-Policy со значением default-src 'none'; sandbox означает, что, даже если бы что-то отрисовалось, оно не смогло бы ничего загрузить и ничего запустить.
Имя файла не может стать заголовком
Имя кодируется, а не подставляется в ответ напрямую, поэтому файл с переносом строки в имени не может добавить в ответ произвольный заголовок.

Сам файл не тронут — байт в байт то, что отправил отправитель. Намеренно скучно устроено только то, что вокруг него. Хранится он и вне корня веб-сервера, так что угадать путь не получится: прежде чем файл вообще будет прочитан, почтовый ящик должен быть определён и авторизован.

Проверяются ли вложения на вирусы?

Нет ни антивируса, ни запуска в песочнице, ни проверки репутации. Это заявленное ограничение, а не недосмотр, и оно определяет, что можно безопасно делать с тем, что приходит:

  • На публичный адрес может написать кто угодно. Знать вас не обязательно — достаточно знать адрес, а короткие адреса угадывают. У файла в публичном ящике по умолчанию неизвестный автор.
  • Исполняемые файлы и скрипты здесь так же опасны, как и везде. Ничто не фильтруется по расширению, и никто не заглядывает внутрь архива, чтобы проверить, что там.
  • Чаще всего дело не в очевидных исполняемых файлах, а в документах, которые умеют что-то запускать. Офисные файлы с макросами и PDF со встроенными действиями — вот как это обычно происходит на практике.
  • Имя ничего не говорит о содержимом. Файл с именем invoice.pdf — это то, что говорят о нём его байты, а расширение выбрал тот, кто его отправил.

Когда удаляются вложения?

У вложения нет собственной жизни. Оно принадлежит своему сообщению и исчезает вместе с ним:

Через 5 дней
Удаляется вместе с сообщением, прочитано оно или нет, — отсчёт начинается с момента получения. Ни архива, ни экспорта не предусмотрено.
Когда вы удаляете сообщение
Немедленно, и URL начинает отвечать 404. Неважно, удаляете вы из ящика или через API, — результат один.
Пути назад нет
Нет ни восстановления, ни льготного периода, ни ящика поддержки, куда можно было бы обратиться. Всё, что понадобится завтра, нужно скачать сегодня.

Когда для файла не подходит email?

Часть того, что люди пытаются делать с вложениями здесь, — это не ограничение, которое нужно обойти, а просто не тот инструмент для задачи:

  • Файл больше предела. Ничто его не поднимет. Отправьте вместо файла ссылку.
  • То, что понадобится через месяц. 5 дней — это жёсткий предел, который обеспечивает фоновая задача, а не настройка. Заберите файл сейчас или используйте настоящий почтовый ящик.
  • Всё, что вы не хотели бы показать постороннему. На публичном домене адрес — единственный замок на двери, и замок этот короткий.

Собственный домен снимает третью из этих проблем, но не первые две: предел и срок хранения остаются точно такими же, зато адрес стоит на имени, которого нет нигде на этом сайте, — поэтому файлы на него никто не отправляет наугад. Для этого достаточно одной MX-записи:

MX-запись для вашего домена10 smtp.grabmail.io

Полная инструкция здесь — сама запись, что доказывает её публикация, и честные ограничения ящика без пароля.

Вопросы

Какой максимальный размер вложения?

5 MB на всё закодированное сообщение целиком — именно это число реально проверяет почтовый сервер. Поскольку base64 увеличивает бинарные данные примерно на треть, на практике это файл около 3,5 МБ — и меньше, если в сообщении есть ещё текст и подпись.

Какие типы файлов можно получать?

Любые. Ничто не фильтруется и не отклоняется по типу, расширению или содержимому, и ничто не распаковывается, чтобы заглянуть внутрь. Единственная причина, по которой сообщение может быть отклонено, — его размер.

Вы проверяете вложения на вирусы?

Нет. Нет ни антивируса, ни какой-либо проверки вообще. Файл, который вы скачиваете, — байт в байт то, что отправил отправитель, а решать, открывать его или нет, предстоит вам самим.

Почему каждое вложение скачивается как application/octet-stream?

Потому что если возвращать тип содержимого, указанный незнакомцем, файл превращается в страницу, работающую от имени нашего origin в вашей сессии. Настоящий тип указан в метаданных сообщения рядом с файлом; сама же загрузка намеренно анонимна и никогда не отображается в браузере.

Сколько вложений может быть в одном сообщении?

Двадцать. Если частей больше, сохраняются только первые двадцать. На практике предел размера наступает намного раньше, чем предел количества.

Можно ли скачать вложение через API?

Да. У каждого вложения в ответе с сообщением уже есть готовый URL, и получить его — это обычный GET с почтовым ящиком в качестве параметра. На публичных доменах ключ не нужен.

Сколько хранятся вложения?

Столько же, сколько их сообщение: 5 дней с момента получения, затем удаляются вместе с ним. Если вы удалите сообщение сами, файл исчезнет сразу же.

Моё вложение так и не пришло — почему?

Либо сообщение превышало 5 MB и было отклонено ещё на входе — тогда у отправителя есть письмо о недоставке с объяснением, либо у части не было ни имени файла, ни пометки вложения, и она была прочитана как часть текста письма. Всё остальное разобрано в руководстве о письмах, которые не приходят.

Можно ли отправить файл с одноразового адреса?

Нет. Этот сервис только принимает почту и не имеет вообще никакого эндпоинта для отправки — именно это не даёт неавторизованному ящику превратиться в удобный способ рассылать файлы незнакомцам.

Читать дальше

Попробуйте, пока свежо

Адрес — это один клик, без аккаунта и карты. Всё из этого руководства сразу заработает на нём.

С возвращением

Ваши ящики и ваши домены в одном месте.