Сколько можно переслать по электронной почте яндекс. Как пересылать большие файлы с помощью электронной почты

ТЕХНИЧЕСКИЕ ПАРАМЕТРЫ

АДРЕС САЙТА: http://mail.yandex.ru/

ПОЧТОВЫЕ ДОМЕНЫ: yandex.ru

ОБЪЕМ ПОЧТОВОГО ЯЩИКА: 20 Мб.

МАКСИМАЛЬНЫЙ РАЗМЕР ПИСЬМА: 5 Мб.

СБОР ПОЧТЫ С ДРУГИХ АДРЕСОВ: есть.

ПЕРЕНАПРАВЛЕНИЕ ПОЧТЫ: есть (при помощи фильтров).

ПОЧТА НА ЛОКАЛЬНОМ КОМПЬЮТЕРЕ: есть.

АВТООТВЕТЧИК: есть (при помощи фильтров).

АНТИВИРУС/ АНТИСПАМ: есть (DrWeb http://www.drweb.ru)/ есть, черный список, белый список, мониторинг зараженности приходящих писем вирусами и спамерской активности.

РАЗМЕР СТРАНИЦЫ (СТАРТОВАЯ/ЧТЕНИЯ/СОСТАВЛЕНИЯ ПИСЬМА): 15+6/20/20 кб.

АДРЕСНАЯ КНИГА, ОРГАНАЙЗЕР: адресная книга, возможность импортирования данных из всех современных почтовых программ.

ПОЧТОВЫЕ ФИЛЬТРЫ: есть.

НЕАКТИВНОЕ ВРЕМЯ ЖИЗНИ: 4 месяца.

ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ: проверка русской и английской орфографии, полнотекстовый поиск по почтовому ящику, возможность создать свой сайт в домене narod.ru для некоммерческого использования неограниченного объема с готовыми шаблонами дизайна, возможность создавать почтовые алиасы (см. разъяснение в графе «Потребительский анализ»), сервис доступа к почте по протоколу WAP (в тестовом режиме), перекодировщик входящей почты между всеми известными русскими кодировками и транслит.


ПОТРЕБИТЕЛЬСКИЙ АНАЛИЗ

Yandex (Яндекс) известен русскоязычным пользователям Интернета главным образом благодаря своей качественной поисковой системе. Как и в двух предыдущих случаях, почтовый ящик с именем Potrebitel оказался занят.

Зарегистрировавшись на Яндексе, вы получаете не только почтовый адрес, но и сайт ваше_имя.narod.ru неограниченного размера с готовыми вариантами дизайна, гостевой книгой, форумом, чатом, счетчиками и статистикой посещений.

Однако такую страничку можно использовать только для некоммерческого использования и нельзя помещать на нее объекты, закрытые паролем. Кроме того, в пункте 7.1 пользовательского соглашения сказано, что «Яндекс оставляет за собой право взять и оставить под своим управлением любой субдомен, входящий в домен, принадлежащий Яндексу (www.narod.ru, www.zakladki.ru и т.д.). Яндекс имеет право по своему усмотрению и без предварительного предупреждения использовать полномочия «домена верхнего уровня» в отношении всех субдоменов, и в этом случае вы должны будете передать свой субдомен под управление Яндекса» что, согласитесь, не очень приятно. Правда, ваша пользовательская страничка с личной информацией о вас вряд ли заинтересует Яндекс.

Ваш сайт, а вместе с ним и все дополнительные сервисы (гостевая книга, персональный форум и чат, сообщества и др.), будут удалены, если в течение 4 месяцев на сайте не было ни одного посещения и ни разу не обновлялся контент. Также ваш почтовый ящик удаляется, если вы не пользовались им более 4 месяцев.

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

На почте Яндекса все письма проходят три уровня фильтрации. На первом этапе отбрасывается явный спам - сообщения, приходящие от неадминистрируемых (взломанных, открытых) почтовых серверов либо пойманные в спамовые ловушки. Затем каждое письмо проверяется антивирусной программой DrWeb. При этом зараженные письма, не содержащие ничего, кроме самого вируса, отбрасываются, а зараженные письма с текстом помечаются специальным значком с изображением паучка. Последним работает фильтр, помещающий в папку «Рассылки» подозрительно похожие письма, которые были одновременно разосланы большому числу пользователей. Все сообщения, попавшие в нее, могут быть удалены через две недели. Это означает, что важные письма не будут потеряны и ваш почтовый ящик не переполнится из-за того, что адрес попал к спамерам или кто-то подписал вас на ненужную рассылку.

Фильтрация рассылок действует как еще один фильтр после всех, установленных владельцем ящика. Если в папку «Рассылки» попадает почта, присылаемая с какого-то особо интересного для вас адреса, вы можете исключить этот адрес из фильтрации, занеся адрес в «белый список». Папка «Рассылка» существует по умолчанию. Чтобы сохранить какие-либо письма, в нее попавшие, переложите их в любую другую папку. Если вы хотите самостоятельно разбирать свою почту, вы можете отменить использование этой папки. Фильтрация рассылок работает только в веб-интерфейсе. Если вы пользуетесь почтой Яндекса, скачивая почту на свой локальный компьютер, письма из папки «Рассылки» будут скачиваться вместе с письмами из папки «Входящие».

Благодаря большой базе пользователей антиспамовская база Яндекса является достаточно полной и оперативно отражает изменения ситуации. На сайте Яндекса по адресу http://mail.yandex.ru/monitoring/ производится постоянный мониторинг хода борьбы со спамом. Можно посмотреть последнюю статистику или месячные графики, что поможет сделать выводы об общем состоянии службы электронной почты, по крайней мере в российской части Интернета. Согласно этой статистике 80-90% писем приходится отсеивать.

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

На Яндексе предусмотрена возможность создавать алиасы. Алиас, или псевдоним, это другое название вашего почтового ящика. Ящик имеет алиасы в доменах yandex.ru и narod.ru. Почта, посланная на любой из этих адресов, придет в один и тот же ящик. При отправке вы можете выбрать, с какого адреса вы хотите отправить письмо (то есть какой адрес увидит получатель).

Почта Яндекса, пожалуй, единственная в Рунете среди бесплатных почтовых систем, где вы можете в разделе «Настройки» полностью отключить показ рекламы и заголовки новостей, а также рекламные добавки в конце каждого письма. Размер загружаемых страничек тогда получается очень компактным, и возрастает общая скорость работы. В технических характеристиках приведены данные именно для этого случая. Если вы не отключили эту возможность, то объем загружаемых страничек возрастает примерно в 2 раза.

Система фильтров также довольно удобна и позволяет настроить желаемое действие. Предусмотрена возможность связывать фильтры в цепочки и менять порядок их выполнения. В качестве действия фильтров вы можете поместить письмо в определенную папку (установленную по умолчанию или созданную вами) или переслать по определенному адресу. Интересной особенностью является возможность для писем, попадающих под действие определенного фильтра, отправить ответ, что такой почтовый ящик не существует.

У Яндекса есть чрезвычайно удобная возможность импортировать информацию в адресную книгу из таких почтовых программ, как Outlook, Outlook Express, The Bat или в формате cvs (список, разделенный запятой).

После выхода из веб-интерфейса работы с почтой вас автоматически перенаправят на стартовую страницу http://www.yandex.ru/

РЕЗЮМЕ

ДОСТОИНСТВА: возможность вместе с почтовым ящиком завести личную веб-страницу, проверка писем на наличие вирусов, развитая система борьбы со спамом, возможность импортировать базу своих контактов в адресную книгу, небольшой объем страничек, хорошая скорость работы.

НЕДОСТАТКИ: возможность потерять свой почтовый адрес и веб-страничку при отсутствии активности более 4 месяцев.

ОБЩАЯ ОЦЕНКА: очень качественный почтовый сервис с хорошей системой борьбы со спамом. Пользуется заслуженной популярностью в Рунете. Сервис покрывает требования большинства пользователей, и если вы пользуетесь своим почтовым ящиком без перерывов, превышающих 4 месяца, то выбор Yandex будет хорошим.

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

Если вы используете Gmail или Outlook.com, то сервис вашей электронной почты автоматически протянет вам руку помощи и предложит альтернативы. Если вы используете на ПК клиент электронной почты или другую службу, вам может потребоваться узнать об этих тонкостях самостоятельно.

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

Теоретически, нет никаких ограничений на объем данных, которые вы можете прикрепить к электронной почте. В стандартах E-mail не определяется какой-либо предельный объем. На практике большинство почтовых серверов навязывают собственные ограничения на объем данных.

В общем, когда к сообщению электронной почты присоединены файлы, Вы можете быть уверены, что с вложениями объемом до 10 Мб все будет в порядке. Некоторые почтовые серверы могут иметь меньшие ограничения, но, как правило, 10 Мб - это стандарт.

Gmail позволяет пересылать до 25 МБ с одним электронным письмом, но это гарантированно работает только, если вы пишите другому пользователю Gmail. Как только письмо оставляет серверы Gmail, оно может быть отклонено другим почтовым сервером. Многие серверы сконфигурированы таким образом, чтобы не принимать вложения объемом больше 10 Мб.

Не так просто предсказать - дойдет ваше письмо или нет, если ориентироваться только на ограничения сервера-получателя, поскольку в реале ваше письмо с вложениями на пути к адресату может проходить через другие серверы с их собственными ограничениями. Вы должны также иметь в виду, что вложения электронной почты, как правило, MIME кодированные, а это увеличивает их размер примерно на 33 %. Так, 10 МБ файлы на жестком диске станут размером около 13 Мб данных при подключении к электронной почте.

Используйте сервисы Cloud Storage - хранение в "облаке"

Наиболее простым вариантом будет хранение файла, или файлов, доступ к которым вы хотите разделить с кем-то, в облачном сервисе хранения данных, например, в Dropbox, Google Drive или SkyDrive. Разместив их там, можно сделать их общими с кем-то (разделить доступ к ним) и сообщить этому человеку, что он может получать данные из "облака" - загружать прямо на его компьютер. Пользователь сможет, нажав на ссылку, без проблем загрузить файл непосредственно на свой компьютер.

Спонсором новости выступает компания CT Consulting которая занимется разработкой и внедрением CRM систем. Специалисты компании помогут подобрать оптимальную для Вашего бизнеса модель ЦРМ-системы. Более про облачные вычисления и применение облачных технологий вы можете прочитать на оффициальном сайте.


Если вы используете что-то вроде комплекса Dropbox, вы можете обмениваться файлами с сайта облачного сервиса хранения. Например, щелкните правой кнопкой мыши по имени файла на сайте Dropbox и выберите "Share link", если вы используете Dropbox.


Именно к этому варианту подталкивают нас многие поставщики услуг электронной почты. Когда вы попытаетесь приложить большие файлы к своему письму в Gmail или Outlook.com, вам будет предложено загрузить его сначала в Google Drive или SkyDrive.


Создание и передача составных архивов

Если вы ищете более традиционный, "сделай сам" метод, то вы можете выбрать разбивку файла на несколько меньших частей. Например, если у вас есть файл размером 50 МБ, который вы хотите послать по электронной почте, вы можете использовать программу сжатия файлов, например, 7-Zip, для создания архива, содержащего этот файл, расщепленный на пять порций по 10 Мб каждая.


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

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

Используйте службу пересылки больших файлов

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

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


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

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

Наша сегодняшняя статья призвана помочь начинающим чайникам разобраться в лабиринтах электронных почтовых служб, коих в интернете существует немало. Мы рассмотрим достаточно тривиальный, но волнующих многих вопрос – как прикрепить файл к исходящему письму в сервисах Gmail, Yandex, Rambler и Mail.Ru.

При создании нового письма в почтовой службе Gmail от компании Google, достаточно нажать на ссылку «Прикрепить файл», а затем найти на своем компьютере нужный файл или архив и дважды щелкнуть по нему мышью.

Имейте в виду, что в e-mail можно вложить только файлы или архивы. Это правило относится не только к Gmail, но и к другим почтовым сервисам. Прикрепить папку к исходящему письму нельзя! Если требуется отправить несколько файлов, их нужно упаковать в один архив, например, формата RAR или ZIP, который затем прикрепить к письму. Также можно приложить каждый файл из папки по отдельности.

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


Чтобы отменить прикрепление файла к письму достаточно снять галочку напротив него.

К письмам Gmail можно приложить сколько угодно файлов. Следует лишь помнить, что общий размер письма вместе со всеми прикрепленными файлами не должен превышать 25 Мб.
Также учитывайте, что пересылка исполняемых файлов, например, в формате EXE, сервисом Gmail запрещена. При этом упаковка файлов в архив также не помогает. Однако из любой ситуации есть выход: можно изменить расширение файла, например, с EXE на EX, и сообщить получателю письма, что после сохранения на компьютере файл следует переименовать обратно.

Почта на Yandex

Прикреплять файлы к письмам в почтовой службе Яндекса так же просто. Достаточно нажать на кнопку «Прикрепить файл…» и выбрать нужный файл или архив на компьютере, а затем дважды щелкнуть по нему мышью

К письму можно приложить несколько файлов, каждый раз нажимая кнопку «Прикрепить файл…». При этом следует помнить, что максимальный размер исходящего письма со всеми присоединенными файлами не должен превышать 22 Мб. В противном случае лишние файлы придется удалить.

Но сделать это очень просто – щелкните по иконке с красным крестиком напротив не нужного файла, чтобы открепить его от письма.

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

При необходимости, вы можете самостоятельно загрузить любой файл на Народ: нажмите на стрелочку возле кнопки «Прикрепить файл» и выберите данный способ пересылки файла. Максимальный размер файла, загружаемого на Яндекс.Народ, составляет 5 Гб.

Почта на Rambler

Почтовый сервис Рамблера предоставляет похожий стандартный для прикрепления файлов к исходящим письмам: вам нужно будет нажать кнопку «Прикрепить файлы», найти и выбрать нужные файлы на диске компьютера.

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

Mail.Ru

И, наконец, последний почтовый сервис, который мы сегодня рассмотрим – почтовая служба Mail.Ru. Она, как и Яндекс, позволяет отправлять файлы двумя способами – вложить непосредственно в письмо либо загрузить на Файлы@Mail.Ru. В последнем случае получателю вашего сообщения будет отправлена ссылка для скачивания файла.

Для того чтобы присоединить к письму файл щелкните по кнопке «Прикрепить файлы», а затем выберите на компьютере нужные файлы. Вы можете прикрепить несколько файлов и архивов к письму, нажав кнопку «Прикрепить еще».

Общий размер всех присоединенных к письму файлов не должен превышать 22 Мб. Если же подготовленные к отправке файлы имеют размер более 30 Мб, то их следует загрузить на сервер Файлы@Mail.Ru. Для этого нажмите ссылку «Изменить» и выберите данный способ присоединения файлов – «Загружать все файлы на Файлы@Mail.Ru и присоединять к письму в виде ссылок». В таком случае адресат получит письмо с автоматическим сформированными ссылками для скачивания файлов с сервера.

К каждому исходящему письму может быть присоединено не более 20 файлов. При этом размер каждого файла не должен превышать 1Гб.

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

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

Мы стремимся к тому, чтобы все части Яндекс.Почты одинаково хорошо работали у всех пользователей. Сегодня мы расскажем вам о том, как и зачем полностью переписали блок добавления аттачей. В этой статье - про отказ от флеша, поддержку возможностей современных браузеров и, как результат, увеличение скорости и надёжности загрузки файлов.

Проблема

Раньше всю аудиторию Яндекс.Почты мы разделяли на пользователей с флешем и без.

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

А вот с пользователями без флеша (8-10% от дневной аудитории) было сложнее. Мы предлагали им загружать файлы через обычную форму с /> . Файлы из неё отправлялись через iframe вместе с содержимым самого письма, и это занимало много времени. Нажав кнопку «Отправить», пользователь долго ждал, пока загрузятся файлы.

И если небольшие файлы (до 25 Мб) не доставляли особых сложностей, то большие порождали новую проблему: если размер файла превышал допустимый лимит, приходилось использовать сервис Яндекс.Народ, а затем и Яндекс.Диск (с новыми аттачами мы поменяли и хранилище файлов)*.

* Лимит на размер отправляемых файлов объясняется не столько технологическими ограничениями в Яндекс.Почте, сколько проблемами у сторонних почтовых серверов. Далеко не все они готовы принимать и хранить письма больших размеров. Чтобы такие письма доходили до адресата, мы сохраняем вложения размером больше 25 Мб на Яндекс.Диск и добавляем в письмо ссылки.

Для определения размера файлов у пользователей без флеша мы подняли внутренний сервис, который работал так: клиент отправлял файл POST запросом на специальный url, сервер читал заголовок Content-Length запроса и закрывал соединение.

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

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

  1. это сторонний плагин, который должен быть установлен на компьютере пользователя, причём он может быть заблокирован другими плагинами или расширениями;
  2. есть проблемы с SSL-соединениями и безопасностью;
  3. сложно решать проблемы и ошибки при загрузке файлов.
А у обычного /> как минимум нет мультиаттачинга.

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

Возможность

В течение последнего года все браузеры научились самостоятельно (без подключения сторонних плагинов) организовывать работу с файлами. Поближе познакомиться со всеми их современными возможностями можно в статье на сайте Mozilla Developer Network .

Вот новые возможности, которые появились в ходе развития HTML5:
- атрибут multiple в теге input (начиная с Chrome 4, Firefox 3.6, IE 10, Opera 11, Safari 5);
- Drag and Drop API (Chrome 4, Firefox 3.5, IE 5.5, Opera 12, Safari 3);
- FormData (Chrome 7, Firefox 4, IE 10, Opera 12, Safari 5);
- XMLHttpRequest level 2 + CORS + progress events (Chrome 7, Firefox 4, IE 10, Opera 12, Safari 5).

Теоретически мы могли внедрить их ещё год-полтора назад, но изменения коснулись бы только Chrome и Firefox. Эти браузеры имели в сумме хорошую долю, но не были монополистами. Опера и IE к тому моменту ещё не поддерживали эти возможности. А значит, половину аудитории все равно пришлось бы оставить на флеше.

Поэтому мы ждали. И перед приближением июньского релиза Оперы 12, в котором стало возможно внедрение необходимых технологий, приступили к разработке.

Что касается IE10, то его выход ожидается в ближайшее время.

Реализация

Как уже было сказано выше, мы должны разделять файлы на большие и маленькие. Например, пользователь пытается прикрепить к письму десять файлов, девять из которых в сумме укладываются в допустимый лимит, а десятый в два раза больше всех остальных. Без возможности загружать файлы по отдельности все десять файлов ушли бы на Яндекс.Диск. Однако это не кажется разумным - ведь лучше отправить на Диск только один файл, последний, а все остальные загрузить в письмо. Так мы приняли решение загружать каждый файл отдельно.

Обычно файлы загружаются через стандартную форму:


Допустим, мы отправляем форму в скрытый iframe. В этом случае браузер прочитает все выбранные файлы из input (даже если их много) и отправит POST-запросом в /upload. Но тут файлы грузятся все вместе, а нам это не подходит.

Посмотрим, как нам поможет AJAX. Чтобы отправлять файлы через AJAX, нам нужна поддержка FormData. Без неё нельзя прочитать файлы в input и добавить их в запрос. Попробуем так:
var formElement = document.getElementById("myFormElement"); var xhr = new XMLHttpRequest(); xhr.open("POST", "/upload", true); xhr.send(new FormData(formElement));
Но и в этом случае все файлы всё равно отправятся из input. Получается, что надо брать отдельно каждый файл и определять, куда его загрузить (на Диск или в письмо), то есть обрабатывать независимо.
for (var i = 0, j = input.files.length; i < j; i++) { upload(input.files[i]); } function upload(file) { var url = ""; if (file.size > MESSAGE_LIMIT) { url = "uploader.disk.yandex.ru"; } else { url = "uploader.mail.yandex.ru"; } var data = new FormData(); data.append("attachment", file); var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.send(data); }
Загружать файлы по отдельности удобно еще и тем, что ошибка в загрузке одного файла не мешает другим.

Мы поддерживаем все популярные браузеры, однако не все из них поддерживают современные технологии. Согласно политике feature detection, мы добавили четыре проверки на включение новых возможностей:

  1. Нет поддержки FormData → используем iframe.
  2. Есть поддержка FormData → используем AJAX.
  3. Есть поддержка Drag-n-Drop и FormData → включаем возможности перетаскивать файлы из файлового менеджера. Например, в IE есть первое, но нет второго, поэтому отправить перетащенные файлы мы никак не можем.
  4. Есть поддержка multiple input и FormData → включаем возможность выбирать много файлов. Например, в Opera 11.6 есть multiple input, но нет FormData, соответственно, мы не можем отправлять файлы по одному.
Третья и четвертая проверки вылились в тесты для Modernizr :
Modernizr .addTest("draganddrop-files", function() { return !!(Modernizr["draganddrop"] && window["FormData"] && window["FileReader"]); }) .addTest("input-multiple", function() { return !!(Modernizr["input"]["multiple"] && window["FormData"] && window["FileReader"]); });
В Safari 5.1 для Windows сразу нашелся баг: при выборе нескольких файлов все они оказывались нулевого размера и пустыми отсылались на сервер. В этом браузере пришлось все новые возможности отключить.

В дополнение к AJAX-транспорту мы начали использовать Progress events для отрисовки красивого прогресс-бара.

Мы его используем примерно так:
var xhr = new XMLHttpRequest(); xhr.open("POST", "/upload", true); if (xhr.upload) { xhr.upload.addEventListener("progress", processProgressEvent, false); } else { drawCommonProgressbar() }
Заметим, что при загрузке данных на сервер обработчик событий надо вешать на свойство xhr.upload, а при загрузке данных с сервера - на сам xhr.

В браузерах, поддерживающих File API, размер файлов можно узнать из объекта File. В старых версиях спецификаций свойство называлось fileSize, а теперь просто size.

В браузерах без поддержки File API (а таких все меньше и меньше), мы деградируем до использования внутреннего сервиса определения размеров файлов.

Кстати, с переходом на новые технологии мы смогли реализовать и свою давнюю идею: drag-and-drop загрузку аттачей. Drag-and-drop API - очень общее. Оно касается не только файлов, а любого перетаскивания объектов на странице. Соответственно, в область для файлов можно переместить абсолютно всё.

Нам пришлось решать и эту проблему: как оставить в почте только возможность загрузки файлов?

Многое делает сам браузер, но не всё. В событии drop в свойстве event.dataTransfer.files, конечно же, будут только объекты из файловой системы. Но этими объектами могут быть как папки, так и файлы. Чтобы запретить загрузку папок (не все браузеры умеют грузить файлы из папок - первым стал Chrome 21 , а Firefox отказался это делать с принципе) мы используем FileReader. Этот API позволяет прочитать файл с диска и работать с ним в JavaScript. И если объект читается, значит, это файл. Небольшую функцию, реализующую этот метод, можно посмотреть на GitHub .
function isRegularFile(file, callback) { // если размер больше, чем 4кб, то это точно файл if (file.size > 4096) { callback(true); return; } if (!window["FileReader"]) { // невозможно проверить callback(null); } else { try { var reader = new FileReader(); reader.onerror = function() { reader.onloadend = reader.onprogress = reader.onerror = null; // Chrome (Linux/Win), Firefox (Linux/Mac), Opera 12.01 (Linux/Mac/Win) callback(false); }; reader.onloadend = reader.onprogress = function() { reader.onloadend = reader.onprogress = reader.onerror = null; // Нельзя делать abort после окончания чтения файла if (e.type != "loadend") { // прерываем чтение после первого события reader.abort(); } callback(true); }; reader.readAsDataURL(file); } catch(e) { // Firefox/Win callback(false); } } }
Однако такая проверка нужна не для всех браузеров - Chrome для Mac и IE10 для Windows 8 сами отсеивают папки.

К FileReader надо относиться с очень большой осторожностью, особенно в Chrome, который ведет себя не стабильно: до 21-й версии наблюдались падения вкладки при чтении файла в несколько сотен мегабайт, а в 21-й стал падать и на маленьких файлах. Нам даже пришлось отказаться от использования FileReader для этого браузера.

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

Для решения этой проблемы в обработчиках dragover и dragenter мы сделали следующую проверку:
var types = event.dataTransfer.types; if (types) { for (var i = 0, j = types.length; i < j; i++) { if (types[i] == "Files") { showDragArea(); return false; } } }
Тип «Files» означает, что в перетаскиваемых объектах есть настоящие файлы, а «return false» - начало процесса drag and drop . Эта проверка работает не во всех браузерах, но немного улучшает интерфейс.

Еще оказалось, что события dragenter, dragover и dragleave, если их повесить на document, подвержены тем же проблемам, что и mouseover, mouseout: они бросаются при каждом перемещении между DOM-нодами.

Проблему удалось решить тайм-аутом на обработку этих событий.
var processTimer = null; $(document).on({ "dragover dragenter": function() { window.clearTimeout(processTimer); showDragArea(); }. "dragleave": function() { processTimer = window.setTimeout(function() { hideDragArea(); }, 50); } });

Кроссдоменные запросы

Для загрузки на Диск понадобилась поддержка кроссдоменных запросов, которую можно проверить следующим образом:
window["XMLHttpRequest"] && "withCredentials" in new XMLHttpRequest()
Политика определения транспорта остаётся такой же.

Для кроссдоменных запросов надо делать правильную обработку «preflight» OPTIONS-запросов. В этих запросах браузер спрашивает удалённый сервер, можно ли к нему обращаться с текущего домена. Выглядят они примерно так:
OPTIONS /upload HTTP/1.1 Host: disk-storage42.mail.yandex.net Origin: https://mail.yandex.ru Access-Control-Request-Method: POST Access-Control-Request-Headers: origin, content-type
На это сервер должен ответить разрешающими заголовками, например, так:
Access-Control-Allow-Origin: https://mail.yandex.ru Allow: POST, PUT, TRACE, OPTIONS
Такие запросы происходят не всегда, но о них надо помнить и проверять, что они обрабатываются правильно.

Если браузер не получил разрешение на кроссдоменный запрос, то запрос завершится со status=0 (это можно обработать в onreadystatechange). Также это может означать, что запрос был прерван пользователем или сервером. В любом случае стоит сделать fallback на iframe-загрузку.

Сам процесс загрузки файлов на Яндекс.Диск выглядит так: сначала делается запрос, в котором бекенд Диска возвращает нам url, по которому надо загружать файл в хранилище, а также oid (operation id), по которому можно запросить статус операции. Загрузка - это не синхронная операция, и окончание отправки файла с клиента не означает, что файл готов на сервере, его надо сохранить в правильном месте, проверить антивирусами, записать в базу.

Если есть поддержка progress events, то статус операции не запрашивается до тех пор, пока не закончится загрузка файла, а прогресс-бар рисуется средствами браузера. Это позволяет существенно снизить нагрузку на сервер и рисовать более плавный прогресс.

Если progress events не поддерживается, мы запрашиваем статус закачки через каждые одну-две секунды, пока сервер не скажет, что файл готов.

Успех

На наш взгляд, игра стоила свеч. Текущее решение нас полностью устраивает, в том числе потому, что мы решили целый ряд проблем, не лишаясь при этом преимуществ, которые есть у флеша:
  • устранили «подводные стуки» - проблемы пользователей с отправкой писем и загрузкой аттачей;
  • отказались от использования флеша;
  • субъективно - уменьшили время, которое пользователи тратили на отправку писем с вложениями;
  • в два раза увеличили количество загрузок файлов на Диск по сравнению с Народом.

Метки: Добавить метки