Извлечение электронной почты Android в .eml

Нравится (0)
Сохранить
Твитнуть
2,50 тыс. просмотров

Присоединяйтесь к DZone сообщество и получите полный опыт участников.

Присоединяйтесь бесплатно

иногда экосистеме Android немного не хватает поддержки инструментов; например, мне нужно было извлечь набор отправленных элементов из почтового ящика pop3 — стандартный почтовый клиент позволяет вам выполнять только 3 действия: удалить, отметить как непрочитанные или избранные.

вооруженный android sdk , несколько запросов sql и отличный скрипт мы увидим, как можно восстановить электронную почту в файлы .eml rfc822.

хранилище электронной почты

стандартный com.android. почтовый клиент хранит заголовки сообщений и их тела в двух базах данных sqlite, а поставщик вложений хранит вложения на диске.

исходный код доступен по адресу https://android.googlesource.com/platform/packages/apps /email — в данном случае это был телефон Samsung с версией 4.1.2, поэтому я проверил ветку jb-mr0-release , чтобы проверить код, когда это необходимо.

резервное копирование с помощью adb

adb — это мост отладки Android, инструмент отладки, который является частью инструментов платформы Android SDK. выполнение ‘ adb usb ‘ (re) запускает демон adbd, прослушивающий USB-соединения.

следующим шагом является выбор параметров разработчика в системном разделе настроек list (рисунок 1), а затем включите отладку по USB на устройстве (рисунок 2).

рисунок 1 — системные настройки

рисунок 2 — параметры разработчика

, затем подключитесь к устройству с помощью кабеля USB и выполните ‘ adb backup -f mybackup.ab -all ‘ (вы также можете будьте более избирательны с нужным пакетом, например ‘ adb backup -f mybackup.ab com.android.email ‘). adb предложит вам разблокировать телефон и разрешить продолжение резервного копирования.

раздувание резервной копии

резервная копия Android — это сжатый tar-файл zlib — благодаря http: //nelenkov.blogspot.jp/2012/06/unpacking-android-backups.html для подсказки, что его можно повторно надуть с помощью следующей команды:
dd if = mybackup.ab bs = 24 skip = 1 | openssl zlib -d> mybackup.tar

обратите внимание, что установка openssl , которую я установил на osx, не была скомпилирована с Поддержка zlib , поэтому я запустил ее через vagrant vm ubuntu, чтобы раздуть tar-файл.

проверка резервной копии

распаковка tar-файла даст вам структуру папок, как показано на рисунке 3; в этом случае базы данных sqlite находятся в db , а вложения с фотографиями, снятыми с телефона, находятся в f .

рисунок 3 — расширенный tar

изучение баз данных

sqlitebrowser — хороший инструмент для просмотра базы данных sqlite и функций на следующих снимках экрана.

текущий скрипт ограничивает обрабатываемые сообщения одним почтовым ящиком для одной учетной записи. для определения ключа почтового ящика требуется найти целевую учетную запись из таблицы account (рисунок 4), а затем изолировать желаемый почтовый ящик для этой учетной записи в таблица почтовых ящиков (рисунок 5).

рисунок 4 — структура таблицы аккаунтов

рисунок 5 — структура таблицы почтовых ящиков

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

выберите a.displayname как имя учетной записи, m._id как ключ почтового ящика, m.displayname как имя почтового ящика
из учетной записи a, почтовый ящик m
, где m.accountkey = a._id

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

извлечение электронной почты

удобство со спецификациями rfc822 и javamai l (я создал расширение imap для alfresco в 2006 году), я решил, что будет проще восстановить mimemessage с помощью sql & groovy, чем пытаться адаптировать исходный код Android для работы с устройства или создать собственное приложение для запуска в эмуляторе.

недостатки

в качестве первого варианта, который был достаточно хорош для моих целей, есть несколько недостатков:
1. по умолчанию установлено поле отправителя, а не преобразование значения message.fromlist и использование метода addfrom
2 .адреса используют только адрес, а не метку
3. Обработка тела использует только обычный текст, а не альтернативные составные части
4. body.textreply отделяется от body.textcontent с разделительной линией из 25 тире; он не пытается восстановить информацию заголовка предыдущего сообщения в потоке
5. скрипт не обрабатывает вложения — это было сознательное решение, поскольку пока фотографии с камеры были в com.android .email/f , других «сырых» вложений не было в com.android.email/1. db_att/ в соответствии с javadoc класса attachmentprovider

в качестве начальной подсказки, чтобы восстановить вложения, вам нужно будет использовать mimemultipart , создайте объекты mimebodypart , начиная с запроса типа:

 "" "выберите имя файла, тип mime, размер, содержание, контент, кодировку из  attachmentwhere messagekey = $ {msgkey} "" "

адреса

скрипт предоставляет один служебный метод для преобразования списка, состоящего из строк, в котором находятся записи разделены символом soh (ascii 1), а адреса электронной почты и их соответствующее отображаемое имя разделяются символом stx (ascii 2).

обработка состоит из перебора строк результирующего набора таблицы сообщений, для каждой строки тело сообщения получается из отдельной базы данных sqlite, а затем создается javamail mimemessage и вывод в файл.

устранение неполадок

сценарий не может вызвать потеря данных на вашем устройстве, поскольку оно работает с резервной копией. если вы хотите сначала поэкспериментировать, вы можете установить ограничение (например, limit 10 ) для первого запроса select , чтобы уменьшить количество сообщений, которые он извлекает .
также простой способ просмотра вывода, например отличная консоль должна использовать msg.writeto (system.out) вместо создания файла .eml.

получить сценарий

применяются обычные заявления об отказе от ответственности, что скрипт не имеет гарантии, поддержки и т. д. — получите его с github: https://gist.github.com/rbramley/65261127dfb857b03bb6

Темы:

Опубликовано в DZone с разрешения Робина Брэмли, DZone MVB. См. Оригинальную статью здесь.

Мнения, выраженные участниками DZone, являются их собственными.


Комментарии

Ресурсы для партнеров Java

Оцените статью
Botgadget.ru
Добавить комментарий