Загрузка файла на удаленный сервер из фонового скрипта в Thunderbird

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

  1. При нажатии на значок расширения отображается всплывающее окно для выбора одного из вариантов «Читать все», «Читать выбранное» и «Читать непрочитанное».
  2. Когда я выбираю электронное письмо, содержащее вложение, и выбираю опцию «Прочитать выбранное», запускается прослушиватель для события «Прочитать выбранное onclick».
  3. Слушатель onclick отправляет сообщение фоновому сценарию для обработки загрузки.

Вот код, который у меня есть до сих пор:

всплывающее окно.js

async function readSelected() {
  // this function is invoked by the listener
  const msgList = await browser.mailTabs.getSelectedMessages();
  if(msgList.messages) {
     await browser.runtime.sendMessage({
        caller: 'readSelected',
        messages: msgList.messages
     });
  }
}

фон.js

browser.runtime.onMessage.addListener((req, sender, res) => {
  // messages is an Array of MessageHeader objects
  const { caller, accounts, all, messages } = req;
  // ... code for handling other cases
  console.log('Reading selected');
  console.log(messages);
  const ids = [];
  for(const msg of messages) {
      ids.push(msg.id);
  }
  // maps all ids to promises that resolves to MessagePart objects
  Promise.all(ids.map(id => browser.messages.getFull(id)))
    .then(messages => {
        console.log(messages);
    }).catch(e => console.error(e));
});

В консоли для background.js я вижу, что каждый объект MessagePart имеет массив parts, который, в свою очередь, является массивом объектов MessagePart. Я вижу название вложения (в моем случае выбранное сообщение имеет файл DOCX в качестве вложения). Вопрос в том, как мне получить файл? Мне нужны данные двоичного файла, потому что мне нужно преобразовать их в строку Base64, прежде чем я смогу загрузить их на удаленный сервер. Я просмотрел следующие сообщения SO: post1 и post2, но я не уверен, как это работает, поскольку оба сообщения предлагают использовать nsIFile интерфейс, для которого требуется URI. Для предоставленных частей такого URI нет.

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


person Abrar Hossain    schedule 26.10.2020    source источник


Ответы (1)


Я не верю, что это возможно на момент написания этой статьи. Что ж, у вас все еще есть messages.getRaw(), который возвращает вам полный источник сообщения в обещании, включая вложения, но вам придется снова анализировать сообщение, что не так просто сделать.

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

Примечание. Другие вопросы, на которые вы ссылаетесь, относятся к старым типам надстроек, не основанным на WebExtensions API. Хотя это не рекомендуется для современных надстроек (поскольку устаревшие компоненты могут выйти из строя при любом обновлении), может быть возможен доступ к устаревшим API через так называемые эксперименты, но у меня слишком мало опыта с ними, чтобы сказать вам, помогут ли они вам делай что хочешь.

person Qeole    schedule 24.11.2020
comment
Спасибо за ваш ответ. Я как бы пришел к такому же выводу около трех недель назад. Я никак не мог получить содержимое вложения. Позже я выбрал простое приложение с графическим интерфейсом, которое я разработал как элементарный почтовый клиент, чтобы выполнить свою работу. - person Abrar Hossain; 24.11.2020